FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-aci/aci/cmh_smr.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-aci/aci/cmh_smr.c Sun Oct 12 01:45:14 2014 +0000 @@ -0,0 +1,1476 @@ +/* ++----------------------------------------------------------------------------- +| 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 "psa_gmm.h" +#include "psa_sim.h" + +#include "cmh.h" +#include "cmh_sm.h" +#include "cmh_gmm.h" +#include "cmh_gppp.h" +#include "gaci_srcc.h" +#include "dti.h" /* functionality of the dti library */ + +#include "psa_uart.h" + +#if defined (CO_UDP_IP) OR 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) OR defined (FF_GPF_TCPIP) */ +#include "aci_lst.h" +#include "ati_int.h" + +/*==== CONSTANTS ==================================================*/ + +/*==== TYPES ======================================================*/ + +/*==== EXPORT =====================================================*/ + +/*==== VARIABLES ==================================================*/ +EXTERN T_PDP_CONTEXT_INTERNAL *p_pdp_context_list; + +/*==== FUNCTIONS ==================================================*/ + +static void dumpContextInfo(U8 cid) +{ + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + + p_pdp_context_node = pdp_context_find_node_from_cid( cid ); + + if( ! p_pdp_context_node ) + return; + + TRACE_EVENT_P2("ERROR in context state: cid %d, state %d", + cid, p_pdp_context_node->internal_data.state); + TRACE_EVENT_P3("dump: nsapi %d, srcID %d, connected entity %d", + CID_TO_NSAPI( cid ), p_pdp_context_node->internal_data.owner, + p_pdp_context_node->internal_data.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", + p_pdp_context_node->internal_data.link_id_new, p_pdp_context_node->internal_data.link_id, + p_pdp_context_node->internal_data.link_id_uart); +} + +#if defined (CO_UDP_IP) OR 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 ) +{ + char dns1[16], dns2[16]; + U8 cid = work_cids[cid_pointer]; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + T_ACI_AT_CMD curCmd = smEntStat.curCmd; + T_CGEREP_EVENT_REP_PARAM event; + int i = 0; + + TRACE_FUNCTION ("cmhSM_Activated()"); + + p_pdp_context_node = pdp_context_find_node_from_cid( cid ); + if( !p_pdp_context_node ) + { + TRACE_ERROR( "ERROR: PDP context not found, in function cmhSM_Activated" ); + return -1; + } + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( get_state_working_cid() ) + { + case( PDP_CONTEXT_STATE_ACTIVATING ): + + R_AT( RAT_CGACT, smEntStat.entOwn )( 0 ); + + set_state_working_cid( PDP_CONTEXT_STATE_ACTIVATED ); + + /* Storing of Dynamic address sent in SMREG_PDP_ACTIVATE_CNF message is missing in + Alborg code. + */ + p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address = pdp_cnf->ctrl_ip_address; + + if ( p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address ) + { + if ( p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address EQ NAS_is_ipv4 ) + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4, &pdp_cnf->ip_address.ipv4_addr.a4, NAS_SIZE_IPv4_ADDR ); + TRACE_EVENT_P1("PDP Address: %s", p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4); + } + else + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv6_addr.a6, &pdp_cnf->ip_address.ipv6_addr.a6, NAS_SIZE_IPv6_ADDR ); + TRACE_EVENT_P1("PDP Address: %s", p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv6_addr.a6); + } + } + else + { + if ( p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address EQ NAS_is_ipv4 ) + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4, &p_pdp_context_node->attributes.pdp_addr.ip_address.ipv4_addr.a4, NAS_SIZE_IPv4_ADDR ); + p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address = p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address; + TRACE_EVENT_P1("PDP Address: %s", p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4); + } + else if ( p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address EQ NAS_is_ipv6 ) + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv6_addr.a6, &p_pdp_context_node->attributes.pdp_addr.ip_address.ipv6_addr.a6, NAS_SIZE_IPv6_ADDR ); + p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address = p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address; + TRACE_EVENT_P1("PDP Address: %s", p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv6_addr.a6); + } + else + { + TRACE_ERROR( "ERROR: NO IP Address Assigned, In PDP_CONTEXT_STATE_ACTIVATING State" ); + } + } + + cmhSM_set_PCO( cid, + PCO_NETWORK, + &smShrdPrm.pdp_cnf->sdu.buf[smShrdPrm.pdp_cnf->sdu.o_buf >> 3], + (UBYTE) (smShrdPrm.pdp_cnf->sdu.l_buf >> 3)); + + get_dns_address(dns1, dns2, + p_pdp_context_node->internal_data.network_pco.pco, + p_pdp_context_node->internal_data.network_pco.len); + + TRACE_EVENT_P2("DNS1: %s, DNS2: %s", dns1, dns2); + +#if defined (CO_UDP_IP) OR defined (FF_GPF_TCPIP) + /* if WAP/TCPIP over GPRS is in progress, request WAP configuration */ + if ( is_ip_dti_id(p_pdp_context_node->internal_data.entity_id) ) + { + char c_ip_address[16]; + UBYTE* ip_address; + + ip_address = p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4; + sprintf (c_ip_address, "%03u.%03u.%03u.%03u", ip_address[0], + ip_address[1], + ip_address[2], + ip_address[3] ); + + psaTCPIP_Configure(NULL, (UBYTE*) c_ip_address, + NULL, (UBYTE*)dns1, (UBYTE*)dns2, 1500, + cmhSM_IP_activate_cb ); + } +#endif /* (CO_UDP_IP) OR 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, cid, (UBYTE) curCmd, 0 ); + + /* log result */ + cmh_logRslt ( p_pdp_context_node->internal_data.owner, RAT_OK, curCmd, -1, BS_SPEED_NotPresent,CME_ERR_NotPresent); +#if defined (FF_WAP) OR defined (FF_SAT_E) + if (Wap_Call) + { + gpppEntStat.curCmd = AT_CMD_NONE; + } +#endif /* WAP OR SAT E */ + } + } + + break; + + case( PDP_CONTEXT_STATE_ESTABLISH_2 ): + /* + *--------------------------------------------------------------- + * inform PPP + *--------------------------------------------------------------- + */ + cmhSM_set_PCO( cid , + PCO_NETWORK, + &smShrdPrm.pdp_cnf->sdu.buf[smShrdPrm.pdp_cnf->sdu.o_buf >> 3], + (UBYTE) (smShrdPrm.pdp_cnf->sdu.l_buf >> 3)); + + /* Storing of Dynamic address sent in SMREG_PDP_ACTIVATE_CNF message is missing in + Alborg code. + */ + p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address = smShrdPrm.pdp_cnf->ctrl_ip_address; + + if ( p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address ) + { + if ( p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address EQ NAS_is_ipv4 ) + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4, &smShrdPrm.pdp_cnf->ip_address.ipv4_addr.a4, NAS_SIZE_IPv4_ADDR ); + } + else + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv6_addr.a6, &smShrdPrm.pdp_cnf->ip_address.ipv6_addr.a6, NAS_SIZE_IPv6_ADDR ); + } + } + else + { + if ( p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address EQ NAS_is_ipv4 ) + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4, &p_pdp_context_node->attributes.pdp_addr.ip_address.ipv4_addr.a4, NAS_SIZE_IPv4_ADDR ); + p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address = p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address; + } + else if ( p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address EQ NAS_is_ipv6 ) + { + memcpy( p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv6_addr.a6, &p_pdp_context_node->attributes.pdp_addr.ip_address.ipv6_addr.a6, NAS_SIZE_IPv6_ADDR ); + p_pdp_context_node->internal_data.pdp_address_allocated.ctrl_ip_address = p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address; + } + else + { + TRACE_ERROR( "ERROR: NO IP Address Assigned, In PDP_CONTEXT_STATE_ESTABLISH_2" ); + } + } + + psaGPPP_PDP_Activate( &p_pdp_context_node->internal_data.pdp_address_allocated, + &smShrdPrm.pdp_cnf->sdu.buf[smShrdPrm.pdp_cnf->sdu.o_buf >> 3], + (UBYTE) (smShrdPrm.pdp_cnf->sdu.l_buf >> 3), + (UBYTE) CID_TO_NSAPI( cid ) ); + + set_state_working_cid( PDP_CONTEXT_STATE_ESTABLISH_3 ); + + break; + + default: + return -1; + } + + /* + * %CGEV - GPRS event reporting + */ + + strcpy( event.act.pdp_type, p_pdp_context_node->attributes.pdp_type ); + memcpy(&(event.act.pdp_addr), &(p_pdp_context_node->internal_data.pdp_address_allocated), sizeof(T_NAS_ip)); + + event.act.cid = cid; + + if( smShrdPrm.direc EQ CGEREP_EVENT_ME_ACT ) + { + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_ACT, &event ); + } + } + else + { + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)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 ) +{ + +} + +/* ++-------------------------------------------------------------------+ +| 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_PDP_CONTEXT_STATE state; + T_DTI_CONN_LINK_ID link_id; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + int i = 0; + + TRACE_FUNCTION ("cmhSM_NoActivate()"); +/* + *------------------------------------------------------------------- + * Set error cause for SIM owner + *------------------------------------------------------------------- + */ +#ifdef FF_SAT_E + gaci_SAT_err((UBYTE)smShrdPrm.pdp_rej->ps_cause.value.nwsm_cause); +#endif /* FF_SAT_E */ +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + + p_pdp_context_node = pdp_context_find_node_from_cid( NSAPI_TO_CID( smShrdPrm.pdp_rej->nsapi ) ); + if (!p_pdp_context_node ) + { + return -1; + } + + state = get_state_over_cid(p_pdp_context_node->cid); + + switch( state ) + { + case PDP_CONTEXT_STATE_INVALID: + case PDP_CONTEXT_STATE_DEFINED: + case PDP_CONTEXT_STATE_ATTACHING: + case PDP_CONTEXT_STATE_ESTABLISH_1: + case PDP_CONTEXT_STATE_ESTABLISH_3: + case PDP_CONTEXT_STATE_ACTIVATED: + case PDP_CONTEXT_STATE_ACTIVATED_ESTABLISH_1: + case PDP_CONTEXT_STATE_ACTIVATED_MODIFYING: + case PDP_CONTEXT_STATE_DATA_LINK: + case PDP_CONTEXT_STATE_DATA_LINK_MODIFYING: + case PDP_CONTEXT_STATE_DEACTIVATE_NORMAL: + case PDP_CONTEXT_STATE_REACTIVATION_1: + case PDP_CONTEXT_STATE_REACTIVATION_2: + case PDP_CONTEXT_STATE_BREAKDOWN_LINK_NORMAL: + dumpContextInfo(work_cids[cid_pointer]); + TRACE_ERROR("cmhSM_NoActivate(): State/Event error!!!"); + return 0; + + case PDP_CONTEXT_STATE_ACTIVATING: + /*Instead of: link_id = cmhSM_get_link_id_SNDCP_peer(work_cids[cid_pointer], SNDCP_PEER_NORMAL);*/ + link_id = p_pdp_context_node->internal_data.link_id; + + switch(p_pdp_context_node->internal_data.entity_id) + { + case DTI_ENTITY_PKTIO: + case DTI_ENTITY_PSI: + set_state_working_cid( PDP_CONTEXT_STATE_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( PDP_CONTEXT_STATE_DEACTIVATE_NORMAL ); + 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->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, p_pdp_context_node->attributes.pdp_type ); + memcpy(&(event.act.pdp_addr), &(p_pdp_context_node->attributes.pdp_addr), sizeof(T_NAS_ip)); + event.act.cid = work_cids[cid_pointer]; + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DEACT, &event ); + R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DEACT, &event ); + } + + cmhSM_contextDeactivated(); + break; + + case PDP_CONTEXT_STATE_ESTABLISH_2: + case PDP_CONTEXT_STATE_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 << CID_TO_NSAPI( p_pdp_context_node->cid ); + + cmhSM_Deactivated(); /* SMREG_DEACTIVATE_CNF */ + + /* the last expected primitive from SM */ + smEntStat.curCmd = AT_CMD_NONE; + + if( state NEQ PDP_CONTEXT_STATE_ESTABLISH_2 ) + { + return 0; + } + + /* + *--------------------------------------------------------------- + * inform PPP + *--------------------------------------------------------------- + */ + { + PALLOC( act_rej_temp, PPP_PDP_ACTIVATE_REJ ); /* ppass */ + gpppShrdPrm.setPrm[gpppEntStat.entOwn].pdp_rej = act_rej_temp; + act_rej_temp->ppp_cause = smShrdPrm.pdp_rej->ps_cause.value.ppp_cause; + } + + 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_over_cid( p_pdp_context_node->cid, PDP_CONTEXT_STATE_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; + U8 i = 0; /* holds index counter */ + U8 context_reactivation = 0; + U8 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( cmhSM_is_smreg_ti_used( smShrdPrm.act_ind.ti, &cid ) EQ TRUE ) + context_reactivation = 1; + + /* + * no PDP context is during the setup + */ + if ( work_cids[cid_pointer] EQ PDP_CONTEXT_CID_INVALID AND + gprs_ct_index < MAX_GPRS_CALL_TABLE_ENTRIES + AND + ( TRUE EQ srcc_reserve_sources( SRCC_PPPS_SNDCP_LINK, 1 ) OR + 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 = PDP_CONTEXT_CID_INVALID; + gprs_ct_index++; + + for( i = 0 ; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CRING, (T_ACI_CMD_SRC)i ) ( CRING_MOD_Gprs, CRING_SERV_TYP_GPRS, CRING_SERV_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.ti, CAUSE_NWSM_INSUFFICIENT_RESOURCES); + + /* + * GPRS event reporting + */ + cmhSM_pdp_typ_to_string(smShrdPrm.act_ind.pdp_type, event.reject.pdp_type); + + event.reject.pdp_addr.ctrl_ip_address = smShrdPrm.act_ind.ctrl_ip_address; + + if (event.reject.pdp_addr.ctrl_ip_address EQ NAS_is_ipv4) + { + memcpy( &event.reject.pdp_addr.ip_address.ipv4_addr, &smShrdPrm.act_ind.ip_address.ipv4_addr.a4, NAS_SIZE_IPv4_ADDR ); + } + else + { + memcpy( &event.reject.pdp_addr.ip_address.ipv6_addr, &smShrdPrm.act_ind.ip_address.ipv6_addr.a6, NAS_SIZE_IPv6_ADDR ); + } + + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_REJECT, &event ); + R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)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_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + T_PDP_CONTEXT_STATE state; + + U8 cid; + SHORT i, + reactivation = 0, + rat_id = RAT_MAX; + UBYTE cme_err = CME_ERR_GPRSUnspec, /* error number */ + cmdBuf = smEntStat.curCmd; /* buffers current command */ + U16 nsapi_set_to_free = smShrdPrm.nsapi_set; + T_DTI_CONN_LINK_ID dti_link_id; + UBYTE srcId = srcId_cb; + + TRACE_FUNCTION ("cmhSM_Deactivated()"); + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + + /* 28592 cmhSM_context_deactivated(smShrdPrm.nsapi_set); */ + + while((state = get_state_over_nsapi_set( &smShrdPrm.nsapi_set, &cid )) AND state NEQ PDP_CONTEXT_STATE_INVALID ) + { + p_pdp_context_node = pdp_context_find_node_from_cid( cid ); + if( !p_pdp_context_node ) + { + TRACE_ERROR( "ERROR: PDP context not found, in function cmhSM_Deactivated" ); + return; + } + + dti_link_id = p_pdp_context_node->internal_data.link_id; + + switch ( state ) + { + case PDP_CONTEXT_STATE_INVALID: + case PDP_CONTEXT_STATE_DEFINED: + case PDP_CONTEXT_STATE_ATTACHING: + case PDP_CONTEXT_STATE_ESTABLISH_1: + case PDP_CONTEXT_STATE_ESTABLISH_3: + case PDP_CONTEXT_STATE_ACTIVATED: + case PDP_CONTEXT_STATE_ACTIVATED_ESTABLISH_1: + case PDP_CONTEXT_STATE_ACTIVATED_MODIFYING: + case PDP_CONTEXT_STATE_DATA_LINK: + case PDP_CONTEXT_STATE_DATA_LINK_MODIFYING: + default: + dumpContextInfo(cid); + continue; + + case PDP_CONTEXT_STATE_ESTABLISH_2: + + set_state_over_cid ( cid, PDP_CONTEXT_STATE_ABORT_ESTABLISH ); + //asdf dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + + break; + + case PDP_CONTEXT_STATE_ABORT_ESTABLISH: + TRACE_EVENT("state: PDP_CONTEXT_STATE_ABORT_ESTABLISH"); + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + 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 PDP_CONTEXT_STATE_BREAKDOWN_LINK_NORMAL: + TRACE_EVENT("state: CS_BREAKDOWN_LINK_NORMAL"); + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + rat_id = RAT_NO_CARRIER; + break; + + case PDP_CONTEXT_STATE_DEACTIVATE_NORMAL: + TRACE_EVENT("state: PDP_CONTEXT_DEACTIVATE_NORMAL") ; + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + +#if defined(FF_PKTIO) OR defined(FF_TCP_IP) + if( p_pdp_context_node->internal_data.entity_id EQ DTI_ENTITY_PKTIO ) + { + /* Issue OMAPS00072119: For PKTIO, delete the SNDCP counter */ + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + } +#endif + +#if defined (CO_UDP_IP) OR defined (FF_GPF_TCPIP) + if ( is_ip_dti_id(p_pdp_context_node->internal_data.entity_id) ) + if( Wap_Call ) + { + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + } +#else /* (CO_UDP_IP) OR defined (FF_GPF_TCPIP) */ + rat_id = RAT_NO_CARRIER; +#endif + break; + + case PDP_CONTEXT_STATE_ACTIVATING: + TRACE_EVENT("state: PDP_CONTEXT_STATE_ACTIVATING"); + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + + /* 18th April 2005. As till this date we are not handiling the correct + cause value between ACI and SM. As we are not mapping the cause values + sent by SM enity to ACI. This is creating problem to display wrong ERROR + values .*/ + + cme_err = cmhSM_mapSM2ACI_Cause(smShrdPrm.pdp_rej->ps_cause.value.nwsm_cause); + rat_id = RAT_CME; + break; + + case PDP_CONTEXT_STATE_REACTIVATION_1: + TRACE_EVENT("state: PDP_CONTEXT_STATE_REACTIVATION_1"); + set_state_over_cid ( cid, PDP_CONTEXT_STATE_REACTIVATION_2 ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + smEntStat.curCmd = AT_CMD_NONE; + nsapi_set_to_free &= ~( 1U << CID_TO_NSAPI(cid) ); /* 28592 */ + continue; + + case PDP_CONTEXT_STATE_REACTIVATION_2: + TRACE_EVENT("state: PDP_CONTEXT_STATE_REACTIVATION_2"); + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + 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 ) + { + switch( smEntStat.curCmd ) + { + case( AT_CMD_CGDATA ): + case( AT_CMD_CGACT ): + TRACE_EVENT_P2("cmhSM_Deactivated: smEntStat.entOwn: Source = %d and GPRS related AT Command is smEntStat.curCmd: = %d", smEntStat.entOwn, smEntStat.curCmd ); + cmhSM_clear_work_cids(cid); + break; + default: + TRACE_EVENT_P1("cmhSM_Deactivated: Current AT Command is smEntStat.curCmd: = %d", smEntStat.curCmd); + break; + } + } + + strcpy( event.act.pdp_type, p_pdp_context_node->attributes.pdp_type ); + memcpy(&(event.act.pdp_addr), &(p_pdp_context_node->internal_data.pdp_address_allocated), sizeof(T_NAS_ip)); + + event.act.cid = cid; + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DEACT, &event ); + R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DEACT, &event ); + } + + if ( rat_id NEQ RAT_MAX ) + { + gaci_RAT_caller ( rat_id, cid, cmdBuf, cme_err ); + + rat_id = RAT_MAX; + + cmhSM_clear_work_cids(cid); + cmhSM_context_reactivation(); + } + } + + cmhSM_context_deactivated(nsapi_set_to_free); /* 28592 */ + 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_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + T_PDP_CONTEXT_INTERNAL *p_prev_pdp_context_node = NULL; + T_CGEREP_EVENT_REP_PARAM event; + T_PDP_CONTEXT_STATE state; + U8 cid; + SHORT i = 0, + inform_ppp = 1, + rat_id = RAT_MAX; + UBYTE cme_err = CME_ERR_Unknown, /* error number */ + cmdBuf = AT_CMD_NONE; /* buffers current command */ + T_DTI_CONN_LINK_ID dti_link_id; + + USHORT temp_nsapiSet = smShrdPrm.nsapi_set; + UBYTE srcId = srcId_cb; + + + TRACE_FUNCTION ("cmhSM_NetDeactivate()"); + + /* 28592 cmhSM_context_deactivated(smShrdPrm.nsapi_set); */ + + while( (smShrdPrm.nsapi_set) AND (PDP_CONTEXT_STATE_INVALID NEQ (state = get_state_over_nsapi_set( &smShrdPrm.nsapi_set, &cid )) )) + { + + p_pdp_context_node = pdp_context_find_node_from_cid( cid ); + if( !p_pdp_context_node ) + { + TRACE_ERROR( "ERROR: PDP context not found, in function cmhSM_NetDeactivate" ); + continue; /* Try the next... */ + } + + dti_link_id = p_pdp_context_node->internal_data.link_id; + + switch ( state ) + { + case PDP_CONTEXT_STATE_INVALID: + case PDP_CONTEXT_STATE_DEFINED: + case PDP_CONTEXT_STATE_ESTABLISH_1: + case PDP_CONTEXT_STATE_ATTACHING: + TRACE_EVENT("PDP context state ignored, continue"); + continue; + + case PDP_CONTEXT_STATE_ESTABLISH_2: + case PDP_CONTEXT_STATE_ESTABLISH_3: + case PDP_CONTEXT_STATE_ACTIVATED_ESTABLISH_1: + set_state_over_cid ( cid, PDP_CONTEXT_STATE_ABORT_ESTABLISH ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + break; + + case PDP_CONTEXT_STATE_ABORT_ESTABLISH: + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + 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 PDP_CONTEXT_STATE_BREAKDOWN_LINK_NORMAL: + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); + rat_id = RAT_NO_CARRIER; + inform_ppp = 0; + break; + +#ifdef REL99 + case PDP_CONTEXT_STATE_DATA_LINK_MODIFYING: + /* Reject +CGCMOD command if executing. Network context deactivation has higher priority. */ + if (smEntStat.curCmd EQ AT_CMD_CGCMOD) + { + /* Answer the executing source not the data source for cid */ + R_AT( RAT_CME, smEntStat.entOwn ) ( smEntStat.curCmd, CME_ERR_GPRSUnspec ); + /* Remove command */ + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + work_cids[0] = PDP_CONTEXT_CID_OMITTED; + } +#endif + /* Fall through */ + case PDP_CONTEXT_STATE_DATA_LINK: + set_state_over_cid ( cid, PDP_CONTEXT_STATE_BREAKDOWN_LINK_NORMAL ); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + break; +#ifdef REL99 + case PDP_CONTEXT_STATE_ACTIVATED_MODIFYING: + /* Reject +CGCMOD command if executing. Network context deactivation has higher priority. */ + if (smEntStat.curCmd EQ AT_CMD_CGCMOD) + { + /* Answer the executing source not the data source for cid */ + R_AT( RAT_CME, smEntStat.entOwn ) ( smEntStat.curCmd, CME_ERR_GPRSUnspec ); + /* Remove command */ + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + work_cids[0] = PDP_CONTEXT_CID_INVALID; + } + /* Fall through */ +#endif + case PDP_CONTEXT_STATE_ACTIVATED: + p_prev_pdp_context_node = pdp_context_find_node_from_cid( cid ); + inform_ppp = 0; + + /* Issue OMAPS00062126: new case of connection failed, AT+CGDATA return ERROR */ + if( (state EQ PDP_CONTEXT_STATE_ACTIVATED) AND + (p_prev_pdp_context_node->internal_data.entity_id EQ DTI_ENTITY_PKTIO) ) + { + TRACE_EVENT("Free the DTI Links for PKTIO Entity after AT+CFUN=0"); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(p_prev_pdp_context_node->internal_data.link_id)); + } + + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + +#if defined (CO_UDP_IP) OR defined (FF_GPF_TCPIP) + if ( is_ip_dti_id(p_pdp_context_node->internal_data.entity_id) ) + { + if ( p_prev_pdp_context_node->internal_data.entity_id EQ DTI_ENTITY_IP ) + { + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + } + } + else +#endif /* WAP OR SAT E */ + { + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + } + rat_id = RAT_NO_CARRIER; + + break; + + case PDP_CONTEXT_STATE_DEACTIVATE_NORMAL: + p_prev_pdp_context_node = pdp_context_find_node_from_cid( cid ); + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + +#if defined (FF_WAP) OR defined (FF_SAT_E) + inform_ppp = 0; + if ( p_prev_pdp_context_node->internal_data.entity_id EQ DTI_ENTITY_IP ) + { + /* tell WAP ACI that contextactivation was rejected */ + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + } + else +#endif /* WAP OR SAT E */ + { + cmhSM_disconnect_cid(cid, GC_TYPE_NULL); + } + rat_id = RAT_NO_CARRIER; /* it required ?!! */ + break; + + case PDP_CONTEXT_STATE_ACTIVATING: + p_prev_pdp_context_node = pdp_context_find_node_from_cid( cid ); + inform_ppp = 0; + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + +#if defined (FF_WAP) OR defined (FF_SAT_E) + if ( p_prev_pdp_context_node->internal_data.entity_id EQ DTI_ENTITY_IP ) + { + /* tell WAP ACI that contextactivation was rejected */ + psaTCPIP_Deactivate(cmhSM_IP_activate_cb); + dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(dti_link_id)); + } +#endif /* WAP OR SAT E */ + rat_id = RAT_CME; + break; + + case PDP_CONTEXT_STATE_REACTIVATION_1: + set_state_over_cid(cid, PDP_CONTEXT_STATE_REACTIVATION_2); + cmhSM_stop_context_reactivation(); + temp_nsapiSet &= ~( 1U << CID_TO_NSAPI(cid) ); /* 28592 */ + continue; + + case PDP_CONTEXT_STATE_REACTIVATION_2: + set_state_over_cid ( cid, PDP_CONTEXT_STATE_DEFINED ); + cmhSM_stop_context_reactivation(); + rat_id = RAT_NO_CARRIER; + inform_ppp = 0; + break; + } + + if ( inform_ppp ) + { + /* + *--------------------------------------------------------------- + * inform PPP + *--------------------------------------------------------------- + */ + psaGPPP_Terminate( PPP_LOWER_LAYER_UP ); + } + + switch( smEntStat.curCmd ) + { + case( AT_CMD_CGDATA ): + case( AT_CMD_CGACT ): + TRACE_EVENT_P2("cmhSM_NetDeactivate: smEntStat.entOwn: Source = %d and GPRS related AT Command is smEntStat.curCmd: = %d", smEntStat.entOwn, smEntStat.curCmd ); + cmhSM_clear_work_cids(cid); + break; + default: + TRACE_EVENT_P1("cmhSM_NetDeactivate: Current AT Command is smEntStat.curCmd: = %d", smEntStat.curCmd); + break; + } + + /* + * GPRS event reporting + */ + strcpy( event.act.pdp_type, p_pdp_context_node->attributes.pdp_type ); + memcpy(&(event.act.pdp_addr), &(p_pdp_context_node->internal_data.pdp_address_allocated), sizeof(T_NAS_ip)); + event.act.cid = cid; + for( i = 0; i < CMD_SRC_MAX; i++ ) + { + R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_NW_DEACT, &event ); + R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_NW_DEACT, &event ); + } + + if ( rat_id NEQ RAT_MAX ) + { + + /* Below code will decide whether to send NO CARRIER OR NOT + depeding on the context flags and source's + */ + + if ( !( gmmShrdPrm.gprs_call_killer EQ p_pdp_context_node->internal_data.owner ) ) + { + gaci_RAT_caller ( rat_id, cid, cmdBuf, cme_err ); + } + + gmmShrdPrm.gprs_call_killer = (UBYTE)CMD_SRC_NONE; + + cmhSM_clear_work_cids(cid); + 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( T_SMREG_PDP_MODIFY_IND *smreg_pdp_modify_ind ) +{ + U8 cid = 0; + U8 i = 0; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + + TRACE_FUNCTION ("cmhSM_NetModify()"); + + if( get_state_over_cid( NSAPI_TO_CID( smreg_pdp_modify_ind->nsapi ) ) NEQ PDP_CONTEXT_STATE_INVALID ) + { + p_pdp_context_node = pdp_context_find_node_from_cid( NSAPI_TO_CID( smreg_pdp_modify_ind->nsapi ) ); + cid = p_pdp_context_node->cid; + if( p_pdp_context_node ) + { + /* Store the QoS indicated by the network */ + p_pdp_context_node->ctrl_neg_qos = smreg_pdp_modify_ind->ctrl_qos; + switch( smreg_pdp_modify_ind->ctrl_qos ) + { + case PS_is_R97: + memcpy( &p_pdp_context_node->neg_qos.qos_r97, &smreg_pdp_modify_ind->qos.qos_r97, sizeof(T_PS_qos_r97) ); + break; + case PS_is_R99: + memcpy( &p_pdp_context_node->neg_qos.qos_r99, &smreg_pdp_modify_ind->qos.qos_r99, sizeof(T_PS_qos_r99) ); + break; + default: + TRACE_ERROR( "QoS type indicated by NW not supported" ); + } + + /* inform all sources */ + for( i = 0 ; i < CMD_SRC_MAX; i++ ) + { + switch( p_pdp_context_node->ctrl_neg_qos ) + { + case PS_is_R97: + R_AT( RAT_QOS_MOD,(T_ACI_CMD_SRC) i ) ( cid, p_pdp_context_node->neg_qos.qos_r97 ); /* the macro must be updated, QoS type changed !!! */ + break; + case PS_is_R99: + R_AT( RAT_QOS_MOD,(T_ACI_CMD_SRC) i ) ( cid, p_pdp_context_node->neg_qos.qos_r99 ); /* the macro must be updated, QoS type changed !!! */ + break; + } + } + + } + else + { + TRACE_ERROR( "PDP context not found, in function cmhSM_NetModify" ); + } + } + else + { + TRACE_ERROR( "PDP context for the given nsapi is in the wrong state" ); + } + +} + + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finnished ROUTINE : cmhSM_Modified | ++-------------------------------------------------------------------+ + + PURPOSE : indicates that the MT initiated PDP context modification + was successful. Continue to modify the rest of the contexts + until the work_cids list is empty. + +*/ +#ifdef REL99 +GLOBAL SHORT cmhSM_Modified( T_SMREG_PDP_MODIFY_CNF *smreg_pdp_modify_cnf ) +{ + + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + + TRACE_FUNCTION ("cmhSM_Modified()"); + + if ( NSAPI_TO_CID( smreg_pdp_modify_cnf->nsapi ) NEQ work_cids[cid_pointer]) + { + /* Wrong nsapi received from SM */ + TRACE_ERROR("WRONG NSAPI. Ignored."); + return -1; + } + + p_pdp_context_node = pdp_context_find_node_from_cid( work_cids[cid_pointer] ); + + if( p_pdp_context_node EQ NULL ) + { + TRACE_ERROR ("PDP context not found"); + return -1; + } + + /* This context was successful modified: Change state back. */ + switch( get_state_working_cid() ) + { + case PDP_CONTEXT_STATE_ACTIVATED_MODIFYING: + set_state_working_cid( PDP_CONTEXT_STATE_ACTIVATED ); + break; + + case PDP_CONTEXT_STATE_DATA_LINK_MODIFYING: + set_state_working_cid( PDP_CONTEXT_STATE_DATA_LINK ); + break; + + default: + /* Error handling */ + TRACE_ERROR("WRONG STATE for context."); + /* Reject command if possible */ + if (smEntStat.curCmd EQ AT_CMD_CGCMOD) + { + R_AT( RAT_CME, smEntStat.entOwn ) ( smEntStat.curCmd, CME_ERR_GPRSUnspec ); + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + work_cids[0] = PDP_CONTEXT_CID_INVALID; + } + else + { + TRACE_ERROR("SMREG_PDP_MODIFY_CNF received but +CGCMOD not executed"); + } + return -1; + } + + + + cid_pointer ++; // This might be wrong + + + /* Investigate if more contexts to modify */ + if( (cid_pointer EQ PDP_CONTEXT_CID_MAX) OR (work_cids[cid_pointer] EQ PDP_CONTEXT_CID_INVALID) ) + { + /* No more contexts to modify. All context modification were successful. */ + + switch( smEntStat.curCmd ) + { + case AT_CMD_CGACT: + { + R_AT( RAT_CGACT, smEntStat.entOwn )(0); + break; + } + case AT_CMD_CGCMOD: + { + R_AT( RAT_CGCMOD, smEntStat.entOwn )(); + break; + } + } + + R_AT( RAT_OK, smEntStat.entOwn ) ( smEntStat.curCmd ); + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + work_cids[0] = PDP_CONTEXT_CID_INVALID; + + } + else + { + /* More contexts to modify */ + switch (get_state_over_cid(work_cids[cid_pointer])) + { + case PDP_CONTEXT_STATE_ACTIVATED: + set_state_over_cid(work_cids[cid_pointer], PDP_CONTEXT_STATE_ACTIVATED_MODIFYING); + /* Send next modify request */ + psaSM_PDP_Modify(); + break; + + case PDP_CONTEXT_STATE_DATA_LINK: + set_state_over_cid(work_cids[cid_pointer], PDP_CONTEXT_STATE_DATA_LINK_MODIFYING); + /* Send next modify request */ + psaSM_PDP_Modify(); + break; + + default: + { + /* The state has changed probably due to network deactivation. The command fails. */ + R_AT( RAT_CME, smEntStat.entOwn ) ( smEntStat.curCmd, CME_ERR_GPRSUnspec ); + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + work_cids[0] = PDP_CONTEXT_CID_INVALID; + } + } + } + return 0; +} +#endif + + + +/* ++-------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : CMH_SMR | +| STATE : finnished ROUTINE : cmhSM_NoModify | ++-------------------------------------------------------------------+ + + PURPOSE : indicates that the MT initiated PDP context modification + failed. + RETURN : Callback with CME ERROR or just ERROR. +*/ +#ifdef REL99 +GLOBAL SHORT cmhSM_NoModify( T_SMREG_PDP_MODIFY_REJ *smreg_pdp_modify_rej ) +{ + SHORT result = 0; + + + TRACE_FUNCTION ("cmhSM_NoModify()"); + + if (smreg_pdp_modify_rej EQ NULL) + return -1; + + switch( smEntStat.curCmd ) + { + case AT_CMD_CGCMOD: + { + /* Reset state to the previous. */ + switch( get_state_working_cid() ) + { + case PDP_CONTEXT_STATE_ACTIVATED_MODIFYING: + set_state_working_cid( PDP_CONTEXT_STATE_ACTIVATED ); + break; + + case PDP_CONTEXT_STATE_DATA_LINK_MODIFYING: + set_state_working_cid( PDP_CONTEXT_STATE_DATA_LINK ); + break; + + default: + TRACE_FUNCTION("State for modified context has been changed (Network deactivation?)."); + } + + /* Reject the +CGCMOD command */ + R_AT( RAT_CME, smEntStat.entOwn ) ( smEntStat.curCmd, CME_ERR_GPRSUnspec ); + smEntStat.curCmd = AT_CMD_NONE; + cid_pointer = 0; + work_cids[0] = PDP_CONTEXT_CID_INVALID; + break; + } + + default: + { + result = -1; + break; + } + } /* End switch( smEntStat.curCm ) */ + + return result; + +} + +#endif + +/* ++-------------------------------------------------------------------+ +| PROJECT : UMTS MODULE : CMH_SMR | +| STATE : ROUTINE : cmhSM_ActivatedSecondary | ++-------------------------------------------------------------------+ + + PURPOSE : confirms a successful secondary context activation + +*/ +#ifdef REL99 +GLOBAL SHORT cmhSM_ActivatedSecondary( T_SMREG_PDP_ACTIVATE_SEC_CNF *p_smreg_pdp_activate_sec_cnf ) +{ + U8 cid = work_cids[cid_pointer]; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_sec_node = NULL; + + TRACE_FUNCTION ("cmhSM_ActivatedSecondary()"); + + /* + * Find the secondary PDP context + */ + p_pdp_context_sec_node = pdp_context_find_node_from_cid( cid ); + if( !p_pdp_context_sec_node ) + { + TRACE_ERROR( "ERROR: PDP context not found, in function cmhSM_ActivatedSecondary" ); + return -1; + } + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( smEntStat.curCmd ) + { + case( AT_CMD_CGACT ): + TRACE_EVENT("CGACT is current command"); + if( get_state_working_cid() NEQ PDP_CONTEXT_STATE_ACTIVATING ) + { + /* + * no action + */ + + return 0; + } + R_AT( RAT_CGACT, smEntStat.entOwn )(p_pdp_context_sec_node->internal_data.link_id); + + set_state_working_cid( PDP_CONTEXT_STATE_ACTIVATED ); + + /* + * do we need one more context activation + */ + + if( cmhSM_next_work_cid( AT_CMD_CGACT ) EQ FALSE ) + { + R_AT( RAT_OK, smEntStat.entOwn ) ( smEntStat.curCmd ); + + /* log result */ + cmh_logRslt ( smEntStat.entOwn, RAT_OK, smEntStat.curCmd, -1, BS_SPEED_NotPresent,CME_ERR_NotPresent); + + smEntStat.curCmd = AT_CMD_NONE; + } + + + break; + + case( AT_CMD_CGDATA ): + TRACE_EVENT("CGDATA is current command"); + if( get_state_working_cid() NEQ PDP_CONTEXT_STATE_ESTABLISH_2 ) + { + /* + * no action + */ + return 0; + } + + /* + *--------------------------------------------------------------- + * inform PPP + *--------------------------------------------------------------- + */ + psaGPPP_PDP_Activate( &p_pdp_context_sec_node->internal_data.pdp_address_allocated, + p_pdp_context_sec_node->internal_data.user_pco.pco, + p_pdp_context_sec_node->internal_data.user_pco.len, + (U8)CID_TO_NSAPI( p_pdp_context_sec_node->cid ) ); + + set_state_working_cid( PDP_CONTEXT_STATE_ESTABLISH_3 ); + + break; + + default: + TRACE_EVENT("current command not detected!"); + return -1; + } + + TRACE_EVENT_P2( "cmhSM_Activated, dti_entity_connected, dti_it = %d, cid_ptr = %d", + p_pdp_context_sec_node->internal_data.link_id, cid_pointer ); + dti_cntrl_entity_connected(p_pdp_context_sec_node->internal_data.link_id, DTI_ENTITY_SNDCP, DTI_OK); + + return 0; +} +#endif /* REL99 */ + + +#ifdef REL99 +GLOBAL SHORT cmhSM_NoActivateSecondary( T_SMREG_PDP_ACTIVATE_SEC_REJ *p_smreg_pdp_activate_sec_rej ) +{ + short res = 0; + + TRACE_FUNCTION( "cmhSM_NoActivateSecondary" ); + TRACE_EVENT( "This funciton is not implemented!" ); + + return res; +} +#endif /* REL99 */ +GLOBAL BOOL PKTIO_UPM_connect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type) +{ + U8 cid; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + + TRACE_FUNCTION("PKTIO_UPM_connect_dti_cb"); + + switch( result_type) + { + case DTI_CONN_STATE_DISCONNECTING: + cid = (U8)gaci_get_cid_over_dti_id(dti_id); + p_pdp_context_node = pdp_context_find_node_from_cid(cid); + + if( (INVALID_CID NEQ cid ) AND + ( PDP_CONTEXT_STATE_ACTIVATING EQ get_state_over_cid(cid)) AND + (( DTI_ENTITY_PKTIO EQ p_pdp_context_node->internal_data.entity_id) OR + (DTI_ENTITY_AAA EQ p_pdp_context_node->internal_data.entity_id))) + { + cmhSM_deactivateAContext(CMD_SRC_NONE, cid); + set_state_over_cid( cid, PDP_CONTEXT_STATE_DEACTIVATE_NORMAL); + } + break; + case DTI_CONN_STATE_DISCONNECTED: + case DTI_CONN_STATE_CONNECTING: + case DTI_CONN_STATE_CONNECTED: + break; + case DTI_CONN_STATE_ERROR: + /* connection not possible: disconnect SNDCP */ + dti_cntrl_close_dpath_from_dti_id( dti_id ); + break; + case DTI_CONN_STATE_UNKNOWN: + default: + TRACE_EVENT("PKTIO_UPM_connect_dti_cb call with not awaited value"); + break; + } + return TRUE; +} + + +#endif /* GPRS */ +/*==== EOF ========================================================*/