FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/sm/sm_pei.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/sm/sm_pei.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,463 @@ +/*---------------------------------------------------------------------------- +| Project : 3G PS +| Module : SM ++----------------------------------------------------------------------------- +| Copyright 2003 Texas Instruments. +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments . +| 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. ++----------------------------------------------------------------------------- +| Purpose: This module implements the process body interface +| for the User Plane Manager (SM) entity. +| For design details, see: +| 8010.939 SM Detailed Specification ++---------------------------------------------------------------------------*/ + +/*==== DECLARATION CONTROL =================================================*/ + +#ifndef SM_PEI_C +#define SM_PEI_C +#endif + +/*==== INCLUDES =============================================================*/ + +#include "sm.h" + +#include "ccdapi.h" + +#include "sm_sequencer.h" +#include "sm_dispatcher.h" + +#include "mon_sm.h" + +/*==== CONSTS ===============================================================*/ + +/*==== TYPES ================================================================*/ + +/*==== LOCALS ===============================================================*/ + +/* Communication handles */ +T_HANDLE hCommACI = VSI_ERROR; +T_HANDLE hCommMM = VSI_ERROR; +T_HANDLE hCommUPM = VSI_ERROR; +T_HANDLE sm_handle; + +static T_MONITOR sm_mon; +static BOOL first_access = TRUE; + +/* Global entity data structure */ +T_SM_DATA sm_data; + +/* Air interface message coding/decoding buffer */ +U8 _decodedMsg [MAX_MSTRUCT_LEN_SM]; + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : pei_primitive ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when a primitive is +| received and needs to be processed. +| +| | | +| | | UPPER LAYER +| v v +| +--------------(SMREG SAP)--------------(SM SAP)---------------+ +| | | +| | SM | +| | | +| +-------------------------------^------------------------------+ +| | +| | LOWER LAYER +| (MMPM SAP) +| +| Parameters : prim - Pointer to the received primitive +| +| Return : PEI_OK - function succeeded +| PEI_ERROR - function failed ++------------------------------------------------------------------------------ +*/ +static short pei_primitive (void *primitive) +{ + (void)TRACE_FUNCTION("SM pei_primitive"); + + if (primitive != NULL) + { + T_PRIM_HEADER *prim; + U32 opc; + + opc = P_OPC(primitive); + +/*@i1@*/ (void)PTRACE_IN (opc); + + prim = (T_PRIM_HEADER *)&((T_PRIM *)primitive)->data; + + /* Memory supervision ? */ + VSI_PPM_RCV (primitive); + + switch (opc) + { + /* SMREG SAP */ + case SMREG_PDP_ACTIVATE_REQ: + sm_disp_smreg_pdp_activate_req((T_SMREG_PDP_ACTIVATE_REQ *)(prim)); + PFREE(prim); + break; + + case SMREG_PDP_ACTIVATE_SEC_REQ: + sm_disp_smreg_pdp_activate_sec_req((T_SMREG_PDP_ACTIVATE_SEC_REQ *)(prim)); + PFREE(prim); + break; + + case SMREG_PDP_ACTIVATE_REJ_RES: + sm_disp_smreg_pdp_activate_rej_res((T_SMREG_PDP_ACTIVATE_REJ_RES *)(prim)); + PFREE(prim); + break; + + case SMREG_PDP_DEACTIVATE_REQ: + sm_disp_smreg_pdp_deactivate_req((T_SMREG_PDP_DEACTIVATE_REQ *)(prim)); + PFREE(prim); + break; + + case SMREG_PDP_MODIFY_REQ: + sm_disp_smreg_pdp_modify_req((T_SMREG_PDP_MODIFY_REQ *)(prim)); + PFREE(prim); + break; + + + /* SM SAP */ + case SM_ACTIVATE_RES: + sm_disp_sm_activate_res((T_SM_ACTIVATE_RES *)(prim)); + PFREE(prim); + break; + + case SM_DEACTIVATE_RES: + sm_disp_sm_deactivate_res((T_SM_DEACTIVATE_RES *)(prim)); + PFREE(prim); + break; + + case SM_MODIFY_RES: + sm_disp_sm_modify_res((T_SM_MODIFY_RES *)(prim)); + PFREE(prim); + break; + + case SM_STATUS_REQ: + sm_disp_sm_status_req((T_SM_STATUS_REQ *)(prim)); + PFREE(prim); + break; + + /* MMPM SAP */ + case MMPM_ATTACH_IND: + sm_disp_mmpm_attach_ind((T_MMPM_ATTACH_IND *)(prim)); + PFREE(prim); + break; + + case MMPM_DETACH_IND: + sm_disp_mmpm_detach_ind((T_MMPM_DETACH_IND *)(prim)); + PFREE(prim); + break; + + case MMPM_UNITDATA_IND: + sm_disp_mmpm_unitdata_ind((T_MMPM_UNITDATA_IND *)(prim)); + PFREE(prim); + break; + + case MMPM_SUSPEND_IND: + sm_disp_mmpm_suspend_ind((T_MMPM_SUSPEND_IND *)(prim)); + PFREE(prim); + break; + + case MMPM_RESUME_IND: + sm_disp_mmpm_resume_ind((T_MMPM_RESUME_IND *)(prim)); + PFREE(prim); + break; + + default: + /* forward sys primitives to the environment */ + if ( (opc & SYS_MASK) != 0) { + (void)vsi_c_primitive(VSI_CALLER primitive); + return (short)PEI_OK; + } else { + PFREE(prim); + return (short)PEI_ERROR; + } + } /* switch */ + } /* if (prim != NULL) */ + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_init ++------------------------------------------------------------------------------ +| Description : This function is called by the frame. It is used +| to initialise the entity. +| +| Parameters : handle - task handle +| +| Return : PEI_OK - entity initialised +| PEI_ERROR - entity not (yet) initialised ++------------------------------------------------------------------------------ +*/ +static short pei_init (T_HANDLE handle) +{ + (void)TRACE_FUNCTION ("SM pei_init"); + + /* + * Initialize task handle + */ + sm_handle = handle; + /* + * Open communication channels + */ + if (hCommACI < VSI_OK) + { + if ((hCommACI = vsi_c_open(VSI_CALLER ACI_NAME)) < VSI_OK) + { + return (short)PEI_ERROR; + } + } + + if (hCommMM < VSI_OK) + { +/*#ifdef SM_EDGE */ + if ((hCommMM = vsi_c_open(VSI_CALLER GMM_NAME)) < VSI_OK) +/*#else */ /* #ifdef SM_EDGE */ +/* if ((hCommMM = vsi_c_open(VSI_CALLER MM_NAME)) < VSI_OK) + #endif */ /*#ifdef SM_EDGE*/ + { + return (short)PEI_ERROR; + } + } + + if (hCommUPM < VSI_OK) + { + if ((hCommUPM = vsi_c_open (VSI_CALLER UPM_NAME)) < VSI_OK) + { + return (short)PEI_ERROR; + } + } + + /* Clear static entity data store */ + memset(&sm_data, 0, sizeof(sm_data)); + + /* Initialize multi-entity state machine */ + sm_sequencer_init(); + + /* + * Initialize entity data (call init functions) + */ + (void)ccd_init(); + + return (short)PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_timeout ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when a timer has expired. +| +| Parameters : index - timer index +| +| Return : PEI_OK - timeout processed +| PEI_ERROR - timeout not processed +| ++------------------------------------------------------------------------------ +*/ + +static short pei_timeout (U16 index) +{ + (void)TRACE_FUNCTION("pei_timeout"); + + /* + * Process timeout + */ + sm_disp_pei_timeout(index); + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_exit ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when the entity +| is terminated. All open resources are freed. +| +| Parameters : - +| +| Return : PEI_OK - exit sucessful +| PEI_ERROR - exit not successful ++------------------------------------------------------------------------------ +*/ +static short pei_exit (void) +{ + int nsapi; + (void)TRACE_FUNCTION ("SM pei_exit"); + + /* + * Clean up entity data + */ + + for (nsapi = (int)NAS_NSAPI_5; nsapi < NAS_SIZE_NSAPI; nsapi++) { + int index = sm_nsapi_to_index((U16)nsapi); + + if (sm_data.sm_context_array[index] != NULL) { + /* sm_free_context_data_by_nsapi also sets pointer to NULL */ + sm_free_context_data_by_nsapi(nsapi); + } + + if (sm_data.sm_pending_mt_array[index] != NULL) { + /* sm_free_pending_mt_context_by_index also sets pointer to NULL */ + sm_free_pending_mt_context_by_index((U16)index); + } + } + + sm_sequencer_exit(); + + /* Exit CCD to clean up data stores */ + (void)ccd_exit(); + + /* + * Close communication channels + */ + (void)vsi_c_close(VSI_CALLER hCommACI); + hCommACI = VSI_ERROR; + + (void)vsi_c_close(VSI_CALLER hCommMM); + hCommMM = VSI_ERROR; + + (void)vsi_c_close(VSI_CALLER hCommUPM); + hCommUPM = VSI_ERROR; + + return (short)PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_config ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when a primitive is +| received indicating dynamic configuration. +| +| This function is not used in this entity. +| +| Parameters : handle - Communication handle +| +| Return : PEI_OK - sucessful +| PEI_ERROR - not successful ++------------------------------------------------------------------------------ +*/ +static short pei_config (char *inString) +{ + (void)TRACE_FUNCTION ("SM pei_config"); + (void)TRACE_FUNCTION (inString); + +#ifdef DEBUG + if ( strcmp(inString, "DUMP_STATE") == 0) { + sm_dump_state(); + } +#endif + + return (short)PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_monitor ++------------------------------------------------------------------------------ +| Description : This function is called by the frame in case sudden entity +| specific data is requested (e.g. entity Version). +| +| Parameters : out_monitor - return the address of the data to be +| monitoredCommunication handle +| +| Return : PEI_OK - sucessful (address in out_monitor is valid) +| PEI_ERROR - not successful ++------------------------------------------------------------------------------ +*/ +/*@-compdef@*/ /*@-mods@*/ +static short pei_monitor (void **out_monitor) /*@globals undef sm_mon@*/ +{ + (void)TRACE_FUNCTION ("SM pei_monitor"); + + /* + * Version = "0.S" (S = Step). + */ + sm_mon.version = "SM 0.1"; + *out_monitor = &sm_mon; + + return PEI_OK; +} +/*@=compdef@*/ /*@=mods@*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : pei_create ++------------------------------------------------------------------------------ +| Description : This function is called by the frame when the process is +| created. +| +| Parameters : out_name - Pointer to the buffer in which to locate +| the name of this entity +| +| Return : PEI_OK - entity created successfuly +| PEI_ERROR - entity could not be created +| ++------------------------------------------------------------------------------ +*/ +short pei_create (T_PEI_INFO **info) +{ +/*@-nullassign@*/ +static T_PEI_INFO pei_info = + { +/*@i1@*/ SM_NAME, /* name */ + { /* pei-table */ + pei_init, + pei_exit, + pei_primitive, + pei_timeout, + NULL, /* no pei_signal function */ + NULL, /* no pei_run function */ + pei_config, + pei_monitor + }, + (U32)2048, /* stack size */ + (U16)10, /* queue entries */ + (U16)165, /* priority (1->low, 255->high) */ + (U16)SM_TIMER_MAX, /* number of timers */ + (U8)0x03 /* flags: bit 0 active(0) body/passive(1) */ + }; /* bit 1 com by copy(0)/reference(1) */ +/*@=nullassign@*/ + + (void)TRACE_FUNCTION ("SM pei_create"); + + /* + * Close Resources if open + */ + if (first_access) + { + first_access = FALSE; + } else { + (void)pei_exit(); + } + + /* + * Export startup configuration data + */ + *info = &pei_info; + + return PEI_OK; +} + +/*==== END OF FILE ==========================================================*/