FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/gmm/gmm_em.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/gmm/gmm_em.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,520 @@ + + +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| 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 defines the engineering mode (EM) device driver for the +| G23 protocol stack. This driver is used to control all engineering +| mode related functions. ++----------------------------------------------------------------------------- +*/ + +#ifndef GMM_EM_C +#define GMM_EM_C + +#define ENTITY_GMM + +/*--------- 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 "custom.h" /* to get EM for Simulation Stack compiled*/ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "gmm.h" /* to get the global entity definitions */ + +#include <string.h> /* to get memcpy , memset*/ + +#include "gmm_em.h" /*to get EM spezific definitions*/ + +#ifdef FF_EM_MODE +GLOBAL UBYTE em_gmm_event_buffer[EM_GMM_BUFFER_SIZE]; +GLOBAL UBYTE em_gmm_buffer_write; + +/* Event tracing flags for EM */ +GLOBAL BOOL gmm_v[EM_MAX_GMM_EVENTS]; + +static UBYTE em_gmm_trace_occured; + + +/*----------Transfer Functions from and to GRR/GRLC -------*/ +/*This functions handle Engineering Mode Primitives that are sent from ACI + to GRR or GRLC (and the other way around). Because they cannot be sent directly, + they have to be passed through GMM + */ +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_sc_gprs_info_req ++------------------------------------------------------------------------------ +| Description : The function em_gmm_sc_gprs_info_req() is used to forward a +| request from ACI to GRR. +| +| Parameters : EM_SC_GPRS_INFO_REQ +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_gmm_sc_gprs_info_req ( T_EM_SC_GPRS_INFO_REQ *em_sc_gprs_info_req) +{ + GMM_TRACE_FUNCTION( "em_gmm_sc_gprs_info_req" ); + /* NO PFREE */ + PSEND ( hCommGRR, em_sc_gprs_info_req ); + +} /* em_gmm_sc_gprs_info_req () */ + +/* ++------------------------------------------------------------------------------ +| Function : check_write_index ++------------------------------------------------------------------------------ +| Description : Checks the write index inside the buffer. No reset when +| buffer is full. +| +| Parameters : Number of bytes to be stored in buffer +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ +GLOBAL UBYTE check_write_index (UBYTE n) +{ + TRACE_FUNCTION ("gmm_check_write_index()"); + + if (em_gmm_buffer_write + n < EM_GMM_BUFFER_SIZE) + { + /* + * ACI is informed about the first event trace, + * used for later data processing. + */ + if (em_gmm_trace_occured EQ 0) + { + PALLOC(data, EM_DATA_IND); + data->entity = EM_GMM; + PSENDX(MMI, data); + em_gmm_trace_occured++; + } + return TRUE; + } + else + return FALSE; +} + +/*+------------------------------------------------------------------------------ +| Function : em_init_gmm_event_trace ++------------------------------------------------------------------------------ +| Description : Initialize the event tracing flags for GMM +| +| Parameters : void +| +| Return : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_init_gmm_event_trace(void) +{ + UBYTE i; + + TRACE_FUNCTION ("em_init_gmm_event_trace()"); + + for (i = 0; i < EM_MAX_GMM_EVENTS; i++) + gmm_v[i] = 0; + + em_gmm_buffer_write = 0; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_event_req ++------------------------------------------------------------------------------ +| Description : Set the event tracing flags according the bitmask +| +| Parameters : Primitive - Bitmask +| +| Return : +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void em_gmm_event_req (T_EM_GMM_EVENT_REQ *em_gmm_event_req) +{ + UBYTE i; + + TRACE_FUNCTION ("em_gmm_event_req()"); + + /* + * The event tracing flags are set according the bitmask. mm_v[i] are + * the flags belonging to the event number described in 8443.601 + */ + for(i = 1; i < EM_MAX_GMM_EVENTS; i++) + gmm_v[i] = ((em_gmm_event_req->bitmask_gmm & (0x01<<(i-1))) > 0) ? TRUE : FALSE; + + /* + * A new event trace is generated therefore the flag is reset. + */ + em_gmm_trace_occured = 0; + + PFREE(em_gmm_event_req); +} + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_4 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data identity type (UBYTE), data value (UBYTE) +| +| Return : TRUE/FALSE +| +| Pupose : Used for storing states ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_4 (UBYTE event_no, UBYTE value1, UBYTE value2) +{ + TRACE_FUNCTION ("gmm_em_write_buffer_4()"); + + if (check_write_index(4)) + { + em_gmm_event_buffer[em_gmm_buffer_write++] = event_no; /* Tag: Event number */ + em_gmm_event_buffer[em_gmm_buffer_write++] = 2; /* Length */ + em_gmm_event_buffer[em_gmm_buffer_write++] = value1; + em_gmm_event_buffer[em_gmm_buffer_write++] = value2; + return FALSE; /* Data is stored inside buffer, reset flag */ + }/* check write index*/ + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_sc_gprs_info_cnf ++------------------------------------------------------------------------------ +| Description : The function em_gmm_sc_gprs_info_cnf() is used to forward a +| confirm from GRR to ACI. +| +| Parameters : EM_SC_GPRS_INFO_CN +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_gmm_sc_gprs_info_cnf ( T_EM_SC_GPRS_INFO_CNF *em_sc_gprs_info_cnf) +{ + GMM_TRACE_FUNCTION( "em_gmm_sc_gprs_info_cnf" ); + /* NO PFREE */ + PSEND ( hCommMMI, em_sc_gprs_info_cnf ); + +} /* em_gmm_sc_gprs_info_cnf () */ + + + + +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_grlc_info_req ++------------------------------------------------------------------------------ +| Description : The function em_gmm_grlc_info_req() is used to forward a +| request from ACI to GRLC. +| +| Parameters : EM_GRLC_INFO_REQ +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_gmm_grlc_info_req ( T_EM_GRLC_INFO_REQ *em_grlc_info_req) +{ + GMM_TRACE_FUNCTION( "em_gmm_grlc_info_req" ); + /* NO PFREE */ + PSEND ( hCommGRLC, em_grlc_info_req); + +} /* em_gmm_grlc_info_req () */ + + +GLOBAL void em_gmm_throughput_info_req ( T_EM_THROUGHPUT_INFO_REQ *em_throughput_info_req) +{ + GMM_TRACE_FUNCTION( "em_gmm_throughput_info_req" ); + /* NO PFREE */ + PSEND ( hCommGRLC, em_throughput_info_req); + +} /* em_gmm_throughput_info_req () */ + +GLOBAL void em_gmm_throughput_info_cnf ( T_EM_THROUGHPUT_INFO_CNF *em_throughput_info_cnf) +{ + GMM_TRACE_FUNCTION( "em_gmm_throughput_info_cnf" ); + /* NO PFREE */ + PSEND ( hCommMMI, em_throughput_info_cnf ); + +} /* em_gmm_throughput_info_cnf () */ + +GLOBAL void em_gmm_grr_event_req ( T_EM_GRR_EVENT_REQ *em_grr_event_req) +{ + GMM_TRACE_FUNCTION( "em_gmm_grr_event_req" ); + /* NO PFREE */ + PSEND ( hCommGRR, em_grr_event_req); + +} /* em_gmm_grr_event_req () */ + +GLOBAL void em_gmm_grlc_event_req ( T_EM_GRLC_EVENT_REQ *em_grlc_event_req) +{ + GMM_TRACE_FUNCTION( "em_gmm_grlc_event_req" ); + /* NO PFREE */ + PSEND ( hCommGRLC, em_grlc_event_req); + +} /* em_gmm_grlc_event_req () */ + +GLOBAL void em_gmm_data_ind ( T_EM_DATA_IND *em_data_ind) +{ + GMM_TRACE_FUNCTION( "em_gmm_data_ind" ); + /* NO PFREE */ + PSEND ( hCommMMI, em_data_ind); + +} /* em_gmm_data_ind () */ + +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_grlc_info_cnf ++------------------------------------------------------------------------------ +| Description : The function em_gmm_grlc_info_cnf() is used to forward a +| confirm from GRLC to ACI. +| +| Parameters : EM_GRLC_INFO_CNF +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_gmm_grlc_info_cnf ( T_EM_GRLC_INFO_CNF *em_grlc_info_cnf) +{ + GMM_TRACE_FUNCTION( "em_gmm_grlc_info_cnf" ); + /* NO PFREE */ + PSEND ( hCommMMI, em_grlc_info_cnf ); + +} /* em_gmm_grlc_info_cnf () */ + + + +/*----------------- GMM - Data - Function ---------------*/ +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_pco_trace_req ++------------------------------------------------------------------------------ +| Description : The function em_gmm_pco_trace_req() is used to trace EM - GMM +| relevant data at the PCO. If necessary the Request is forwarded +| to GRR or/and GRLC. +| +| Parameters : EM_PCO_TRACE_REQ +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_gmm_pco_trace_req ( T_EM_PCO_TRACE_REQ *em_pco_trace_req) +{ + GMM_TRACE_FUNCTION( "em_gmm_pco_trace_req" ); + + /*check if GMM data is requested*/ + if(em_pco_trace_req->pco_bitmap & EM_PCO_GMM_INFO) + { + TRACE_EVENT_EM_P8("EM_GMM_INFO_REQ: ready_st:%d tlli:%u ptmsi:%u ptmsi_sig:%u ready_tim:%u ciph_alg:%d periodic_tim:%u ciph_on:%d", + GET_STATE(RDY), + gmm_data->tlli.current, + gmm_data->ptmsi.current, + gmm_data->ptmsi_signature.value, + gmm_data->rdy.t3314_val, + gmm_data->kern.auth_cap.ciphering_algorithm, + gmm_data->rdy.t3312_val, + gmm_data->cipher); + + + TRACE_EVENT_EM_P2("EM_GMM_INFO_REQ: t3312_deactive:%u t3312_val_sec:%d", + gmm_data->rdy.t3312_deactivated, + gmm_data->rdy.t3312_val/SEC); + } + + /*check if a forward to GRR is necessary*/ + if(em_pco_trace_req->pco_bitmap & EM_PCO_GPRS_INFO) + { + /*copy the request and send it to GRR*/ + PALLOC (em_pco_trace_req_grr, EM_PCO_TRACE_REQ); + memcpy (em_pco_trace_req_grr, em_pco_trace_req, sizeof (T_EM_PCO_TRACE_REQ)); + + /* NO PFREE */ + PSEND ( hCommGRR, em_pco_trace_req_grr ); + } + + /*check if a forward to GRLC is necessary*/ + if(em_pco_trace_req->pco_bitmap & EM_PCO_GRLC_INFO) + { + /*send original request, because it is no longer needed in GMM*/ + /* NO PFREE */ + PSEND ( hCommGRLC, em_pco_trace_req); + } + else + { + PFREE(em_pco_trace_req); + } + +}/*em_gmm_pco_trace_req*/ + +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_info_req ++------------------------------------------------------------------------------ +| Description : The function em_gmm_info_req() is used to provide EM - GMM +| relevant data and send it back to ACI. +| +| Parameters : EM_GMM_INFO_REQ +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_gmm_info_req ( T_EM_GMM_INFO_REQ *em_gmm_info_req) +{ + PALLOC (em_gmm_info_cnf, EM_GMM_INFO_CNF); + + GMM_TRACE_FUNCTION( "em_gmm_info_req" ); + PFREE(em_gmm_info_req); + + memset (em_gmm_info_cnf, 0, sizeof (T_EM_GMM_INFO_CNF)); + + em_gmm_info_cnf->ready_state = GET_STATE(RDY); + em_gmm_info_cnf->tlli = gmm_data->tlli.current; + em_gmm_info_cnf->ptmsi = gmm_data->ptmsi.current; + em_gmm_info_cnf->ptmsi_sig = gmm_data->ptmsi_signature.value; + em_gmm_info_cnf->ready_timer = gmm_data->rdy.t3314_val; + em_gmm_info_cnf->ciphering_algorithm = gmm_data->kern.auth_cap.ciphering_algorithm; + em_gmm_info_cnf->t3312.t3312_deactivated = gmm_data->rdy.t3312_deactivated; + em_gmm_info_cnf->t3312.t3312_val = gmm_data->rdy.t3312_val/SEC; + + + + + /* NO PFREE */ + PSEND ( hCommMMI, em_gmm_info_cnf); + +} /* em_gmm_info_req () */ + +/* ++------------------------------------------------------------------------------ +| Function : em_gmm_map_state ++------------------------------------------------------------------------------ +| Description : The function em_gmm_map_state maps the GMM state used within the + GMM entity to state and substate values required by the EM entity +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_gmm_map_state ( UBYTE state, UBYTE *main_state, UBYTE *sub_state) +{ + switch(state) + { + case KERN_GMM_NULL_NO_IMSI: + case KERN_GMM_NULL_IMSI: + case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ: + case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ: + case KERN_GMM_NULL_PLMN_SEARCH: + *main_state = GMM_EM_NULL_STATE; + *sub_state = GMM_EM_POWER_OFF_SUBSTATE; + break; + + case KERN_GMM_DEREG_INITIATED: + *main_state = GMM_EM_DEREG_INIT_STATE; + *sub_state = GMM_EM_NORMAL_SRVC_SUBSTATE; + break; + + case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH: + *main_state = GMM_EM_DEREG_STATE; + *sub_state = GMM_EM_ATTEMPT_TO_ATT_SUBSTATE; + break; + + case KERN_GMM_DEREG_NO_CELL_AVAILABLE: + *main_state = GMM_EM_DEREG_STATE; + *sub_state = GMM_EM_NO_CELL_SUBSTATE; + break; + + case KERN_GMM_DEREG_LIMITED_SERVICE: + case KERN_GMM_DEREG_NO_IMSI: + case KERN_GMM_DEREG_PLMN_SEARCH: + *main_state = GMM_EM_DEREG_STATE; + *sub_state = GMM_EM_ATT_NEEDED_SUBSTATE; + break; + + case KERN_GMM_DEREG_SUSPENDED: + case KERN_GMM_DEREG_SUSPENDING: + case KERN_GMM_DEREG_RESUMING: + *main_state = GMM_EM_DEREG_STATE; + *sub_state = GMM_EM_SUSPENDED_SUBSTATE; + break; + + case KERN_GMM_REG_INITIATED: + *main_state = GMM_EM_REG_INIT_STATE; + *sub_state = GMM_EM_NORMAL_SRVC_SUBSTATE; + break; + + case KERN_GMM_REG_NO_CELL_AVAILABLE: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_NO_CELL_SUBSTATE; + break; + + case KERN_GMM_REG_LIMITED_SERVICE: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_UPDATE_NEEDED_SUBSTATE; + break; + + case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_ATTEMPT_TO_UPDATE_MM_SUBSTATE; + break; + + case KERN_GMM_REG_ATTEMPTING_TO_UPDATE: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_ATTEMPT_TO_UPDATE_SUBSTATE; + break; + + case KERN_GMM_REG_RESUMING: + case KERN_GMM_REG_SUSPENDED: + case KERN_GMM_REG_SUSPENDING: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_SUSPENDED_SUBSTATE; + break; + + case KERN_GMM_REG_NORMAL_SERVICE: + case KERN_GMM_REG_TEST_MODE: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_NORMAL_SRVC_SUBSTATE; + break; + + case KERN_GMM_RAU_INITIATED: + case KERN_GMM_RAU_WAIT_FOR_NPDU_LIST: + *main_state = GMM_EM_RAU_INIT_STATE; + *sub_state = GMM_EM_NORMAL_SRVC_SUBSTATE; + break; + + case KERN_GMM_REG_IMSI_DETACH_INITIATED: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_IMSI_DETACH_INIT_SUBSTATE; + break; + + case KERN_GMM_REG_TEST_MODE_NO_IMSI: + *main_state = GMM_EM_REG_STATE; + *sub_state = GMM_EM_POWER_OFF_SUBSTATE; + break; + + default: + TRACE_ERROR ("Unknown state passed to function"); + break; + } + return; +} + + +#endif /* FF_EM_MODE */ + +#endif /*GMM_EM_C */