FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/aci/cmh_gmmr.c @ 301:4bb5772a05a3
AT%SPVER: new command for setting custom speech version lists
The speech version list in the Bearer Capability IE tells the network
which speech codecs are supported by the MS, and in which order of
preference. The standard behaviour is to list all codecs that are
supported by the hw+fw platform, and the standard preference order
is newer over older, FR over HR. But sometimes it is desirable
(for network testing) to artificially restrict which codecs the test MS
will declare as supported, and/or to list them in some peculiar
non-standard order of preference. Add a new private AT command,
AT%SPVER, allowing the user to set and clear custom speech version
lists for the Bearer Capability IE composer in CC.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 21 May 2023 21:43:10 +0000 |
parents | fa8dc04885d8 |
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 ========================================================*/