FreeCalypso > hg > fc-magnetite
diff src/g23m-gsm/mm/mm_em.c @ 104:27a4235405c6
src/g23m-gsm: import from LoCosto source
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 04 Oct 2016 18:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gsm/mm/mm_em.c Tue Oct 04 18:24:05 2016 +0000 @@ -0,0 +1,537 @@ +/* ++----------------------------------------------------------------------------- +| 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 MM_EM_C +#define MM_EM_C + +#define ENTITY_MM + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include <stdlib.h> +#include <stddef.h> +#include "typedefs.h" +#include "pcm.h" +#include "pconst.cdg" +#include "mconst.cdg" +#include "message.h" +#include "ccdapi.h" +#include "vsi.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" +#include "cnf_mm.h" +#include "mon_mm.h" +#include "pei.h" +#include "tok.h" +#include "mm.h" +#include "mm_em.h" + +/*==== EXPORT =====================================================*/ + +/*==== PRIVAT =====================================================*/ + +/*==== VARIABLES ==================================================*/ + +#ifdef FF_EM_MODE +GLOBAL UBYTE em_mm_event_buffer[EM_MM_BUFFER_SIZE]; +GLOBAL UBYTE em_mm_buffer_write; + +/* Event tracing flags for EM */ +GLOBAL BOOL mm_v[EM_MAX_MM_EVENTS]; + +static UBYTE em_mm_trace_occured; +#endif /* FF_EM_MODE */ + +/*==== FUNCTIONS ==================================================*/ + +#ifdef FF_EM_MODE + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_2 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_2 (UBYTE event_no) +{ + TRACE_FUNCTION ("mm_em_write_buffer_2()"); + + if (check_write_index(2)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = 0; /* Length: 0 means no value */ + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_3 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_3 (UBYTE event_no, UBYTE value) +{ + TRACE_FUNCTION ("mm_em_write_buffer_3()"); + + if (check_write_index(3)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = 1; /* Length: 0 means no value */ + em_mm_event_buffer[em_mm_buffer_write++] = value; /* Value: Data to be stored */ + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_3a ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value (USHORT) +| +| Return : TRUE/FALSE +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_3a (UBYTE event_no, USHORT value) +{ + TRACE_FUNCTION ("mm_em_write_buffer_3a()"); + + if (check_write_index(4)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = 2; /* Length: 0 means no value */ + + /* Value: Data to be stored. MSB first, LSB second */ + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value >> 8); + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value); + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} + +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_3b ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value (ULONG) +| +| Return : TRUE/FALSE +| +| Pupose : Used for storing TMSI ++------------------------------------------------------------------------------ +*/ +#define RINGBUF_3B_LENGTH (2 + 4) +GLOBAL UBYTE em_write_buffer_3b (UBYTE event_no, ULONG value) +{ + TRACE_FUNCTION ("mm_em_write_buffer_3b()"); + + if (check_write_index(RINGBUF_3B_LENGTH)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = RINGBUF_3B_LENGTH-2; /* Length: 0 means no value */ + + /* Value: Data to be stored. MSB first, LSB second */ + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value>>24); /* MSB first */ + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value>>16); /* new TMSI */ + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value>> 8); + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value); /* LSB last */ + return FALSE; /* Data is stored inside buffer, reset flag */ + } + else + return TRUE; /* No more space inside buffer, serve flag next time */ +} +/* ++------------------------------------------------------------------------------ +| Function : em_write_buffer_4 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value1, data plmn (T_plmn) +| +| Return : TRUE/FALSE +| +| Pupose : Used for storing PLMN list ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_4 (UBYTE event_no, UBYTE value1, T_plmn *plmn) +{ + UBYTE i; + UBYTE n = 2; + + TRACE_FUNCTION ("mm_em_write_buffer_4()"); + + n += ((SIZE_MCC + SIZE_MNC) * value1); /*Compute exact size of data to be stored*/ + + if(check_write_index(n)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = (n - 2); /* Length: 0 means no value */ + for (i = 0; i < value1; i++) /*stores MCC and MNC of every available PLMN*/ + { + if(plmn[i].v_plmn) + { + memcpy(&em_mm_event_buffer[em_mm_buffer_write], plmn[i].mcc, SIZE_MCC); + em_mm_buffer_write += SIZE_MCC; + memcpy(&em_mm_event_buffer[em_mm_buffer_write], plmn[i].mnc, SIZE_MNC); + em_mm_buffer_write += SIZE_MNC; + } /*valid*/ + } /*for*/ + 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_write_buffer_4a ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value1 (UBYTE), data value2 (USHORT) +| +| Return : TRUE/FALSE +| +| Pupose : Used for storing Location Update Reject ++------------------------------------------------------------------------------ +*/ +#define RINGBUF_4A_LENGTH (2 + 1 + 2) +GLOBAL UBYTE em_write_buffer_4a (UBYTE event_no, UBYTE value1, USHORT value2) +{ + TRACE_FUNCTION ("mm_em_write_buffer_4a()"); + + if (check_write_index(RINGBUF_4A_LENGTH)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = RINGBUF_4A_LENGTH-2; /* Length: 0 means no value */ + em_mm_event_buffer[em_mm_buffer_write++] = value1; + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value2 >> 8); + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(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_write_buffer_4b ++------------------------------------------------------------------------------ +| 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 IMEI, IMEISV, IMSI during Identity Request/Response ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_write_buffer_4b (UBYTE event_no, UBYTE ident_type, UBYTE *value) +{ + + UBYTE n; + UBYTE digits; + + TRACE_FUNCTION ("mm_em_write_buffer_4b()"); + + switch (ident_type) /*Creating length of data to be stored*/ + { + case ID_TYPE_IMEI: + digits = 14; /*length of IMEI */ + break; + case ID_TYPE_IMSI: + case ID_TYPE_IMEISV: + digits = 16; /*length of IMSI / IMEISV */ + break; + default: /* Illegal mobile identity - not possible because of calling function*/ + break; + } /*switch*/ + n = 3 + digits; /* Tag + Length + Type + Digits */ /*lint !e644*/ /*for lint: Digits are + always initialized because of calling function*/ + + if (check_write_index(n)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = (n - 2); /* Length: 0 means no value */ + em_mm_event_buffer[em_mm_buffer_write++] = ident_type; + memcpy (&em_mm_event_buffer[em_mm_buffer_write], value, digits); + em_mm_buffer_write += digits; + 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_write_buffer_4c ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data identity type (UBYTE), data value (ULONG) +| +| Return : TRUE/FALSE +| +| Pupose : Used during Identity Request/Response for storing TMSI ++------------------------------------------------------------------------------ +*/ +#define RINGBUF_4C_LENGTH (2 + 1 + 4) +GLOBAL UBYTE em_write_buffer_4c (UBYTE event_no, UBYTE ident_type, ULONG value) +{ + TRACE_FUNCTION ("mm_em_write_buffer_4c()"); + if (check_write_index(RINGBUF_4C_LENGTH)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = (RINGBUF_4C_LENGTH - 2); /* Length: 0 means no value */ + em_mm_event_buffer[em_mm_buffer_write++] = ident_type; + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value>>24); /* MSB first */ + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value>>16); + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value>> 8); + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(value); /* LSB last */ + 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_write_buffer_5a ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data value (UBYTE), data mcc (UBYTE), data mnc (UBYTE) +| +| Return : TRUE/FALSE +| +| Pupose : Used for storing Service Mode, MCC und MNC during registration +| Used for storing data during cell reselection ++------------------------------------------------------------------------------ +*/ +#define RINGBUF_5A_LENGTH (2 + 1 + SIZE_MCC + SIZE_MNC) +GLOBAL UBYTE em_write_buffer_5a (UBYTE event_no, UBYTE value, UBYTE mcc[SIZE_MCC], UBYTE mnc[SIZE_MNC]) +{ + TRACE_FUNCTION ("mm_em_write_buffer_5a()"); + + if (check_write_index(RINGBUF_5A_LENGTH)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = RINGBUF_5A_LENGTH-2; /* Length: 0 means no value */ + em_mm_event_buffer[em_mm_buffer_write++] = value; + +/*missing check for validy*/ + memcpy(&em_mm_event_buffer[em_mm_buffer_write], mcc, SIZE_MCC); + em_mm_buffer_write += SIZE_MCC; + memcpy(&em_mm_event_buffer[em_mm_buffer_write], mnc, SIZE_MNC); + em_mm_buffer_write += SIZE_MNC; + + 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_write_buffer_6 ++------------------------------------------------------------------------------ +| Description : Perform buffer check and store corresponding data in it. +| +| Parameters : Event number, data location update type (UBYTE), data lai (T_loc_area_ident) +| +| Return : TRUE/FALSE +| +| Pupose : Used for storing Location Update Type, MCC, MNC and LAC ++------------------------------------------------------------------------------ +*/ +#define RINGBUF_6_LENGTH (2 + 1 + SIZE_MCC + SIZE_MNC + 2) +GLOBAL UBYTE em_write_buffer_6 (UBYTE event_no, UBYTE loc_upd_type, T_loc_area_ident lai) +{ + TRACE_FUNCTION ("mm_em_write_buffer_6()"); + + if (check_write_index(RINGBUF_6_LENGTH)) + { + em_mm_event_buffer[em_mm_buffer_write++] = event_no; /* Tag: Event number */ + em_mm_event_buffer[em_mm_buffer_write++] = RINGBUF_6_LENGTH - 2; /* Length: 0 means no value */ + em_mm_event_buffer[em_mm_buffer_write++] = loc_upd_type; + memcpy(&em_mm_event_buffer[em_mm_buffer_write], lai.mcc, SIZE_MCC); /*stores MCC*/ + em_mm_buffer_write += SIZE_MCC; + memcpy(&em_mm_event_buffer[em_mm_buffer_write], lai.mnc, SIZE_MNC); /*stores MNC*/ + em_mm_buffer_write += SIZE_MNC; + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(lai.lac >> 8); /*stores LAC*/ + em_mm_event_buffer[em_mm_buffer_write++] = (UBYTE)(lai.lac); + 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 : 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 ("mm_check_write_index()"); + + if (em_mm_buffer_write + n < EM_MM_BUFFER_SIZE) + { + /* + * ACI is informed about the first event trace, + * used for later data processing. + */ + if (em_mm_trace_occured EQ 0) + { + PALLOC(data, EM_DATA_IND); + data->entity = EM_MM; + PSENDX(MMI, data); + em_mm_trace_occured++; + } + return TRUE; + } + else + return FALSE; +} + +/* ++------------------------------------------------------------------------------ +| Function : mm_em_mm_event_req ++------------------------------------------------------------------------------ +| Description : Set the event tracing flags according the bitmask for dl +| +| Parameters : Primitive - Bitmask +| +| Return : +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void mm_em_dl_event_req (T_EM_DL_EVENT_REQ *em_dl_event_req) +{ + TRACE_FUNCTION ("mm_em_dl_event_req()"); + + PSENDX(DL, em_dl_event_req); +} + +/* ++------------------------------------------------------------------------------ +| Function : em_init_mm_event_trace ++------------------------------------------------------------------------------ +| Description : Initialize the event tracing flags for MM +| +| Parameters : void +| +| Return : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_init_mm_event_trace(void) +{ + UBYTE i; + + TRACE_FUNCTION ("em_init_mm_event_trace()"); + + for (i = 0; i < EM_MAX_MM_EVENTS; i++) + mm_v[i] = 0; + + em_mm_buffer_write = 0; +} + +/* ++------------------------------------------------------------------------------ +| Function : mm_em_mm_event_req ++------------------------------------------------------------------------------ +| Description : Set the event tracing flags according the bitmask +| +| Parameters : Primitive - Bitmask +| +| Return : +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void mm_em_mm_event_req (T_EM_MM_EVENT_REQ *em_mm_event_req) +{ + UBYTE i; + + TRACE_FUNCTION ("mm_em_mm_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_MM_EVENTS; i++) + mm_v[i] = ((em_mm_event_req->bitmask_mm & (0x01<<(i-1))) > 0) ? TRUE : FALSE; + + /* + * A new event trace is generated therefore the flag is reset. + */ + em_mm_trace_occured = 0; + + PFREE(em_mm_event_req); +} +#endif /* FF_EM_MODE */ + +#endif /* MM_EM_C */