FreeCalypso > hg > tcs211-fcmodem
diff g23m/condat/ms/src/aci/cmh_smr.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/condat/ms/src/aci/cmh_smr.c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,895 @@ +/* ++----------------------------------------------------------------------------- +| 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 session management ( SM ). ++----------------------------------------------------------------------------- +*/ + +#if defined (GPRS) && defined (DTI) + +#ifndef CMH_SMR_C +#define CMH_SMR_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 "aci.h" + +#include "dti_conn_mng.h" +#include "dti_cntrl_mng.h" + +#include "gaci.h" +#include "gaci_cmh.h" +#include "psa.h" +#include "psa_sm.h" +#include "psa_gppp.h" + +#include "cmh.h" +#include "cmh_sm.h" +#include "cmh_gppp.h" +#include "gaci_srcc.h" +#include "psa_uart.h" + +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) +#include "wap_aci.h" +#include "psa_tcpip.h" + +#include "psa_cc.h" +#include "cmh_cc.h" +#include "psa_sat.h" +#include "cmh_sat.h" + +#include "dcm_f.h" +#endif /* (CO_UDP_IP) || defined (FF_GPF_TCPIP) */ + +/*==== CONSTANTS ==================================================*/ + + +/*==== TYPES ======================================================*/ + + +/*==== EXPORT =====================================================*/ + +/*==== VARIABLES ==================================================*/ + +/*==== FUNCTIONS ==================================================*/ + + +static void dumpContextInfo(SHORT cid) +{ + TRACE_EVENT_P2("ERROR in context state: cid %d, state %d", + cid, pdp_context[cid-1].state); + TRACE_EVENT_P3("dump: nsapi %d, srcID %d, connected entity %d", + pdp_context[cid-1].nsapi, pdp_context[cid-1].owner, + pdp_context[cid-1].entity_id); + if(smEntStat.curCmd NEQ AT_CMD_NONE) + { + TRACE_EVENT_P1("dump running command: %d", smEntStat.curCmd); + } + TRACE_EVENT_P3("dump link_ids: new %d sn %d uart %d", + pdp_context[cid-1].link_id_new, pdp_context[cid-1].link_id_sn, + pdp_context[cid-1].link_id_uart); +} + +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) +static BOOL is_ip_dti_id(T_DTI_ENTITY_ID dti_id) +{ + if(is_gpf_tcpip_call()) { + GPF_TCPIP_STATEMENT(return dti_id EQ DTI_ENTITY_TCPIP); + } + else { + return dti_id EQ DTI_ENTITY_IP; + } +} +#endif + +static void get_dns_address(char* dns1, char *dns2, UBYTE *pco, UBYTE len) +{ + ULONG tmp_dns1, tmp_dns2, gateway; + utl_analyze_pco(pco,len, &tmp_dns1, &tmp_dns2, &gateway); + + sprintf(dns1, "%03u.%03u.%03u.%03u", (tmp_dns1 & 0xff000000) >> 24, + (tmp_dns1 & 0x00ff0000) >> 16, + (tmp_dns1 & 0x0000ff00) >> 8 , + (tmp_dns1 & 0x000000ff) ); + sprintf(dns2, "%03u.%03u.%03u.%03u", (tmp_dns2 & 0xff000000) >> 24, + (tmp_dns2 & 0x00ff0000) >> 16, + (tmp_dns2 & 0x0000ff00) >> 8 , + (tmp_dns2 & 0x000000ff) ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finished ROUTINE : cmhSM_Activated | ++-------------------------------------------------------------------+ + + PURPOSE : confirms a successful context activation + +*/ +GLOBAL SHORT cmhSM_Activated ( T_SMREG_PDP_ACTIVATE_CNF *pdp_cnf ) +{ + T_CGEREP_EVENT_REP_PARAM event; + char dns1[16], dns2[16]; + SHORT _cid = work_cids[cid_pointer] - 1; + T_ACI_AT_CMD curCmd = smEntStat.curCmd; + UBYTE ip[4]; + int i = 0; + + TRACE_FUNCTION ("cmhSM_Activated()"); + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( get_state_working_cid() ) + { + case( CS_ACTIVATING ): + + R_AT( RAT_CGACT, smEntStat.entOwn )(pdp_context[_cid].link_id_new); + + set_state_working_cid( CS_ACTIVATED ); + + dti_cntrl_entity_connected( pdp_context[_cid].link_id_new, DTI_ENTITY_SNDCP, DTI_OK ); + pdp_context[_cid].link_id_sn = pdp_context[_cid].link_id_new; + pdp_context[_cid].link_id_new = DTI_LINK_ID_NOTPRESENT; + + sprintf(pdp_context[_cid].allocated_pdp_addr, "%03hd.%03hd.%03hd.%03hd", + pdp_cnf->pdp_address.buff[0], + pdp_cnf->pdp_address.buff[1], + pdp_cnf->pdp_address.buff[2], + pdp_cnf->pdp_address.buff[3] ); + + cmhSM_set_PCO((SHORT)(_cid + 1), PCO_NETWORK, + &pdp_cnf->sdu.buf[pdp_cnf->sdu.o_buf >> 3], + (UBYTE) (pdp_cnf->sdu.l_buf >> 3)); + + get_dns_address(dns1, dns2, + (UBYTE*)pdp_context[_cid].network_pco.pco, + pdp_context[_cid].network_pco.len); + + TRACE_EVENT_P3("PDP Address: %s, DNS1: %s, DNS2: %s", + pdp_context[_cid].allocated_pdp_addr,dns1,dns2); + +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) + /* if WAP/TCPIP over GPRS is in progress, request WAP configuration */ + if ( is_ip_dti_id(pdp_context[_cid].entity_id) ) + { + psaTCPIP_Configure(NULL, pdp_context[_cid].allocated_pdp_addr, + NULL, (UBYTE*)dns1, (UBYTE*)dns2, 1500, + cmhSM_IP_activate_cb ); + } +#endif /* (CO_UDP_IP) || defined (FF_GPF_TCPIP) */ + + /* + * do we need one more context activation + */ + if ( FALSE EQ cmhSM_next_work_cid( curCmd ) ) + { + if( AT_CMD_CGACT EQ curCmd) + { + gaci_RAT_caller ( RAT_OK, (SHORT) (_cid + 1), (UBYTE) curCmd, 0 ); + + /* log result */ + cmh_logRslt ( pdp_context[_cid].owner, RAT_OK, curCmd, -1, -1, -1 ); + } + } + break; + + case( CS_ESTABLISH_2 ): + /* + *--------------------------------------------------------------- + * inform PPP + *--------------------------------------------------------------- + */ + cmhSM_set_PCO((SHORT)(_cid + 1), PCO_NETWORK, + &pdp_cnf->sdu.buf[pdp_cnf->sdu.o_buf >> 3], + (UBYTE) (pdp_cnf->sdu.l_buf >> 3)); + + sprintf(pdp_context[_cid].allocated_pdp_addr, "%03hd.%03hd.%03hd.%03hd", + pdp_cnf->pdp_address.buff[0], + pdp_cnf->pdp_address.buff[1], + pdp_cnf->pdp_address.buff[2], + pdp_cnf->pdp_address.buff[3] ); + + cmhSM_pdp_address_to_ip(&pdp_context[_cid].allocated_pdp_addr, ip); + + psaGPPP_PDP_Activate(pdp_cnf->ppp_hc, pdp_cnf->msid, ip, + &pdp_cnf->sdu.buf[pdp_cnf->sdu.o_buf >> 3], + (UBYTE) (pdp_cnf->sdu.l_buf >> 3)); + + set_state_working_cid( CS_ESTABLISH_3 ); + + dti_cntrl_entity_connected( pdp_context[_cid].link_id_new, DTI_ENTITY_SNDCP, DTI_OK ); + + pdp_context[_cid].link_id_sn = pdp_context[_cid].link_id_new; + pdp_context[_cid].link_id_new = DTI_LINK_ID_NOTPRESENT; + + break; + + default: + return -1; + } + + /* + * %CGEV - GPRS event reporting + */ + strcpy(event.act.pdp_type, pdp_context[_cid].con.pdp_type); + strcpy(event.act.pdp_addr, pdp_context[_cid].allocated_pdp_addr); + event.act.cid = _cid + 1; + + if (smShrdPrm.direc == DIREC_MO) + { + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_P_CGEV, i ) ( CGEREP_EVENT_ME_ACT, &event ); + } + } + else + { + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_P_CGEV, i ) ( CGEREP_EVENT_NW_ACT, &event ); + } + } + + return 0; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finished ROUTINE : | ++-------------------------------------------------------------------+ + + PURPOSE : + +*/ + +LOCAL void cp_pdp_rej_prim(T_SMREG_PDP_ACTIVATE_REJ * pdp_activate_rej, + T_PPP_PDP_ACTIVATE_REJ *activate_result) +{ + + activate_result->ppp_cause = pdp_activate_rej->smreg_cause; + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finished ROUTINE : cmhSM_NoActivate | ++-------------------------------------------------------------------+ + + PURPOSE : indicates a context activation failed + +*/ +GLOBAL SHORT cmhSM_NoActivate ( void ) +{ + T_CGEREP_EVENT_REP_PARAM event; + T_CONTEXT_STATE state; + T_DTI_CONN_LINK_ID link_id; + int i = 0; + + TRACE_FUNCTION ("cmhSM_NoActivate()"); +/* + *------------------------------------------------------------------- + * Set error cause for SIM owner + *------------------------------------------------------------------- + */ +#ifdef FF_SAT_E + gaci_SAT_err(smShrdPrm.pdp_rej->smreg_cause); +#endif /* FF_SAT_E */ +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( state = get_state_working_cid() ) + { + case CS_UNDEFINED: + case CS_DEFINED: + case CS_ESTABLISH_1: + case CS_ESTABLISH_3: + case CS_ACTIVATED: + case CS_WAITS_FOR_ACTIVATING: + case CS_DATA_LINK: + case CS_DEACTIVATE_NORMAL: + case CS_CONTEXT_REACTIVATION_1: + case CS_CONTEXT_REACTIVATION_2: + case CS_BREAKDOWN_LINK_ERROR: + case CS_BREAKDOWN_LINK_NORMAL: + dumpContextInfo(work_cids[cid_pointer]); + return 0; + case CS_ACTIVATING: + link_id = cmhSM_get_link_id_SNDCP_peer(work_cids[cid_pointer], SNDCP_PEER_NORMAL); + + switch(pdp_context[work_cids[cid_pointer] - 1].entity_id) + { + case DTI_ENTITY_PKTIO: + case DTI_ENTITY_PSI: + set_state_working_cid( CS_DEACTIVATE_NORMAL); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(link_id)); +/* gaci_RAT_caller(RAT_NO_CARRIER, work_cids[cid_pointer], AT_CMD_CGDATA, 0); */ + break; +#if defined (CO_UDP_IP) OR defined (FF_GPF_TCPIP) + case DTI_ENTITY_IP: + GPF_TCPIP_STATEMENT(case DTI_ENTITY_TCPIP:) + set_state_working_cid( CS_DEFINED); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(link_id)); + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + dti_cntrl_entity_disconnected( link_id, DTI_ENTITY_SNDCP ); + break; +#endif /* WAP OR FF_SAT_E OR FF_GPF_TCPIP */ + default: + /* in this case is SMREG_PDP_ACTIVATE_REJ the same as SMREG_DEACTIVATE_CNF */ + + /* set parameter for SMREG_DEACTIVATE_CNF */ + smShrdPrm.nsapi_set = 1 << smShrdPrm.pdp_rej->smreg_nsapi; + cmhSM_Deactivated(); /* SMREG_DEACTIVATE_CNF */ + + /* the last expected primitive from SM */ + smEntStat.curCmd = AT_CMD_NONE; + return 0; + } + + /* + * GPRS event reporting + */ + strcpy(event.act.pdp_type, pdp_context[work_cids[cid_pointer] - 1].con.pdp_type); + strcpy(event.act.pdp_addr, pdp_context[work_cids[cid_pointer] - 1].allocated_pdp_addr); + event.act.cid = work_cids[cid_pointer]; + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, i ) ( CGEREP_EVENT_ME_DEACT, &event ); + R_AT( RAT_P_CGEV, i ) ( CGEREP_EVENT_ME_DEACT, &event ); + } + + cmhSM_GiveNSapiFree(work_cids[cid_pointer]); + cmhSM_contextDeactivated(); + break; + case CS_ESTABLISH_2: + case CS_ABORT_ESTABLISH: + /* in this case is SMREG_PDP_ACTIVATE_REJ the same as SMREG_DEACTIVATE_CNF */ + + /* set parameter for SMREG_DEACTIVATE_CNF */ + smShrdPrm.nsapi_set = 1 << smShrdPrm.pdp_rej->smreg_nsapi; + + cmhSM_Deactivated(); /* SMREG_DEACTIVATE_CNF */ + + /* the last expected primitive from SM */ + smEntStat.curCmd = AT_CMD_NONE; + + if ( state NEQ CS_ESTABLISH_2) + { + return 0; + } + + /* + *--------------------------------------------------------------- + * inform PPP + *--------------------------------------------------------------- + */ + { + PALLOC(act_rej_temp,PPP_PDP_ACTIVATE_REJ); /* ppass*/ + cp_pdp_rej_prim(smShrdPrm.pdp_rej,act_rej_temp); + gpppShrdPrm.setPrm[gpppEntStat.entOwn].pdp_rej = act_rej_temp; + } + + if( psaGPPP_PDP_Reject() < 0 ) + { + TRACE_EVENT( "FATAL RETURN psaPPP_PDP_Reject in +CGDATA" ); + ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal ); + return -1 ; + } + + set_state_working_cid( CS_ABORT_ESTABLISH ); + break; + default: + return -1; + } + + return 0; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finished ROUTINE : cmhSM_NetActivate | ++-------------------------------------------------------------------+ + + PURPOSE : indicates a network asked for a PDP context activation + +*/ +GLOBAL void cmhSM_NetActivate ( void ) +{ + T_CGEREP_EVENT_REP_PARAM event; + SHORT i = 0, /* holds index counter */ + context_reactivation = 0, cid; + + TRACE_FUNCTION ("cmhSM_NetActivate()"); + + /* + * in first only one requested context activation is provided + * and the request will be rejected if an other context will be + * activated + */ + + /* + * it's no check to CC neccesary, because this is no class A mobile + */ + + if ( TRUE EQ cmhSM_is_smreg_ti_used( smShrdPrm.act_ind.smreg_ti, &cid ) ) + context_reactivation = 1; + + /* + * no PDP context is during the setup + */ + if ( work_cids[cid_pointer] EQ INVALID_CID && + gprs_ct_index < MAX_GPRS_CALL_TABLE_ENTRIES && + ( TRUE EQ srcc_reserve_sources( SRCC_PPPS_SNDCP_LINK, 1 ) || + context_reactivation EQ 1) ) + { +/* + *------------------------------------------------------------------- + * ring for call, if no call is in use + *------------------------------------------------------------------- + */ + +#ifdef AT_INTERPRETER + /* V.24 Ring Indicator Line */ + /* io_setRngInd ( IO_RS_ON, CRING_TYP_NotPresent, CRING_TYP_NotPresent dummy parameters here, need real ones when used); */ +#endif + + /* fill gprs call table */ + memcpy(&gprs_call_table[gprs_ct_index].sm_ind, &smShrdPrm.act_ind, sizeof(T_SMREG_PDP_ACTIVATE_IND)); + + /* no context reactivation */ + if ( context_reactivation NEQ 1 ) + { + gprs_call_table[gprs_ct_index].reactivation = GCTT_NORMAL; + *gprs_call_table[gprs_ct_index].L2P = 0; + gprs_call_table[gprs_ct_index].cid = INVALID_CID; + gprs_ct_index++; + + for( i = 0 ; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CRING, i ) ( CRING_MOD_Gprs, CRING_TYP_GPRS, CRING_TYP_NotPresent ); + } + } + else + { /* context reactivation */ + gprs_call_table[gprs_ct_index].reactivation = GCTT_REACTIVATION ; + strcpy(gprs_call_table[gprs_ct_index].L2P, "PPP"); + gprs_call_table[gprs_ct_index].cid = cid; + gprs_ct_index++; + } + + } + else + /* + * one or more PDP contexts are during the setup + */ + { + psaSM_PDP_No_activate(smShrdPrm.act_ind.smreg_ti, SMREG_RC_INSUF_RES); + + /* + * GPRS event reporting + */ + cmhSM_pdp_typ_to_string(smShrdPrm.act_ind.pdp_type, event.reject.pdp_type); + memcpy(&event.reject.pdp_addr, + &smShrdPrm.act_ind.pdp_address.buff, + smShrdPrm.act_ind.pdp_address.c_buff); + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, i ) ( CGEREP_EVENT_REJECT, &event ); + R_AT( RAT_P_CGEV, i ) ( CGEREP_EVENT_REJECT, &event ); + } + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finnished ROUTINE : cmhSM_Deactivated | ++-------------------------------------------------------------------+ + + PURPOSE : confirms a successful PDP context deactivation + +*/ +GLOBAL void cmhSM_Deactivated ( void ) +{ + T_CGEREP_EVENT_REP_PARAM event; + T_CONTEXT_STATE state; + SHORT cid, + i, + reactivation = 0, + rat_id = RAT_MAX; + UBYTE cme_err = CME_ERR_GPRSUnspec, /* error number */ + cmdBuf = smEntStat.curCmd; /* buffers current command */ + USHORT temp_nsapiSet = smShrdPrm.nsapi_set; + T_DTI_CONN_LINK_ID dti_id_sn; + UBYTE srcId = srcId_cb; + + TRACE_FUNCTION ("cmhSM_Deactivated()"); + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + + while ( CS_INVALID_STATE NEQ (state = get_state_over_nsapi_set( &smShrdPrm.nsapi_set, &cid )) ) + { + dti_id_sn = cmhSM_get_link_id_SNDCP_peer( cid, SNDCP_PEER_NORMAL ); + + switch ( state ) + { + case CS_UNDEFINED: + case CS_DEFINED: + case CS_WAITS_FOR_ACTIVATING: + case CS_ESTABLISH_1: + case CS_ESTABLISH_3: + case CS_ACTIVATED: + case CS_DATA_LINK: + default: + dumpContextInfo(cid); + continue; + case CS_ESTABLISH_2: + set_state_over_cid ( cid, CS_ABORT_ESTABLISH ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + break; + case CS_ABORT_ESTABLISH: + case CS_BREAKDOWN_LINK_ERROR: + TRACE_EVENT("state: CS_BREAKDOWN_LINK_ERROR"); + set_state_over_cid ( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + if(ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Disable) + rat_id = RAT_NO_CARRIER; + else + rat_id = RAT_CME; + break; + case CS_BREAKDOWN_LINK_NORMAL: + TRACE_EVENT("state: CS_BREAKDOWN_LINK_NORMAL"); + set_state_over_cid ( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + rat_id = RAT_NO_CARRIER; + break; + case CS_DEACTIVATE_NORMAL: + TRACE_EVENT("state: CS_DEACTIVATE_NORMAL") ; + set_state_over_cid ( cid, CS_DEFINED ); +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) + if ( is_ip_dti_id(pdp_context[cid-1].entity_id) ) + { + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + } + else +#endif /* CO_UDP_IP || FF_GPF_TCPIP */ + { + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + } + break; + case CS_ACTIVATING: + TRACE_EVENT("state: CS_ACTIVATING"); + set_state_over_cid ( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + if(pdp_context[cid - 1].entity_id EQ DTI_ENTITY_NULL) + { + rat_id = RAT_CME; + } + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + break; + case CS_CONTEXT_REACTIVATION_1: + TRACE_EVENT("state: CD_CONTEXT_REACTIVATION_1"); + set_state_over_cid(cid, CS_CONTEXT_REACTIVATION_2); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + smEntStat.curCmd = AT_CMD_NONE; + cmhSM_GiveNSapiFree(cid); + continue; + case CS_CONTEXT_REACTIVATION_2: + TRACE_EVENT("state: CD_CONTEXT_REACTIVATION_2"); + set_state_over_cid ( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + smEntStat.curCmd = AT_CMD_NONE; + rat_id = RAT_NO_CARRIER; + reactivation = 1; + break; + } + + if ( reactivation EQ 0 ) + { + if ( smEntStat.entOwn EQ get_owner_over_cid(cid) ) + switch( smEntStat.curCmd ) + { + case( AT_CMD_CGDATA ): + case( AT_CMD_CGACT ): + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + *work_cids = 0; + } + } + + /* + * GPRS event reporting + */ + strcpy(event.act.pdp_type, pdp_context[cid - 1].con.pdp_type); + strcpy(event.act.pdp_addr, pdp_context[cid - 1].allocated_pdp_addr); + event.act.cid = cid; + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, i ) ( CGEREP_EVENT_ME_DEACT, &event ); + R_AT( RAT_P_CGEV, i ) ( CGEREP_EVENT_ME_DEACT, &event ); + } + + cmhSM_GiveNSapiFree(cid); + + if ( rat_id NEQ RAT_MAX ) + { + gaci_RAT_caller ( rat_id, cid, cmdBuf, cme_err ); + + rat_id = RAT_MAX; + cid_pointer = 0; + *work_cids = 0; + + cmhSM_context_reactivation(); + } + } + + cmhSM_context_deactivated(temp_nsapiSet); + cmhSM_contextDeactivated(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finnished ROUTINE : cmhSM_NetDeactivate | ++-------------------------------------------------------------------+ + + PURPOSE : indicates a PDP context deactivation + +*/ +GLOBAL void cmhSM_NetDeactivate ( void ) +{ + T_CGEREP_EVENT_REP_PARAM event; + T_CONTEXT_STATE state; + SHORT cid, + i = 0, + inform_ppp = 1, + rat_id = RAT_MAX; + UBYTE cme_err = CME_ERR_Unknown, /* error number */ + cmdBuf = AT_CMD_NONE; /* buffers current command */ + USHORT temp_nsapiSet = smShrdPrm.nsapi_set; + T_DTI_CONN_LINK_ID dti_id_sn; + UBYTE srcId = srcId_cb; + + TRACE_FUNCTION ("cmhSM_NetDeactivate()"); + + while ( CS_INVALID_STATE NEQ (state = get_state_over_nsapi_set( &smShrdPrm.nsapi_set, &cid )) ) + { + dti_id_sn = cmhSM_get_link_id_SNDCP_peer( cid, SNDCP_PEER_NORMAL ); + + switch ( state ) + { + case CS_UNDEFINED: + case CS_DEFINED: + case CS_ESTABLISH_1: + case CS_WAITS_FOR_ACTIVATING: + continue; + case CS_ESTABLISH_2: + case CS_ESTABLISH_3: + set_state_over_cid( cid, CS_ABORT_ESTABLISH ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + break; + case CS_ABORT_ESTABLISH: + set_state_over_cid( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + inform_ppp = 0; + if(ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Disable) + rat_id = RAT_NO_CARRIER; + else + rat_id = RAT_CME; + break; + case CS_BREAKDOWN_LINK_ERROR: + set_state_over_cid( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + if(ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Disable) + rat_id = RAT_NO_CARRIER; + else + rat_id = RAT_CME; + inform_ppp = 0; + break; + case CS_BREAKDOWN_LINK_NORMAL: + set_state_over_cid( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + rat_id = RAT_NO_CARRIER; + inform_ppp = 0; + break; + case CS_DATA_LINK: + set_state_over_cid( cid, CS_BREAKDOWN_LINK_NORMAL ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + break; + case CS_ACTIVATED: + inform_ppp = 0; + set_state_over_cid( cid, CS_DEFINED ); +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) + if ( is_ip_dti_id(pdp_context[cid-1].entity_id) ) + { + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + } + else +#endif /* CO_UDP_IP || FF_GPF_TCPIP */ + { + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + } + break; + case CS_DEACTIVATE_NORMAL: + inform_ppp = 0; + set_state_over_cid( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) + if ( is_ip_dti_id(pdp_context[cid-1].entity_id) ) + { + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + } + else +#endif /* CO_UDP_IP || FF_GPF_TCPIP */ + { + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + } + break; + case CS_ACTIVATING: + inform_ppp = 0; + set_state_over_cid( cid, CS_DEFINED ); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) + if ( is_ip_dti_id(pdp_context[cid-1].entity_id) ) + { + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + } + else +#endif /* CO_UDP_IP OR FF_GPF_TCPIP */ + { + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + } + if(pdp_context[cid - 1].entity_id EQ DTI_ENTITY_NULL) + { + rat_id = RAT_CME; + } + break; + case CS_CONTEXT_REACTIVATION_1: + set_state_over_cid(cid, CS_CONTEXT_REACTIVATION_2); + cmhSM_stop_context_reactivation(); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + cmhSM_GiveNSapiFree(cid); + continue; + case CS_CONTEXT_REACTIVATION_2: + set_state_over_cid( cid, CS_DEFINED ); + cmhSM_stop_context_reactivation(); + dti_cntrl_entity_disconnected( dti_id_sn, DTI_ENTITY_SNDCP ); + rat_id = RAT_NO_CARRIER; + inform_ppp = 0; + break; + } + + if ( inform_ppp ) + { + /* + *--------------------------------------------------------------- + * inform PPP + *--------------------------------------------------------------- + */ + psaGPPP_Terminate( PPP_LOWER_LAYER_UP ); + } + + if ( smEntStat.entOwn EQ get_owner_over_cid(cid) ) + switch( smEntStat.curCmd ) + { + case( AT_CMD_CGDATA ): + case( AT_CMD_CGACT ): + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + *work_cids = 0; + } + + /* + * GPRS event reporting + */ + strcpy(event.act.pdp_type, pdp_context[cid - 1].con.pdp_type); + strcpy(event.act.pdp_addr, pdp_context[cid - 1].allocated_pdp_addr); + event.act.cid = cid; + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, i ) ( CGEREP_EVENT_NW_DEACT, &event ); + R_AT( RAT_P_CGEV, i ) ( CGEREP_EVENT_NW_DEACT, &event ); + } + + cmhSM_GiveNSapiFree (cid); + + if ( rat_id NEQ RAT_MAX ) + { + gaci_RAT_caller ( rat_id, cid, cmdBuf, cme_err ); + + cid_pointer = 0; + *work_cids = 0; + rat_id = RAT_MAX; + } + } + + cmhSM_context_deactivated(temp_nsapiSet); + cmhSM_contextDeactivated(); + + /* inform SAT if needed */ +#if defined (FF_SAT_E) + cmhSAT_OpChnGPRSDeact(); +#endif + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finnished ROUTINE : cmhSM_NetModify | ++-------------------------------------------------------------------+ + + PURPOSE : indicates a network initiated PDP context modification + +*/ +GLOBAL void cmhSM_NetModify ( USHORT nsapi_set, T_smreg_qos *smreg_qos ) +{ + SHORT cid, i = 0; + + TRACE_FUNCTION ("cmhSM_NetModify()"); + + while ( CS_INVALID_STATE NEQ get_state_over_nsapi_set( &nsapi_set, &cid ) ) + { + pdp_context[cid - 1].qos.preced = smreg_qos->preced; + pdp_context[cid - 1].qos.delay = smreg_qos->delay; + pdp_context[cid - 1].qos.relclass = smreg_qos->relclass; + pdp_context[cid - 1].qos.peak = smreg_qos->peak; + pdp_context[cid - 1].qos.mean = smreg_qos->mean; + + for( i = 0 ; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_QOS_MOD, i ) ( cid, smreg_qos ); + } + } +} + +#endif /* GPRS */ +/*==== EOF ========================================================*/ +