/* +----------------------------------------------------------------------------- | 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_MODEGLOBAL 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 */