FreeCalypso > hg > freecalypso-sw
view gsm-fw/g23m-aci/aci/cmh_gmmr.c @ 985:8109185528c1
tfc139: new logic actually works
author | Mychaela Falconia <falcon@ivan.Harhan.ORG> |
---|---|
date | Sat, 12 Dec 2015 03:24:52 +0000 |
parents | eedbf248bac0 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | 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 functions which are responsible | for the responses of the protocol stack adapter for | GPRS mobility management ( GMM ). +----------------------------------------------------------------------------- */ #if defined (GPRS) && defined (DTI) #ifndef CMH_GMMR_C #define CMH_GMMR_C #endif #include "aci_all.h" /*==== INCLUDES ===================================================*/ #include "dti.h" /* functionality of the dti library */ #include "aci_cmh.h" #include "ati_cmd.h" #include "aci_cmd.h" #include "dti_conn_mng.h" #include "aci.h" #include "gaci.h" #include "gaci_cmh.h" #include "psa.h" #include "psa_mm.h" #include "psa_gmm.h" #include "psa_sim.h" #include "cmh.h" #include "cmh_mm.h" #include "cmh_gmm.h" #include "cmh_sim.h" #if defined (FF_WAP) OR defined (FF_SAT_E) #include "wap_aci.h" #include "psa_sm.h" #endif /* WAP */ #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) #include "psa_cc.h" #include "psa_sat.h" #include "cmh_sat.h" #endif /* SIM_TOOLKIT AND FF_SAT_E */ #ifdef FF_GPF_TCPIP #include "dcm_utils.h" #include "dcm_state.h" #include "dcm_env.h" #endif #include "dcm_f.h" #include "cmh_sm.h" /*==== CONSTANTS ==================================================*/ /*==== TYPES ======================================================*/ /*==== EXPORT =====================================================*/ /*==== VARIABLES ==================================================*/ /*==== FUNCTIONS ==================================================*/ /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_Attached | +-------------------------------------------------------------------+ PURPOSE : ME is attached */ GLOBAL void cmhGMM_Attached ( UBYTE attach_type, T_plmn *plmn, UBYTE search_running ) { T_CGEREP_EVENT_REP_PARAM event; SHORT i; TRACE_FUNCTION ("cmhGMM_Attached()"); /* * set GPRS attach state */ gmmShrdPrm.current_attach_type = attach_type; switch ( attach_type ) { case GMMREG_AT_GPRS: case GMMREG_AT_COMB: cmhGMM_Set_state(AS_ATTACHED); break; case GMMREG_AT_IMSI: cmhGMM_Set_state(AS_DETACHED); break; } if (search_running EQ GMMREG_SEARCH_NOT_RUNNING) { gmmShrdPrm.mobile_class = gmmShrdPrm.requested_mobile_class; gaciMobileClass.current = gaciMobileClass.requested; if(AT_CMD_CGCLASS EQ gmmEntStat.curCmd) { /* * brz: 22.10.02 * special behaviour for NMO III * * In the case of NMO III a COMB reject can not be succesful. * * case BG requested: attach type GPRS is also OK * case BC requested: attach type IMSI is also OK */ if( GMMREG_CLASS_BG EQ gmmShrdPrm.mobile_class AND GMMREG_AT_GPRS EQ attach_type OR GMMREG_CLASS_BC EQ gmmShrdPrm.mobile_class AND GMMREG_AT_IMSI EQ attach_type ) { /* * GPRS event reporting> */ event.mobile_class = (T_CGCLASS_CLASS)gmmShrdPrm.mobile_class; for( i = 0 ; i < CMD_SRC_MAX; i++ ) { R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event ); R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event ); } R_AT( RAT_OK, gmmEntStat.entOwn ) ( gmmEntStat.curCmd ); /* log result */ cmh_logRslt ( gmmEntStat.entOwn, RAT_OK, gmmEntStat.curCmd, -1, BS_SPEED_NotPresent,CME_ERR_NotPresent ); gmmEntStat.curCmd = AT_CMD_NONE; return; } } } if ( attach_type EQ GMMREG_AT_IMSI AND gmmShrdPrm.requested_mobile_class NEQ GMMREG_CLASS_CC) { /* * brz: 03.05.02 * patch for wrong behaviour of GMM: sending attach_cnf->IMSI instead of attach_rej->GPRS */ if (search_running EQ GMMREG_SEARCH_NOT_RUNNING) { cmhGMM_NoAttach(GMMREG_DT_GPRS ,GMMCS_NO_SERVICE , GMMREG_SEARCH_NOT_RUNNING); } return; } else /* end of +CGATT or +CGCLASS */ { /* * Inform CMH SM about new attach state. */ cmhSM_GprsAttached( GPRS_ATTACH ); switch ( gmmEntStat.curCmd ) { case AT_CMD_CGCLASS: /* * GPRS event reporting */ event.mobile_class = (T_CGCLASS_CLASS)gmmShrdPrm.requested_mobile_class; for( i = 0 ; i < CMD_SRC_MAX; i++ ) { R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event ); R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event ); } /*lint -fallthrough */ case AT_CMD_CGATT: R_AT( RAT_OK, gmmEntStat.entOwn ) ( gmmEntStat.curCmd ); /* log result */ cmh_logRslt ( gmmEntStat.entOwn, RAT_OK, gmmEntStat.curCmd, -1, BS_SPEED_NotPresent,CME_ERR_NotPresent ); #ifdef FF_GPF_TCPIP if(is_gpf_tcpip_call()) { T_DCM_STATUS_IND_MSG msg; msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG; dcm_send_message(msg, DCM_SUB_WAIT_CGATT_CNF); } #endif /* FF_GPF_TCPIP */ break; } gmmEntStat.curCmd = AT_CMD_NONE; } } /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_NoAttach | +-------------------------------------------------------------------+ PURPOSE : the attach fail */ GLOBAL void cmhGMM_NoAttach ( UBYTE detach_type, USHORT cause, UBYTE search_running ) { T_ACI_CME_ERR cme_err; /* error number */ TRACE_FUNCTION ("cmhGMM_NoAttach()"); /* * map error cause */ switch(cause) { case GMMCS_ILLEGAL_MS: case MMCS_ILLEGAL_MS: cme_err = CME_ERR_GPRSBadMs; break; case GMMCS_ILLEGAL_ME: case MMCS_ILLEGAL_ME: cme_err = CME_ERR_GPRSBadMe; break; case GMMCS_GPRS_NOT_ALLOWED: /* No corrosponding MM cause */ cme_err = CME_ERR_GPRSNoService; break; case GMMCS_PLMN_NOT_ALLOWED: case MMCS_PLMN_NOT_ALLOWED: cme_err = CME_ERR_GPRSBadPlmn; break; case GMMCS_LA_NOT_ALLOWED: case MMCS_LA_NOT_ALLOWED: cme_err = CME_ERR_GPRSBadLoc; break; case GMMCS_ROAMING_NOT_ALLOWED: case MMCS_ROAMING_NOT_ALLOWED: cme_err = CME_ERR_GPRSNoRoam; break; case GMMCS_IMPLICIT_DETACHED: /* No corrosponding MM cause */ cme_err = CME_ERR_GPRSUnspec; break; case GMMCS_IMSI_UNKNOWN: case MMCS_IMSI_IN_HLR: case MMCS_IMEI_NOT_ACCEPTED: /* No corrosponding GMM cause */ case GMMCS_NO_MS_ID: /* No corrosponding MM cause */ cme_err = CME_ERR_SimFail; break; case GMMCS_GSM_GPRS_NOT_ALLOWED: /* No corrosponding MM cause */ case GMMCS_NET_FAIL: case MMCS_NETWORK_FAILURE: case GMMCS_MSC_TEMP_NOT_REACHABLE: /* No corrosponding MM cause */ case GMMCS_CONGESTION: case MMCS_CONGESTION: cme_err = CME_ERR_NoServ; break; /* case GMMCS_CELL_SELECTION_FAILED: */ /* No corrosponding MM cause */ /* case GMMCS_NO_SERVICE: */ /* No corrosponding MM cause */ /* case GMMCS_LIMITED_SERVICE: */ /* No corrosponding MM cause */ /* case GMMCS_SEMANTIC_INCORRECT: case MMCS_INCORRECT_MESSAGE: case GMMCS_INVALID_M_INFO: case MMCS_INVALID_MAND_MESSAGE: case GMMCS_TYPE_INVALID: case MMCS_MESSAGE_TYPE_NOT_IMPLEM: case GMMCS_TYPE_INCOMPATIBLE: case MMCS_MESSAGE_TYPE_INCOMPAT: case GMMCS_IE_INVALID: case MMCS_IE_NOT_IMPLEM: case GMMCS_COND_IE_ERROR: case MMCS_CONDITIONAL_IE: case GMMCS_MESSAGE_INVALID: case MMCS_MESSAGE_INCOMPAT: case GMMCS_INT_PROTOCOL_ERROR: */ /* No corrosponding MM cause */ default: cme_err = CME_ERR_Unknown; } if ( search_running EQ GMMREG_SEARCH_NOT_RUNNING ) { /* * Inform CMH SM about new attach state */ cmhSM_GprsAttached( GPRS_DETACH ); switch ( gmmEntStat.curCmd ) { case AT_CMD_CGCLASS: case AT_CMD_CGATT: R_AT( RAT_CME, gmmEntStat.entOwn ) ( gmmEntStat.curCmd, cme_err ); /* log result */ cmh_logRslt ( gmmEntStat.entOwn, RAT_CME, gmmEntStat.curCmd, -1, BS_SPEED_NotPresent, cme_err ); break; } gmmEntStat.curCmd = AT_CMD_NONE; } /* * set GPRS attach state */ switch ( detach_type ) { case GMMREG_DT_LIMITED_SERVICE: case GMMREG_DT_SIM_REMOVED: cmhGMM_Set_state(AS_DETACHED); break; case GMMREG_DT_DISABLE_GPRS: cmhGMM_Set_state(AS_SUSPENTED); break; case GMMREG_DT_POWER_OFF: break; case GMMREG_DT_GPRS: case GMMREG_DT_COMB: cmhGMM_Set_state(AS_DETACHED); break; case GMMREG_DT_IMSI: break; } switch ( detach_type ) { case GMMREG_DT_GPRS: gmmShrdPrm.current_attach_type = GMMREG_AT_IMSI; break; case GMMREG_DT_IMSI: gmmShrdPrm.current_attach_type = GMMREG_AT_GPRS; break; case GMMREG_DT_COMB: case GMMREG_DT_POWER_OFF: case GMMREG_DT_LIMITED_SERVICE: case GMMREG_DT_SIM_REMOVED: gmmShrdPrm.current_attach_type = ATTACH_TYPE_DETACHED; break; } } /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_Detached | +-------------------------------------------------------------------+ PURPOSE : ME is detached */ GLOBAL void cmhGMM_Detached ( UBYTE detach_type ) { SHORT i; TRACE_FUNCTION ("cmhGMM_Detached()"); /* *------------------------------------------------------------------- * check for command context *------------------------------------------------------------------- */ switch ( detach_type ) { case GMMREG_DT_GPRS: case GMMREG_DT_COMB: for( i = 0 ; i < CMD_SRC_MAX; i++ ) { R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL ); R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL ); } cmhGMM_Set_state(AS_DETACHED); break; case GMMREG_DT_POWER_OFF: for( i = 0 ; i < CMD_SRC_MAX; i++ ) { R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL ); R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL ); } cmhGMM_Set_state(AS_MOBILE_OFF); break; case GMMREG_DT_LIMITED_SERVICE: cmhGMM_Set_state(AS_DETACHED); break; case GMMREG_DT_SIM_REMOVED: cmhGMM_Set_state(AS_DETACHED); break; case GMMREG_DT_IMSI: cmhGMM_Set_state(AS_ATTACHED); break; case GMMREG_DT_DISABLE_GPRS: cmhGMM_Set_state(AS_SUSPENTED); break; default: break; } switch ( detach_type ) { case GMMREG_DT_IMSI: gmmShrdPrm.current_attach_type = GMMREG_AT_GPRS; break; case GMMREG_DT_GPRS: gmmShrdPrm.current_attach_type = GMMREG_AT_IMSI; break; case GMMREG_DT_COMB: case GMMREG_DT_LIMITED_SERVICE: case GMMREG_DT_SIM_REMOVED: case GMMREG_DT_POWER_OFF: gmmShrdPrm.current_attach_type = ATTACH_TYPE_DETACHED; break; } /* * Inform CMH SM about new attach state */ cmhSM_GprsAttached( GPRS_DETACH ); switch( gmmEntStat.curCmd ) { case( AT_CMD_CGCLASS ): case( AT_CMD_CGATT ): R_AT( RAT_OK, gmmEntStat.entOwn ) ( gmmEntStat.curCmd ); /* log result */ cmh_logRslt ( gmmEntStat.entOwn, RAT_OK, gmmEntStat.curCmd, -1, BS_SPEED_NotPresent,CME_ERR_NotPresent ); break; } gmmEntStat.curCmd = AT_CMD_NONE; } /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_NetDetach | +-------------------------------------------------------------------+ PURPOSE : ME is detached by the network */ GLOBAL void cmhGMM_NetDetach ( UBYTE detach_type, USHORT cause, UBYTE search_running ) { UBYTE cme_err; /* error number */ SHORT i; TRACE_FUNCTION ("cmhGMM_NetDetach()"); switch (detach_type) { case GMMREG_DT_GPRS: case GMMREG_DT_COMB: for( i = 0 ; i < CMD_SRC_MAX; i++ ) { R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_NW_DETACH, NULL ); R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_NW_DETACH, NULL ); } /*lint -fallthrough */ case GMMREG_DT_SIM_REMOVED: case GMMREG_DT_LIMITED_SERVICE: cmhGMM_Set_state(AS_DETACHED); break; case GMMREG_DT_IMSI: cmhGMM_Set_state(AS_ATTACHED); break; case GMMREG_DT_DISABLE_GPRS: cmhGMM_Set_state(AS_SUSPENTED); break; case GMMREG_DT_POWER_OFF: default: break; } switch (detach_type) { case GMMREG_DT_GPRS: gmmShrdPrm.current_attach_type = GMMREG_AT_IMSI; break; case GMMREG_DT_IMSI: gmmShrdPrm.current_attach_type = GMMREG_AT_GPRS; break; case GMMREG_DT_COMB: case GMMREG_DT_SIM_REMOVED: case GMMREG_DT_LIMITED_SERVICE: case GMMREG_DT_POWER_OFF: gmmShrdPrm.current_attach_type = ATTACH_TYPE_DETACHED; break; } if( search_running EQ GMMREG_SEARCH_NOT_RUNNING) { if (work_cids[cid_pointer] NEQ PDP_CONTEXT_CID_INVALID) { /* * Inform CMH SM about the new attach state. */ cmhSM_GprsAttached( GPRS_DETACH ); } else { /* * map error cause */ switch(cause) { case GMMCS_ILLEGAL_MS: case MMCS_ILLEGAL_MS: cme_err = CME_ERR_GPRSBadMs; break; case GMMCS_ILLEGAL_ME: case MMCS_ILLEGAL_ME: cme_err = CME_ERR_GPRSBadMe; break; case GMMCS_GPRS_NOT_ALLOWED: /* No corrosponding MM cause */ cme_err = CME_ERR_GPRSNoService; break; case GMMCS_PLMN_NOT_ALLOWED: case MMCS_PLMN_NOT_ALLOWED: cme_err = CME_ERR_GPRSBadPlmn; break; case GMMCS_LA_NOT_ALLOWED: case MMCS_LA_NOT_ALLOWED: cme_err = CME_ERR_GPRSBadLoc; break; case GMMCS_ROAMING_NOT_ALLOWED: case MMCS_ROAMING_NOT_ALLOWED: cme_err = CME_ERR_GPRSNoRoam; break; case GMMCS_IMPLICIT_DETACHED: /* No corrosponding MM cause */ cme_err = CME_ERR_GPRSUnspec; break; case GMMCS_IMSI_UNKNOWN: case MMCS_IMSI_IN_HLR: case MMCS_IMEI_NOT_ACCEPTED: /* No corrosponding GMM cause */ case GMMCS_NO_MS_ID: /* No corrosponding MM cause */ cme_err = CME_ERR_SimFail; break; case GMMCS_GSM_GPRS_NOT_ALLOWED: /* No corrosponding MM cause */ case GMMCS_NET_FAIL: case MMCS_NETWORK_FAILURE: case GMMCS_MSC_TEMP_NOT_REACHABLE: /* No corrosponding MM cause */ case GMMCS_CONGESTION: case MMCS_CONGESTION: cme_err = CME_ERR_NoServ; break; default: cme_err = CME_ERR_Unknown; } /* If we get detach indication with search_running as false, then we should send error response to user. This is in the normal attach / cgclass case */ switch ( gmmEntStat.curCmd ) { case AT_CMD_CGCLASS: case AT_CMD_CGATT: R_AT( RAT_CME, gmmEntStat.entOwn ) ( gmmEntStat.curCmd, cme_err ); /* log result */ cmh_logRslt (gmmEntStat.entOwn, RAT_CME, gmmEntStat.curCmd,(SHORT)-1, (T_ACI_BS_SPEED)-1, (T_ACI_CME_ERR)cme_err ); break; } gmmEntStat.curCmd = AT_CMD_NONE; } } } /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_Plmn | +-------------------------------------------------------------------+ PURPOSE : reseive a PLMN list */ GLOBAL SHORT cmhGMM_Plmn ( void ) { TRACE_FUNCTION ("cmhGMM_Plmn()"); return GMMH_CMD_OK; } /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_Suspend | +-------------------------------------------------------------------+ PURPOSE : full service or limited service is available */ GLOBAL SHORT cmhGMM_Suspend ( UBYTE cell_state ) { TRACE_FUNCTION ("cmhGMM_Suspend()"); cmhGMM_Set_state( AS_SUSPENTED ); #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) cmhSAT_OpChnGPRSStat(SAT_GPRS_SUSPEND, SAT_GPRS_INV_CAUSE); #endif /* SIM_TOOLKIT AND FF_SAT_E */ return GMMH_CMD_OK; } /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_Resume | +-------------------------------------------------------------------+ PURPOSE : GPRS full service is now available */ GLOBAL SHORT cmhGMM_Resume ( void ) { TRACE_FUNCTION ("cmhGMM_Resume()"); cmhGMM_Set_state( AS_ATTACHED ); #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) cmhSAT_OpChnGPRSStat(SAT_GPRS_RESUME, SAT_GPRS_INV_CAUSE); #endif /* SIM_TOOLKIT AND FF_SAT_E */ return GMMH_CMD_OK; } /* +-------------------------------------------------------------------+ | PROJECT : GPRS (8441) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_Info | +-------------------------------------------------------------------+ PURPOSE : reseive the information provided by the GMM INFORMATION message. */ GLOBAL SHORT cmhGMM_Info ( void ) { TRACE_FUNCTION ("cmhGMM_Info()"); return GMMH_CMD_OK; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_GMMR | | ROUTINE : cmhGMM_CipheringInd | +-------------------------------------------------------------------+ PURPOSE : ciphering indication received */ GLOBAL SHORT cmhGMM_CipheringInd ( UBYTE gsm_ciph, UBYTE gprs_ciph ) { SHORT idx; /* holds index counter */ TRACE_FUNCTION ("cmhGMM_CipheringInd()"); if (simShrdPrm.ciSIMEnabled NEQ TRUE) { return 1; } for (idx = 0; idx < CMD_SRC_MAX; idx++) { /* *----------------------------------------------------------------- * new message indication *----------------------------------------------------------------- */ R_AT(RAT_P_CPRI,(T_ACI_CMD_SRC)idx)(gsm_ciph, gprs_ciph); } return 0; } #endif /* GPRS */ /*==== EOF ========================================================*/