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 : GPRS AT Command Handler.
+-----------------------------------------------------------------------------
*/
#if defined (GPRS) && defined (DTI)
#ifndef GACI_CMD_C
#define GACI_CMD_C
#endif
#undef DUMMY_ATI_STRINGS
#include "aci_all.h"
/*includes*/
#include "dti.h" /* functionality of the dti library */
#include "aci_cmh.h"
#include "ati_cmd.h"
#include "aci_io.h"
#include "aci_cmd.h"
#include "aci_lst.h"
#include "l4_tim.h"
#include "gdi.h"
#include "audio.h"
#include "p_sim.h"
#include "p_aci.h"
#include "aoc.h"
#include "aci.h"
#include "pcm.h"
#include "rx.h"
#include "pwr.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 "cmh.h"
#include "cmh_sm.h"
#include "aci_io.h"
#include "aci_mem.h"
#if defined(FF_WAP) OR defined (FF_GPF_TCPIP) OR defined (FF_SAT_E)
#include "gaci_srcc.h"
#include "psa_tcpip.h"
#include "wap_aci.h"
#endif /* defined(FF_WAP) OR defined (FF_GPF_TCPIP) OR defined (FF_SAT_E)*/
#include "gaci_cmd.h"
#include "cmh_gppp.h"
#include "psa_gppp.h"
#include "aci_prs.h"
#include "ati_int.h"
#include "dcm_f.h"
#ifdef FF_ATI_BAT
#include "typedefs.h"
#include "gdd.h"
#include "bat.h"
#include "ati_bat.h"
#endif /*FF_ATI_BAT*/
EXTERN char *cmdErrStr;
EXTERN T_ACI_LIST *ati_src_list;
GLOBAL T_ATI_RSLT setatPlusCGDCONT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGQREQ (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGQMIN (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGATT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGACT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGDATA (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGPADDR (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGAUTO (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGANS (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGCLASS (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGEREP (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGREG (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGSMS (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPercentCGEREP (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGDCONT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGQREQ (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGQMIN (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGATT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGACT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGAUTO (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGCLASS (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGEREP (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGREG (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGSMS (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPercentCGEREP (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT tesatPlusCGDCONT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT tesatPlusCGPADDR (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT tesatPlusCGSMS (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT atGD (char *cl, UBYTE srcId, BOOL *gprs_command);
GLOBAL T_ATI_RSLT setatPercentCGAATT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPercentCGAATT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPercentCGREG (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPercentCGREG (char *cl, UBYTE srcId);
LOCAL T_ATI_RSLT queatPercentCGPCO (UBYTE srcId,USHORT cid);
GLOBAL T_ATI_RSLT setatPercentCGCLASS (CHAR *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPercentCGCLASS (CHAR *cl, UBYTE srcId);
#ifdef REL99
GLOBAL T_ATI_RSLT queatPlusCGEQREQ (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGEQMIN (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGTFT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT queatPlusCGDSCONT(char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT tesatPlusCGEQNEG (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT tesatPlusCGCMOD (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT tesatPlusCGTFT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT tesatPlusCGDSCONT(char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGEQMIN (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGEQREQ (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGEQNEG (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGCMOD (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGTFT (char *cl, UBYTE srcId);
GLOBAL T_ATI_RSLT setatPlusCGDSCONT(char *cl, UBYTE srcId);
#endif
EXTERN char *parseDSNP_U16 (char blocks, char *p_in, U16 *p_out);
EXTERN char *parseIPv4Address(char *p_in, U8 * p_ip_addr, U8 * is_ip_valid);
EXTERN char *parseIPv6Address(char *p_in, U8 * p_ip_addr, U8 * is_ip_valid);
EXTERN T_PDP_CONTEXT_INTERNAL *p_pdp_context_list;
/*
+------------------------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : gaci_ati_cmd_init_each_source |
+------------------------------------------------------------------------------------+
PURPOSE : initialize GACI relevant ATI parameters.
*/
GLOBAL void gaci_ati_cmd_init_each_source( UBYTE srcId )
{
/* init +CGREG param */
ati_creg_init(srcId, PlusCGREG_CMD);
/* init %CGREG param */
ati_creg_init(srcId, PercentCGREG_CMD);
/* init %CGEREP param */
ati_user_output_cfg[srcId].Percent_CGEREP_stat = 0;
ati_user_output_cfg[srcId].CGEREP_mode = 0;
ati_user_output_cfg[srcId].CGEREP_bfr = 0;
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : atPlusCGDCONT |
+--------------------------------------------------------------------+
PURPOSE : +CGDCONT command ( PDP context definition )
*/
#define MAGIC_EMPTY_APN "\x0ff"
GLOBAL T_ATI_RSLT setatPlusCGDCONT (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_FAIL;
U8 valid_ip;
U8 cid = PDP_CONTEXT_CID_OMITTED;
char *p_pdp_addr = NULL;
USHORT pdp_addr_len = 0;
T_PDP_CONTEXT pdp_context_input = { "",
MAGIC_EMPTY_APN,
NAS_is_ip_not_present, 0,
PDP_CONTEXT_D_COMP_OMITTED,
PDP_CONTEXT_H_COMP_OMITTED,
PDP_CONTEXT_CID_OMITTED };
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGDCONT ()");
cl = parse( cl, "csslcc", &cid,
(LONG)MAX_PDP_CONTEXT_TYPE_LEN, &pdp_context_input.pdp_type,
(LONG)MAX_PDP_CONTEXT_APN_LEN, &pdp_context_input.pdp_apn,
&pdp_addr_len, &p_pdp_addr,
&pdp_context_input.d_comp,
&pdp_context_input.h_comp);
if (!strcmp(pdp_context_input.pdp_apn, MAGIC_EMPTY_APN))
{
/* if APN was ommitted then parse leaves the string untouched */
pdp_context_input.pdp_apn[0]='\0'; /* so clear the apn */
}
else if (pdp_context_input.pdp_apn[0] EQ '\0')
{
/* if entered APN was "", parse clears the buffer */
strcpy(pdp_context_input.pdp_apn, MAGIC_EMPTY_APN); /* fill magic empty apn */
}
if ( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
strupper( (char*) &pdp_context_input.pdp_type);
/* Issue 27081 - GPRS context is transformed from lower cases into upper cases */
/* strupper( (char*) &pdp_context_input.pdp_apn ); */
if( p_pdp_addr )
{
if( pdp_addr_len >= 7 AND pdp_addr_len <= 15 )
{
p_pdp_addr = parseIPv4Address( p_pdp_addr, (U8*) &(pdp_context_input.pdp_addr.ip_address.ipv4_addr.a4), &valid_ip);
if (valid_ip NEQ 0)
{
pdp_context_input.pdp_addr.ctrl_ip_address = NAS_is_ipv4;
}
else
{
/* If the IP address is not valid then we should send ERROR message. */
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
}
else
{
if( pdp_addr_len >= 31 AND pdp_addr_len <= 63 )
{
p_pdp_addr = parseIPv6Address( p_pdp_addr, (U8*) &(pdp_context_input.pdp_addr.ip_address.ipv6_addr.a6), &valid_ip);
if (valid_ip NEQ 0)
{
pdp_context_input.pdp_addr.ctrl_ip_address = NAS_is_ipv6;
}
else
{
/* If the IP address is not valid then we should send ERROR message. */
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
}
else
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
}
}
else
{
if( pdp_addr_len NEQ 0 )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
else
{
//if pdp_addr is omitted, ctrl must be set to not present...
pdp_context_input.pdp_addr.ctrl_ip_address = NAS_is_ip_not_present;
}
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgdcont cgdcont;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGDCONT;
cmd.params.ptr_set_plus_cgdcont = &cgdcont;
cgdcont.cid=(T_BAT_pdp_cid)cid;
/* currently both IPv4,IPV6 supported */
if (!utl_strcasecmp((const char *)pdp_context_input.pdp_type,
(const char *)"ip"))
cgdcont.pdp_type = BAT_PDP_TYPE_IPV4;
else if (!utl_strcasecmp((const char *)pdp_context_input.pdp_type,
(const char *)"ipv6"))
cgdcont.pdp_type = BAT_PDP_TYPE_IPV6;
else
cgdcont.pdp_type = BAT_PDP_TYPE_NOT_PRESENT;
/* apn value = "" */
if (!strcmp(pdp_context_input.pdp_apn, MAGIC_EMPTY_APN))
{
cgdcont.v_apn = TRUE;
cgdcont.c_apn = 0;
}
/* apn value omitted */
else if (pdp_context_input.pdp_apn[0] EQ '\0')
{
cgdcont.v_apn = FALSE;
}
/* apn with valid value (longer than 0) */
else
{
cgdcont.v_apn = TRUE;
cgdcont.c_apn = (U8)strlen(pdp_context_input.pdp_apn);
memcpy(cgdcont.apn,pdp_context_input.pdp_apn, cgdcont.c_apn);
}
if (pdp_addr_len)
{
cgdcont.v_pdp_addr = TRUE;
cgdcont.c_pdp_addr = (U8)pdp_addr_len;
memcpy(cgdcont.pdp_addr,p_pdp_addr,pdp_addr_len);
}
else
{
cgdcont.v_pdp_addr = FALSE;
cgdcont.c_pdp_addr = 0;
}
cgdcont.d_comp = (T_BAT_plus_cgdcont_d_comp)pdp_context_input.d_comp;
cgdcont.h_comp = (T_BAT_plus_cgdcont_h_comp)pdp_context_input.h_comp;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGDCONT;
return(ATI_EXCT);
}
#else
ret = sAT_PlusCGDCONT((T_ACI_CMD_SRC)srcId, cid, &pdp_context_input );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGDCONT;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif
}
GLOBAL T_ATI_RSLT queatPlusCGDCONT (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_ACI_RETURN ret = AT_FAIL;
T_PDP_CONTEXT pdp_context_array[PDP_CONTEXT_CID_MAX];
SHORT pdp_context_cid_array[PDP_CONTEXT_CID_MAX];
char pdp_addr[64];
char message[255];
int i=0;
#endif
TRACE_FUNCTION("queatPlusCGDCONT ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGDCONT;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgdcont = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
memset( &pdp_context_array, 0, sizeof(pdp_context_array) );
memset( &pdp_context_cid_array, PDP_CONTEXT_CID_OMITTED, sizeof(pdp_context_cid_array) );
ret = qAT_PlusCGDCONT((T_ACI_CMD_SRC)srcId, pdp_context_array, pdp_context_cid_array);
if (ret EQ AT_CMPL)
{
for ( i = 0; i < PDP_CONTEXT_CID_MAX AND pdp_context_cid_array[i] NEQ PDP_CONTEXT_CID_OMITTED; i++ )
{
if( pdp_context_addr_omitted(&(pdp_context_array[i].pdp_addr) ) )
{
sprintf( pdp_addr,"\"\"");
}
else
{
if( pdp_context_array[i].pdp_addr.ctrl_ip_address EQ NAS_is_ipv4 )
{
/* IP v4 address */
sprintf( pdp_addr, "\"%d.%d.%d.%d\"",
pdp_context_array[i].pdp_addr.ip_address.ipv4_addr.a4[0],
pdp_context_array[i].pdp_addr.ip_address.ipv4_addr.a4[1],
pdp_context_array[i].pdp_addr.ip_address.ipv4_addr.a4[2],
pdp_context_array[i].pdp_addr.ip_address.ipv4_addr.a4[3] );
}
else
{
/* IP v6 address */
sprintf( pdp_addr, "\"%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\"",
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[0],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[1],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[2],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[3],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[4],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[5],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[6],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[7],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[8],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[9],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[10],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[11],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[12],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[13],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[14],
pdp_context_array[i].pdp_addr.ip_address.ipv6_addr.a6[15] );
}
}
if( pdp_context_apn_omitted( pdp_context_array[i].pdp_apn ) )
{
sprintf( message, "+CGDCONT: %d,\"%s\",,%s,%d,%d",
pdp_context_cid_array[i],
pdp_context_array[i].pdp_type,
pdp_addr,
pdp_context_array[i].d_comp,
pdp_context_array[i].h_comp );
}
else if (!strcmp(pdp_context_array[i].pdp_apn, MAGIC_EMPTY_APN))
{ /* special empty APN detected, printout "" */
sprintf( message, "+CGDCONT: %d,\"%s\",\"\",%s,%d,%d",
pdp_context_cid_array[i],
pdp_context_array[i].pdp_type,
pdp_addr,
pdp_context_array[i].d_comp,
pdp_context_array[i].h_comp );
}
else
{
sprintf( message, "+CGDCONT: %d,\"%s\",\"%s\",%s,%d,%d",
pdp_context_cid_array[i],
pdp_context_array[i].pdp_type,
pdp_context_array[i].pdp_apn,
pdp_addr,
pdp_context_array[i].d_comp,
pdp_context_array[i].h_comp );
}
io_sendMessage(srcId, message, ATI_NORMAL_OUTPUT);
}
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (ATI_CMPL);
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : MODULE : GACI_CMD |
| STATE : finnished ROUTINE : testatPlusCGDCONT |
+--------------------------------------------------------------------+
PURPOSE : +CGQREQ command (context QOS request)
*/
GLOBAL T_ATI_RSLT tesatPlusCGDCONT (char *cl, UBYTE srcId)
{
char *me = "+CGDCONT: ";
sprintf( g_sa, "%s(1-%d),\"IP\",,,(0),(0-3)", me, PDP_CONTEXT_CID_MAX );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT );
sprintf( g_sa, "%s(1-%d),\"IPV6\",,,(0),(0-3)", me, PDP_CONTEXT_CID_MAX );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT );
/* As for EDGE we are not supporting PDP_Type as "PPP" */
/* sprintf( g_sa, "%s(1-%d),\"PPP\",,,(0-2),(0-3)", me, PDP_CONTEXT_CID_MAX );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT );*/
return (ATI_CMPL);
}
#ifdef REL99
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : ROUTINE : atPlusCGDSCONT |
+--------------------------------------------------------------------+
PURPOSE : +CGDSCONT command ( secondary PDP context definition )
*/
GLOBAL T_ATI_RSLT setatPlusCGDSCONT( char *cl, UBYTE srcId )
{
U8 cid = PDP_CONTEXT_CID_OMITTED;
T_PDP_CONTEXT pdp_context_input = { "",
"",
NAS_is_ip_not_present,0,
PDP_CONTEXT_D_COMP_OMITTED,
PDP_CONTEXT_H_COMP_OMITTED,
PDP_CONTEXT_CID_OMITTED };
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGDSCONT ()");
cl = parse( cl, "cccc",
&cid,
&(pdp_context_input.p_cid),
&pdp_context_input.d_comp,
&pdp_context_input.h_comp);
if( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgdscont cgdscont;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGDSCONT;
cmd.params.ptr_set_plus_cgdscont = &cgdscont;
cgdscont.cid=(T_BAT_pdp_cid)cid;
cgdscont.p_cid = (U8)pdp_context_input.p_cid;
cgdscont.d_comp = (T_BAT_plus_cgdcont_d_comp)pdp_context_input.d_comp;
cgdscont.h_comp = (T_BAT_plus_cgdcont_d_comp)pdp_context_input.h_comp;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGDSCONT;
return(ATI_EXCT);
}
#else
switch( sAT_PlusCGDSCONT(( T_ACI_CMD_SRC)srcId, cid , &pdp_context_input) )
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
// curAtCmd = AT_CMD_CGDSCONT; /*operation in progress*/
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : ROUTINE : queatPlusCGDSCONT |
+--------------------------------------------------------------------+
PURPOSE : +CGDSCONT=? command
*/
GLOBAL T_ATI_RSLT queatPlusCGDSCONT( char *cl, UBYTE srcId )
{
T_ACI_RETURN ret;
T_PDP_CONTEXT pdp_context_array[PDP_CONTEXT_CID_MAX];
U8 pdp_context_cid_array[PDP_CONTEXT_CID_MAX];
int i;
TRACE_FUNCTION("queatPlusCGDSCONT ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGDSCONT;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_set_plus_cgdscont = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
memset( &pdp_context_cid_array, PDP_CONTEXT_CID_OMITTED, sizeof(pdp_context_cid_array) );
ret = qAT_PlusCGDSCONT(( T_ACI_CMD_SRC)srcId, pdp_context_array, pdp_context_cid_array);
if (ret EQ AT_CMPL)
{
for ( i = 0; i < PDP_CONTEXT_CID_MAX AND pdp_context_cid_array[i] NEQ PDP_CONTEXT_CID_OMITTED; i++ )
{
sprintf( g_sa, "+CGDSCONT: %d,%d,%d,%d",
pdp_context_cid_array[i],
pdp_context_array[i].p_cid,
pdp_context_array[i].d_comp,
pdp_context_array[i].h_comp );
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (ATI_CMPL);
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : ROUTINE : testatPlusCGDSCONT |
+--------------------------------------------------------------------+
PURPOSE : +CGDSCONT?
*/
GLOBAL T_ATI_RSLT tesatPlusCGDSCONT( char *cl, UBYTE srcId )
{
char me[50];
char cid_list[PDP_CONTEXT_CID_MAX + 1];
BOOL active = FALSE;
U8 i = 0;
U8 cid;
cid_list[0] = 0;
me[0] = 0;
for( cid = PDP_CONTEXT_CID_MIN; cid <= PDP_CONTEXT_CID_MAX; cid++ )
{
if( tAT_PlusCGDSCONT(( T_ACI_CMD_SRC) srcId, cid, &active ) EQ AT_CMPL )
{
if( active EQ TRUE )
{
cid_list[i] = cid;
i++;
cid_list[i] = 0;
}
}
else
{
cmdCmeError( CME_ERR_Unknown );
return (ATI_FAIL);
}
}
i = 0;
sprintf( me, "+CGDSCONT: (1-%d),", PDP_CONTEXT_CID_MAX);
if( cid_list[i] NEQ 0 )
{
sprintf( me, "%s(%d", me, cid_list[i] );
i++;
while( cid_list[i] NEQ 0 )
{
sprintf( me, "%s,%d", me, cid_list[i] );
i++;
}
}
if( cid_list[0] NEQ 0 )
{
sprintf( me, "%s)", me );
}
/* As for EDGE we are not supporting PDP_Type as "PPP" */
/*sprintf( g_sa, "%s,\"PPP\",(0-1),(0-1)", me );
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);*/
sprintf( g_sa, "%s,\"IP\",(0),(0-1)", me );
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
sprintf( g_sa, "%s,\"IPV6\",(0),(0-1)", me );
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return (ATI_CMPL);
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : ROUTINE : atPlusCGTFT |
+--------------------------------------------------------------------+
PURPOSE : +CGTFT command ( Traffic Flow Template definition )
*/
GLOBAL T_ATI_RSLT setatPlusCGTFT( char *cl, UBYTE srcId )
{
U8 cid = 0;
U8 protocol_or_next_header = 0;
U8 is_ip_valid = FALSE;
U16 tos_value = 0;
U16 tos_mask = 0;
U32 ipsec_spi = 0;
U32 flow_label = 0;
char *p_addr_n_mask_str = NULL;
char *p_dest_port_range_str = NULL;
char *p_src_port_range_str = NULL;
char *p_tos_mask_or_tc_mask_str = NULL;
USHORT addr_n_mask_str_len = 0;
USHORT dest_port_range_str_len = 0;
USHORT src_port_range_str_len = 0;
USHORT tos_mask_or_tc_mask_str_len = 0;
T_NAS_tft_pf tft_pf_input;
#ifdef FF_ATI_BAT
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
#endif
TRACE_FUNCTION("setatPlusCGTFT ()");
memset( &tft_pf_input, 0x00, sizeof(T_NAS_tft_pf) );
// +------------ 1: <cid>
// |+----------- 2: <packet filter identifier>
// ||+---------- 3: <evaluation precedence index>
// |||+--------- 4: <source address and sub met mask>
// ||||+-------- 5: <protocol number (IPv4) / next header (IPv6)>
// |||||+------- 6: <destenation port range>
// ||||||+------ 7: <source port range>
// |||||||+----- 8: <ipsec security parameter index (SPI)>
// ||||||||+---- 9: <type of service and mask (IPv4) / traffic class and mask (IPv6)>
// |||||||||+--- 10: <flow label (IPv6)>
// ||||||||||
cl = parse( cl, "ccclcllyly",
&cid, /* 1 */
&tft_pf_input.tft_pf_id, /* 2 */
&tft_pf_input.tft_pf_precedence, /* 3 */
&addr_n_mask_str_len, &p_addr_n_mask_str, /* 4 */
&protocol_or_next_header, /* 5 */
&dest_port_range_str_len, &p_dest_port_range_str, /* 6 */
&src_port_range_str_len, &p_src_port_range_str, /* 7 */
&ipsec_spi, /* 8 */
&tos_mask_or_tc_mask_str_len, &p_tos_mask_or_tc_mask_str, /* 9 */
&flow_label /* 10 */
);
if( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
if( !p_addr_n_mask_str )
{
/* IP address and mask is omitted */
if( flow_label EQ 0 )
{
/* IP v4 type */
tft_pf_input.ctrl_tft_pf_entry = NAS_is_tft_pf_ipv4;
}
else
{
/* IP v6 type */
tft_pf_input.ctrl_tft_pf_entry = NAS_is_tft_pf_ipv6;
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_FLOW_LABEL;
}
}
else
{
if( addr_n_mask_str_len >= 15 AND addr_n_mask_str_len <= 31 )
{
// The length of the string is within the length of an IP v4 string.
if( flow_label EQ 0 )
{
tft_pf_input.ctrl_tft_pf_entry = NAS_is_tft_pf_ipv4;
// Parse IP v4 address
p_addr_n_mask_str = parseIPv4Address( p_addr_n_mask_str,
(U8*) &(tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_addr), &is_ip_valid );
// Parse IP v4 sub net mask
p_addr_n_mask_str = parseIPv4Address( p_addr_n_mask_str,
(U8*) &(tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_mask), &is_ip_valid);
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPv4_SRC_ADDR_MASK;
}
else
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
}
else
{
if( addr_n_mask_str_len >= 63 AND addr_n_mask_str_len <= 127 )
{
// The length of the string is within the length of an IP v6 string.
tft_pf_input.ctrl_tft_pf_entry = NAS_is_tft_pf_ipv6;
tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_flow_label = flow_label;
// Parse IP v6 address
p_addr_n_mask_str = parseIPv6Address( p_addr_n_mask_str,
(U8*) &(tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr), &is_ip_valid );
// Parse IP v4 sub net mask
p_addr_n_mask_str = parseIPv6Address( p_addr_n_mask_str,
(U8*) &(tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask), &is_ip_valid );
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPv6_SRC_ADDR_MASK;
}
else
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
}
if( !p_addr_n_mask_str )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
} /* END: if( !p_addr_n_mask_str ) */
switch( tft_pf_input.ctrl_tft_pf_entry )
{
/*** IP v4 parameters */
case NAS_is_tft_pf_ipv4:
{
if( protocol_or_next_header )
{
tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_protocol = protocol_or_next_header;
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR;
}
/* Type of service and mask */
if( p_tos_mask_or_tc_mask_str )
{
p_tos_mask_or_tc_mask_str = parseDSNP_U16( 1, p_tos_mask_or_tc_mask_str,
&tos_value );
tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_value = (U8)tos_value;
p_tos_mask_or_tc_mask_str = parseDSNP_U16( 1, p_tos_mask_or_tc_mask_str,
&tos_mask );
tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_mask = (U8)tos_mask;
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_TOS_AND_MASK;
}
/* Destenation port */
if( p_dest_port_range_str )
{
p_dest_port_range_str = parseDSNP_U16( 1, p_dest_port_range_str,
(U16*) &tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.low_limit );
p_dest_port_range_str = parseDSNP_U16( 1, p_dest_port_range_str,
(U16*) &tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.high_limit );
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_DEST_PORT_RANGE;
}
/* Source port */
if( p_src_port_range_str )
{
p_src_port_range_str = parseDSNP_U16( 1, p_src_port_range_str,
(U16*)&tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.low_limit );
p_src_port_range_str = parseDSNP_U16( 1, p_src_port_range_str,
(U16*)&tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.high_limit );
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_SRC_PORT_RANGE;
}
/* IPSEC security parameter spi */
if( ipsec_spi )
{
tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_ipsec_spi = ipsec_spi;
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPSEC_SPI;
}
break;
} /* END: case NAS_is_tft_pf_ipv4 */
/*** IP v6 parameters ***/
case NAS_is_tft_pf_ipv6:
{
/* Next header */
if ( protocol_or_next_header )
{
tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_next_hdr = protocol_or_next_header;
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR;
}
/* Type of service and mask */
if ( p_tos_mask_or_tc_mask_str )
{
p_tos_mask_or_tc_mask_str = parseDSNP_U16( 1, p_tos_mask_or_tc_mask_str,
&tos_value );
tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_value = (U8)tos_value;
p_tos_mask_or_tc_mask_str = parseDSNP_U16( 1, p_tos_mask_or_tc_mask_str,
&tos_mask );
tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_mask = (U8)tos_mask;
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_TOS_AND_MASK;
}
/* Destenation port */
if ( p_dest_port_range_str )
{
p_dest_port_range_str = parseDSNP_U16( 1, p_dest_port_range_str,
(U16*)&tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.low_limit );
p_dest_port_range_str = parseDSNP_U16( 1, p_dest_port_range_str,
(U16*)&tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.high_limit );
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_DEST_PORT_RANGE;
}
/* Source port */
if ( p_src_port_range_str )
{
p_src_port_range_str = parseDSNP_U16( 1, p_src_port_range_str,
(U16*)&tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.low_limit );
p_src_port_range_str = parseDSNP_U16( 1, p_src_port_range_str,
(U16*)&tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.high_limit );
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_SRC_PORT_RANGE;
}
/* IPSEC security parameter spi */
if ( ipsec_spi )
{
tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_ipsec_spi = ipsec_spi;
tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPSEC_SPI;
}
break;
} /* END: case NAS_is_tft_pf_ipv6 */
default:
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
} /* END: switch( tft_pf_input.ctrl_tft_pf_entry ) */
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send bat_cmd;
T_BAT_cmd_set_plus_cgtft bat_cgtft;
bat_cmd.ctrl_params = BAT_CMD_SET_PLUS_CGTFT;
bat_cmd.params.ptr_set_plus_cgtft = &bat_cgtft;
bat_cgtft.cid = cid;
bat_cgtft.tft_pf_id = tft_pf_input.tft_pf_id;
bat_cgtft.tft_pf_precedence = tft_pf_input.tft_pf_precedence;
bat_cgtft.prt_num_or_nxt_hd = protocol_or_next_header;
/* addr_n_mask */
bat_cgtft.v_addr_n_mask = (addr_n_mask_str_len AND
p_addr_n_mask_str);
if (tft_pf_input.ctrl_tft_pf_entry EQ NAS_is_tft_pf_ipv4)
{
bat_cgtft.c_addr_n_mask = 2 * NAS_SIZE_IPv4_ADDR;
memcpy(bat_cgtft.addr_n_mask,
&tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask,
2 * NAS_SIZE_IPv4_ADDR);
/* dest_port_range */
if (tft_pf_input.tft_pf_valid_bits &
NAS_TFT_ID_DEST_PORT_RANGE)
{
bat_cgtft.v_dest_port_range = TRUE;
bat_cgtft.c_dest_port_range = 2;
bat_cgtft.dest_port_range[0] = tft_pf_input.tft_pf_entry.
tft_pf_ipv4.tft_dest_port_range.low_limit;
bat_cgtft.dest_port_range[1] = tft_pf_input.tft_pf_entry.
tft_pf_ipv4.tft_dest_port_range.high_limit;
}
/* src_port_range */
if (tft_pf_input.tft_pf_valid_bits &
NAS_TFT_ID_SRC_PORT_RANGE)
{
bat_cgtft.v_src_port_range = TRUE;
bat_cgtft.c_src_port_range = 2;
bat_cgtft.src_port_range[0] = tft_pf_input.tft_pf_entry.
tft_pf_ipv4.tft_src_port_range.low_limit;
bat_cgtft.src_port_range[1] = tft_pf_input.tft_pf_entry.
tft_pf_ipv4.tft_src_port_range.high_limit;
}
/* tos_mask_or_tc_mask */
if (tft_pf_input.tft_pf_valid_bits &
NAS_TFT_ID_TOS_AND_MASK)
{
bat_cgtft.v_tos_mask_or_tc_mask = TRUE;
bat_cgtft.c_tos_mask_or_tc_mask = 2;
bat_cgtft.tos_mask_or_tc_mask[0] = tft_pf_input.tft_pf_entry.
tft_pf_ipv4.tft_tos_and_mask.tos_value;
bat_cgtft.tos_mask_or_tc_mask[1] = tft_pf_input.tft_pf_entry.
tft_pf_ipv4.tft_tos_and_mask.tos_mask;
}
}
else if (tft_pf_input.ctrl_tft_pf_entry EQ NAS_is_tft_pf_ipv6)
{
bat_cgtft.c_addr_n_mask = 2 * NAS_SIZE_IPv6_ADDR;
memcpy(bat_cgtft.addr_n_mask,
&tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask,
2 * NAS_SIZE_IPv6_ADDR);
/* dest_port_range */
if (tft_pf_input.tft_pf_valid_bits &
NAS_TFT_ID_DEST_PORT_RANGE)
{
bat_cgtft.v_dest_port_range = TRUE;
bat_cgtft.c_dest_port_range = 2;
bat_cgtft.dest_port_range[0] = tft_pf_input.tft_pf_entry.
tft_pf_ipv6.tft_dest_port_range.low_limit;
bat_cgtft.dest_port_range[1] = tft_pf_input.tft_pf_entry.
tft_pf_ipv6.tft_dest_port_range.high_limit;
}
/* src_port_range */
if (tft_pf_input.tft_pf_valid_bits &
NAS_TFT_ID_SRC_PORT_RANGE)
{
bat_cgtft.v_src_port_range = TRUE;
bat_cgtft.c_src_port_range = 2;
bat_cgtft.src_port_range[0] = tft_pf_input.tft_pf_entry.
tft_pf_ipv6.tft_src_port_range.low_limit;
bat_cgtft.src_port_range[1] = tft_pf_input.tft_pf_entry.
tft_pf_ipv6.tft_src_port_range.high_limit;
}
/* tos_mask_or_tc_mask */
if (tft_pf_input.tft_pf_valid_bits &
NAS_TFT_ID_TOS_AND_MASK)
{
bat_cgtft.v_tos_mask_or_tc_mask = TRUE;
bat_cgtft.c_tos_mask_or_tc_mask = 2;
bat_cgtft.tos_mask_or_tc_mask[0] = tft_pf_input.tft_pf_entry.
tft_pf_ipv6.tft_tos_and_mask.tos_value;
bat_cgtft.tos_mask_or_tc_mask[1] = tft_pf_input.tft_pf_entry.
tft_pf_ipv6.tft_tos_and_mask.tos_mask;
}
}
/* ipsec_spi */
//bat_cgtft.v_ipsec_spi = tft_pf_input.ipsec_spi_present;
bat_cgtft.ipsec_spi = ipsec_spi;
/* flow_label */
bat_cgtft.flow_label = flow_label;
bat_send(ati_bat_get_client(srcId), &bat_cmd);
src_params->curAtCmd=AT_CMD_CGTFT;
return(ATI_EXCT);
}
#else
switch( sAT_PlusCGTFT( ( T_ACI_CMD_SRC)srcId, cid , &tft_pf_input) )
{
case (AT_CMPL): /* Operation completed */
return (ATI_CMPL);
case (AT_EXCT): /* Operation in progress */
// curAtCmd = AT_CMD_CGTFT;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /* Command failed */
return (ATI_FAIL);
}
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : ROUTINE : setatPlusCGTFT |
+--------------------------------------------------------------------+
PURPOSE : +CGTFT=? command
*/
GLOBAL T_ATI_RSLT queatPlusCGTFT( char *cl, UBYTE srcId )
{
T_ACI_RETURN ret;
U8 pdp_context_cid_array[PDP_CONTEXT_CID_MAX];
T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL;
T_TFT_INTERNAL *p_tft_pf_node = NULL;
int i = 0;
USHORT pos = 0;
TRACE_FUNCTION("queatPlusCGTFT()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGTFT;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_set_plus_cgtft = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
memset( &pdp_context_cid_array, PDP_CONTEXT_CID_OMITTED, sizeof(pdp_context_cid_array) );
ret = qAT_PlusCGTFT(( T_ACI_CMD_SRC)srcId, (U8*) &pdp_context_cid_array[0]);
if (ret EQ AT_CMPL)
{
for ( i = 0; i < PDP_CONTEXT_CID_MAX AND pdp_context_cid_array[i] NEQ PDP_CONTEXT_CID_OMITTED; i++ )
{
p_pdp_context_node = pdp_context_find_node_from_cid( pdp_context_cid_array[i] );
p_tft_pf_node = p_pdp_context_node->p_tft_pf;
while( p_tft_pf_node )
{
switch( p_tft_pf_node->pf_attributes.ctrl_tft_pf_entry )
{
case NAS_is_tft_pf_ipv4:
pos = sprintf( g_sa, "+CGTFT: %d,%d,%d,",
pdp_context_cid_array[i],
p_tft_pf_node->pf_attributes.tft_pf_id,
p_tft_pf_node->pf_attributes.tft_pf_precedence);
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPv4_SRC_ADDR_MASK )
{
pos += sprintf( g_sa + pos , "\"%d.%d.%d.%d.%d.%d.%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_addr[0],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_addr[1],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_addr[2],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_addr[3],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_mask[0],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_mask[1],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_mask[2],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_mask[3] );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR )
{
pos += sprintf( g_sa + pos, "%d,",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_protocol );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_DEST_PORT_RANGE )
{
pos += sprintf( g_sa + pos, "\"%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.low_limit,
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.high_limit );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_SRC_PORT_RANGE )
{
pos += sprintf( g_sa + pos, "\"%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.low_limit,
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.high_limit );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPSEC_SPI )
{
pos += sprintf( g_sa + pos, "%X,",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipsec_spi );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_TOS_AND_MASK )
{
pos += sprintf( g_sa + pos, "\"%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_value,
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_mask );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
break;
case NAS_is_tft_pf_ipv6:
pos = sprintf( g_sa, "+CGTFT: %d,%d,%d,",
pdp_context_cid_array[i],
p_tft_pf_node->pf_attributes.tft_pf_id,
p_tft_pf_node->pf_attributes.tft_pf_precedence);
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPv6_SRC_ADDR_MASK )
{
pos += sprintf( g_sa + pos, "\"%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[0],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[1],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[2],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[3],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[4],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[5],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[6],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[7],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[8],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[9],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[10],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[11],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[12],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[13],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[14],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr[15],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[0],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[1],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[2],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[3],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[4],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[5],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[6],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[7],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[8],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[9],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[10],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[11],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[12],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[13],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[14],
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask[15]);
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR )
{
pos += sprintf( g_sa + pos, "%d,",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_next_hdr );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_DEST_PORT_RANGE )
{
pos += sprintf( g_sa + pos, "\"%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.low_limit,
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.high_limit );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_SRC_PORT_RANGE )
{
pos += sprintf( g_sa + pos, "\"%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.low_limit,
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.high_limit );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPSEC_SPI )
{
pos += sprintf( g_sa + pos, "%X,",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipsec_spi );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_TOS_AND_MASK )
{
pos += sprintf( g_sa + pos, "\"%d.%d\",",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_value,
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_mask );
}
else
{
pos += sprintf( g_sa + pos, "," );
}
if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_FLOW_LABEL )
{
pos += sprintf( g_sa + pos, "%d",
p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_flow_label );
}
break;
}
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
p_tft_pf_node = p_tft_pf_node->p_next;
}
}
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : ROUTINE : testatPlusCGTFT |
+--------------------------------------------------------------------+
PURPOSE : +CGTFT?
*/
GLOBAL T_ATI_RSLT tesatPlusCGTFT( char *cl, UBYTE srcId )
{
U8 pf_id_max;
pf_id_max = TFT_PF_ID_MAX;
TRACE_FUNCTION("tesatPlusCGTFT()");
sprintf( g_sa, "+CGTFT: <PDP_type = \"IP\">, (1-%d),(0-255),\"a1.a2.a3.a4.m1.m2.m3.m4\" (0-255),(0-255),\"f.t\" (0-65535),\"f.t\" (0-65535),(0-FFFFFFFF),\"t.m\" (0-255),(0)", pf_id_max );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT);
sprintf( g_sa, "+CGTFT: <PDP_type = \"IPV6\">, (1-%d),(0-255),\"a1.a2...a15.m1.m2...m15\" (0-255),(0-255),\"f.t\" (0-65535),\"f.t\" (0-65535),(0-FFFFFFFF),\"t.m\" (0-255),(0-FFFF)", pf_id_max );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT);
/* As for EDGE we are not supporting PDP_Type as "PPP" */
/*sprintf( g_sa, "+CGTFT: <PDP_type = \"PPP\">, (1-%d),(0-255),\"a1.a2...a15.m1.m2...m15\" (0-255),(0-255),\"f.t\" (0-65535),\"f.t\" (0-65535),(0-FFFFFFFF),\"t.m\" (0-255),(0-FFFF)", pf_id_max );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT);*/
return (ATI_CMPL);
}
#endif /* REL99 */
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : setatPlusCGQREQ |
+--------------------------------------------------------------------+
PURPOSE : +CGQREQ command (context QOS request)
*/
GLOBAL T_ATI_RSLT setatPlusCGQREQ (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_FAIL;
T_PS_qos input_qos;
U8 cid;
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGQREQ ()");
cid = PDP_CONTEXT_CID_OMITTED;
input_qos.qos_r97.delay = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.relclass = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.peak = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.preced = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.mean = (U8) PDP_CONTEXT_QOS_OMITTED;
cl = parse( cl,"caaaar", &cid,
1L ,&input_qos.qos_r97.preced,
1L ,&input_qos.qos_r97.delay,
1L ,&input_qos.qos_r97.relclass,
1L ,&input_qos.qos_r97.peak,
&input_qos.qos_r97.mean );
if ( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
if ( input_qos.qos_r97.preced NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.preced -= '0';
if ( input_qos.qos_r97.delay NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.delay -= '0';
if ( input_qos.qos_r97.relclass NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.relclass -= '0';
if ( input_qos.qos_r97.peak NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.peak -= '0';
if ( input_qos.qos_r97.mean EQ 0xff )
input_qos.qos_r97.mean = 0;
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgqreq cgqreq;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGQREQ;
cmd.params.ptr_set_plus_cgqreq=&cgqreq;
cgqreq.cid=(T_BAT_pdp_cid)cid;
cgqreq.precedence = (T_BAT_precedence)input_qos.qos_r97.preced;
cgqreq.delay = (T_BAT_delay)input_qos.qos_r97.delay;
cgqreq.reliability = (T_BAT_reliability)input_qos.qos_r97.relclass;
cgqreq.peak = (T_BAT_peak)input_qos.qos_r97.peak;
cgqreq.mean = (T_BAT_mean)input_qos.qos_r97.mean;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGQREQ;
return(ATI_EXCT);
}
#else
ret = sAT_PlusCGQREQ ((T_ACI_CMD_SRC)srcId, cid ,&input_qos);
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
// src_params->curAtCmd = AT_CMD_CGQREQ;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : queatPlusCGQREQ |
+--------------------------------------------------------------------+
PURPOSE : Reading +CGQREQ command (context QOS request)
*/
GLOBAL T_ATI_RSLT queatPlusCGQREQ (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_PS_qos pdef_qos;
BOOL qos_valid = FALSE;
T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL;
#endif
TRACE_FUNCTION("queatPlusCGQREQ ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGQREQ;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgqreq = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
p_pdp_context_node = p_pdp_context_list;
while( p_pdp_context_node )
{
if (qAT_PlusCGQREQ ((T_ACI_CMD_SRC)srcId, p_pdp_context_node->cid, &qos_valid, &pdef_qos ) EQ AT_CMPL)
{
if( qos_valid )
{
sprintf( g_sa, "+CGQREQ: %hd,%d,%d,%d,%d,%d",
p_pdp_context_node->cid,
pdef_qos.qos_r97.preced,
pdef_qos.qos_r97.delay,
pdef_qos.qos_r97.relclass,
pdef_qos.qos_r97.peak,
pdef_qos.qos_r97.mean );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT );
}
}
else
{
/* AT_FAIL has been returned */
cmdCmeError(CME_ERR_Unknown); /* The command is invalid for srcId */
return (ATI_FAIL);
}
p_pdp_context_node = p_pdp_context_node->p_next;
}
return (ATI_CMPL);
#endif
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : atPlusCGQMIN |
+--------------------------------------------------------------------+
PURPOSE : +CGQMIN command (context min QOS requirement)
*/
GLOBAL T_ATI_RSLT setatPlusCGQMIN (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_FAIL;
T_PS_min_qos input_qos;
U8 cid;
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGQMIN ()");
cid = PDP_CONTEXT_CID_OMITTED;
input_qos.qos_r97.delay = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.relclass = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.peak = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.preced = (U8) PDP_CONTEXT_QOS_OMITTED;
input_qos.qos_r97.mean = (U8) PDP_CONTEXT_QOS_OMITTED;
cl = parse( cl, "caaaar", &cid,
1L, &input_qos.qos_r97.preced,
1L, &input_qos.qos_r97.delay,
1L, &input_qos.qos_r97.relclass,
1L, &input_qos.qos_r97.peak,
&input_qos.qos_r97.mean );
if ( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgqmin cgqmin;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGQMIN;
cmd.params.ptr_set_plus_cgqmin=&cgqmin;
cgqmin.cid=(T_BAT_pdp_cid)cid;
/*
if (input_qos.preced!=GPRS_QOS_OMITTED)
cgqmin.precedence=(T_BAT_precedence)input_qos.preced;
else
cgqmin.precedence=BAT_PRECEDENCE_NOT_PRESENT;
if (input_qos.delay!=GPRS_QOS_OMITTED)
cgqmin.delay=(T_BAT_delay)input_qos.delay;
else
cgqmin.delay=BAT_DELAY_NOT_PRESENT;
if (input_qos.relclass!=GPRS_QOS_OMITTED)
cgqmin.reliability=(T_BAT_reliability)input_qos.relclass;
else
cgqmin.reliability=BAT_RELIABILITY_NOT_PRESENT;
if (input_qos.peak!=GPRS_QOS_OMITTED)
cgqmin.peak=(T_BAT_peak)input_qos.peak;
else
cgqmin.peak=BAT_PEAK_NOT_PRESENT;
if (input_qos.mean)
cgqmin.mean=(T_BAT_mean)input_qos.mean;
else
cgqmin.mean=BAT_MEAN_NOT_PRESENT;
*/
cgqmin.precedence = (T_BAT_precedence)input_qos.qos_r97.preced;
cgqmin.delay = (T_BAT_delay)input_qos.qos_r97.delay;
cgqmin.reliability = (T_BAT_reliability)input_qos.qos_r97.relclass;
cgqmin.peak = (T_BAT_peak)input_qos.qos_r97.peak;
cgqmin.mean = (T_BAT_mean)input_qos.qos_r97.mean;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGQMIN;
return(ATI_EXCT);
}
#else
if ( input_qos.qos_r97.preced NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.preced -= '0';
if ( input_qos.qos_r97.delay NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.delay -= '0';
if ( input_qos.qos_r97.relclass NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.relclass -= '0';
if ( input_qos.qos_r97.peak NEQ PDP_CONTEXT_QOS_OMITTED )
input_qos.qos_r97.peak -= '0';
if ( input_qos.qos_r97.mean EQ 0xff )
input_qos.qos_r97.mean = 0;
ret = sAT_PlusCGQMIN((T_ACI_CMD_SRC)srcId, cid, &input_qos );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGQMIN;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : queatPlusCGQMIN |
+--------------------------------------------------------------------+
PURPOSE : Reading +CGQMIN command (context min QOS requirement)
*/
GLOBAL T_ATI_RSLT queatPlusCGQMIN (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_PS_qos pdef_qos;
BOOL qos_valid = FALSE;
T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL;
#endif
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGQMIN;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgqmin = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
TRACE_FUNCTION("queatPlusCGQMIN ()");
p_pdp_context_node = p_pdp_context_list;
while( p_pdp_context_node )
{
if( qAT_PlusCGQMIN((T_ACI_CMD_SRC)srcId, p_pdp_context_node->cid, &qos_valid, &pdef_qos ) EQ AT_CMPL )
{
if (qos_valid)
{
/* In the privous version of alborg code is the paramters are ommited then
the code is sending ',' instead of default values. Now it changed
*/
sprintf( g_sa, "+CGQMIN: %hd,%d,%d,%d,%d,%d",
p_pdp_context_node->cid,
pdef_qos.qos_r97.preced,
pdef_qos.qos_r97.delay,
pdef_qos.qos_r97.relclass,
pdef_qos.qos_r97.peak,
pdef_qos.qos_r97.mean );
io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT );
}
}
else
{
/* AT_FAIL has been returned */
cmdCmeError(CME_ERR_Unknown); /* The command is invalid for srcId */
return (ATI_FAIL);
}
p_pdp_context_node = p_pdp_context_node->p_next;
}
return (ATI_CMPL);
#endif
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : atPlusCGATT |
+--------------------------------------------------------------------+
PURPOSE : +CGATT command ( GPRS attach/detach )
*/
GLOBAL T_ATI_RSLT setatPlusCGATT (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_FAIL;
T_CGATT_STATE state = CGATT_STATE_OMITTED;
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGATT ()");
cl=parse(cl,"d",&state);
if ( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgatt cgatt;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGATT;
cmd.params.ptr_set_plus_cgatt=&cgatt;
/*
* This relies on T_CGATT_STATE being identical to
* T_BAT_plus_cgatt_state.
*/
cgatt.state=(T_BAT_plus_cgatt_state)state;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGATT;
return(ATI_EXCT);
}
#else
ret = sAT_PlusCGATT ((T_ACI_CMD_SRC)srcId, state );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGATT;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif
}
GLOBAL T_ATI_RSLT queatPlusCGATT (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
char *me="+CGATT: ";
T_ACI_RETURN ret = AT_FAIL;
T_CGATT_STATE state = CGATT_STATE_OMITTED;
#endif
TRACE_FUNCTION("queatPlusCGATT ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGATT;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgatt = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret = qAT_PlusCGATT((T_ACI_CMD_SRC)srcId, &state);
if (ret EQ AT_CMPL)
{
sprintf(g_sa,"%s%d", me, state);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
#endif
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : atPlusCGCLASS |
+--------------------------------------------------------------------+
PURPOSE : +CGCLASS command (GPRS class change)
*/
GLOBAL T_ATI_RSLT setatPlusCGCLASS (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_FAIL;
T_CGCLASS_CLASS m_class = CGCLASS_CLASS_OMITTED;
char test_class[3]="";
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("atPlusCGCLASS ()");
cl = parse (cl,"s", (LONG)3, &test_class );
switch (*test_class)
{
case 'A':
break;
case 'B':
m_class = CGCLASS_CLASS_B;
break;
case 'C':
switch(*(test_class + 1))
{
case 'G':
m_class = CGCLASS_CLASS_CG;
break;
case 'C':
m_class = CGCLASS_CLASS_CC;
break;
default:
break;
}
break;
default:
break;
}
if ( !cl OR m_class EQ CGCLASS_CLASS_OMITTED )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgclass cgclass;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGCLASS;
cmd.params.ptr_set_plus_cgclass=&cgclass;
/*
* This relies on T_BAT_mobile_class and T_CGCLASS_CLASS
* being identical.
*/
cgclass.mobile_class=(T_BAT_mobile_class)m_class;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGCLASS;
return(ATI_EXCT);
}
#else
ret = sAT_PlusCGCLASS ((T_ACI_CMD_SRC)srcId, m_class );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGCLASS;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
GLOBAL T_ATI_RSLT queatPlusCGCLASS (char *cl, UBYTE srcId)
{
//#ifndef FF_ATI_BAT
char *me="+CGCLASS: ";
char *classes[] = {"A","B","CG","CC"};
T_ACI_RETURN ret = AT_FAIL;
T_CGCLASS_CLASS m_class = CGCLASS_CLASS_OMITTED;
//#endif
TRACE_FUNCTION("queatPlusCGCLASS ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGCLASS;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgclass = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret = qAT_PlusCGCLASS((T_ACI_CMD_SRC)srcId, &m_class);
if (ret EQ AT_CMPL)
{
sprintf(g_sa,"%s\"%s\"", me, classes[m_class]);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : atPlusCGACT |
+--------------------------------------------------------------------+
PURPOSE : +CGACT command (context activation/deactivation)
*/
GLOBAL T_ATI_RSLT setatPlusCGACT (char *cl, UBYTE srcId)
{
char *end;
T_ACI_RETURN ret = AT_FAIL;
T_CGACT_STATE state = CGACT_STATE_OMITTED;
U8 count = 0;
U8 cid;
SHORT cid_array[PDP_CONTEXT_CID_MAX + 1];
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGACT ()");
end = cl;
if ( *cl NEQ ',' )
state = (T_CGACT_STATE) strtol(cl, &end, 10);
while ( *end EQ ',' )
{
cl = end; /* advace to the next delimiter */
cl ++; /* skip the delimiter */
cid = PDP_CONTEXT_CID_INVALID;
cid = (U8) strtol (cl, &end, 10);
if (cid < PDP_CONTEXT_CID_MIN OR cid > PDP_CONTEXT_CID_MAX OR count > PDP_CONTEXT_CID_MAX)
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
cid_array[count] = cid;
count ++;
}
if(count<12)
{
cid_array[count] = PDP_CONTEXT_CID_INVALID;
}
cl = end;
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgact cgact;
UBYTE n;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGACT;
cmd.params.ptr_set_plus_cgact=&cgact;
/*
* This relies on T_BAT_plus_cgact_state and T_CGACT_STATE
* being identical.
*/
cgact.state=(T_BAT_plus_cgact_state)state;
for (n=0;((n<count) AND (n<BAT_MAX_PDP_CID));n++)
cgact.cid[n]=(T_BAT_pdp_cid)cid_array[n];
cgact.c_cid=(U8)n;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGACT;
return(ATI_EXCT);
}
#else
/* (De) Activate necessary contexts */
ret = sAT_PlusCGACT ((T_ACI_CMD_SRC)srcId, state, cid_array );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGACT;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
GLOBAL T_ATI_RSLT queatPlusCGACT (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
char *me="+CGACT: ";
T_ACI_RETURN ret = AT_FAIL;
U8 count = 0;
SHORT cid_array[PDP_CONTEXT_CID_MAX + 1];
BOOL states[PDP_CONTEXT_CID_MAX + 1];
#endif
TRACE_FUNCTION("queatPlusCGACT ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGACT;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgact = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret=qAT_PlusCGACT((T_ACI_CMD_SRC)srcId, states, cid_array);
if (ret EQ AT_CMPL)
{
for( count = 0; count < PDP_CONTEXT_CID_MAX AND cid_array[count] NEQ PDP_CONTEXT_CID_INVALID; count++ )
{
sprintf(g_sa,"%s%hd,%d", me, cid_array[count], states[count] EQ TRUE? 1 : 0);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : atPlusCGDATA |
+--------------------------------------------------------------------+
PURPOSE : +CGDATA command (data connect)
*/
GLOBAL T_ATI_RSLT setatPlusCGDATA (char *cl, UBYTE srcId)
{
char L2P[MAX_L2P_LENGTH] = "", *end;
T_ACI_RETURN ret = AT_FAIL;
U8 count = 0, stop = 1;
U8 cid_array[PDP_CONTEXT_CID_MAX];
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGDATA ()");
memset( &cid_array, PDP_CONTEXT_CID_INVALID, sizeof(cid_array) );
switch ( *cl )
{
case ',':
/* the L2P is unspecified */
*L2P = 0;
break;
case '\"':
cl++;
while (*cl AND stop)
{
if ( *cl NEQ '\"' AND count < MAX_L2P_LENGTH - 1 )
{
L2P[count] = *cl;
count ++;
cl ++;
}
else
{
L2P[count] = 0;
stop = 0;
}
}
if ( *cl NEQ '\"' )
{ /* Bad user input, abort */
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
cl++;
break;
case 0:
break;
default:
/* Bad user input, abort */
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
end = cl;
count = 0;
while ( *end EQ ',' )
{
cl = end;
cl ++;
cid_array[count] = (U8) strtol (cl, &end, 10);
if ( count >= PDP_CONTEXT_CID_MAX )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
count ++;
}
cl = end;
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgdata cgdata;
UBYTE n;
UBYTE len;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGDATA;
cmd.params.ptr_set_plus_cgdata=&cgdata;
cgdata.v_cid=FALSE;
if (count)
{
for (n=0;((n<count) AND (n<BAT_MAX_PDP_CID));n++)
cgdata.cid[n]=(T_BAT_pdp_cid)cid_array[n];
cgdata.c_cid=(U8)n;
cgdata.v_cid=TRUE;
}
cgdata.v_l2p=FALSE;
if (L2P[0])
{
if ((len=strlen(L2P))<=BAT_MAX_CGDATA_L2P_LEN)
{
cgdata.v_l2p=TRUE;
memcpy(cgdata.l2p,L2P,len);
cgdata.c_l2p=len;
}
}
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGDATA;
return(ATI_EXCT);
}
#else
/*
* if no cid is given or if there is no matching context definition
* the function sAT_PlusCGDATA will process this
*/
/* establish communication between the TE and the network */
ret = sAT_PlusCGDATA ((T_ACI_CMD_SRC)srcId, L2P, cid_array );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
cmdErrStr = NULL;
src_params->curAtCmd = AT_CMD_CGDATA;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : code ROUTINE : atPlusCGPADDR |
+--------------------------------------------------------------------+
PURPOSE : +CGPADDR command (show PDP addresses)
active command returns a list of last used PDP addresses
for specified cids. If unspecified, returns list for all
defined cids.
*/
GLOBAL T_ATI_RSLT setatPlusCGPADDR (char *cl, UBYTE srcId)
{
char *me = "+CGPADDR: ";
char *end;
U8 index = 0;
#ifndef FF_ATI_BAT
T_ACI_RETURN ret;
T_NAS_ip pdp_addresses[PDP_CONTEXT_CID_MAX];
#endif
SHORT cid_array[PDP_CONTEXT_CID_MAX + 1];
TRACE_FUNCTION("setatPlusCGPADDR ()");
do
{
cid_array[index] = (U8) strtol (cl, &end, 10);
if (cid_array[index] EQ 0x00)
cid_array[index] = PDP_CONTEXT_CID_OMITTED;
index++;
cl = end;
if ( *cl EQ ',' )
cl++;
}
while ( *end EQ ',' );
cid_array[index] = PDP_CONTEXT_CID_INVALID;
cl = end;
index = 0;
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgpaddr cgpaddr;
UBYTE n;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGPADDR;
cmd.params.ptr_set_plus_cgpaddr = &cgpaddr;
cgpaddr.c_cid = (U8)index;
if(cgpaddr.c_cid > 0)
{
for (n=0;((n<cgpaddr.c_cid) AND (n<BAT_MAX_PDP_CID));n++)
{
cgpaddr.cid[n]=(T_BAT_pdp_cid)cid_array[n];
}
cgpaddr.c_cid=(U8)n;
}
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
/* return a list of PDP addresses for the specified context identifier */
ret = sAT_PlusCGPADDR ((T_ACI_CMD_SRC)srcId, cid_array, pdp_addresses );
if( ret EQ AT_CMPL )
{
while( cid_array[index] NEQ PDP_CONTEXT_CID_INVALID )
{
if (index NEQ 0)
{//to put a , between pdp adresses, if more than one exists.
sprintf( g_sa, ",");
}
switch( pdp_addresses[index].ctrl_ip_address )
{
case NAS_is_ip_not_present:
sprintf( g_sa, "%s%hd", me, cid_array[index] );
break;
case NAS_is_ipv4:
sprintf( g_sa, "%s%hd,\"%d.%d.%d.%d\"",
me,
cid_array[index],
pdp_addresses[index].ip_address.ipv4_addr.a4[0],
pdp_addresses[index].ip_address.ipv4_addr.a4[1],
pdp_addresses[index].ip_address.ipv4_addr.a4[2],
pdp_addresses[index].ip_address.ipv4_addr.a4[3] );
break;
case NAS_is_ipv6:
sprintf( g_sa, "%s%hd,\"%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\"",
me,
cid_array[index],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 0],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 1],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 2],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 3],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 4],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 5],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 6],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 7],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 8],
pdp_addresses[index].ip_address.ipv6_addr.a6[ 9],
pdp_addresses[index].ip_address.ipv6_addr.a6[10],
pdp_addresses[index].ip_address.ipv6_addr.a6[11],
pdp_addresses[index].ip_address.ipv6_addr.a6[12],
pdp_addresses[index].ip_address.ipv6_addr.a6[13],
pdp_addresses[index].ip_address.ipv6_addr.a6[14],
pdp_addresses[index].ip_address.ipv6_addr.a6[15] );
break;
}
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
index ++;
}
return (ATI_CMPL);
}
else
{
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
GLOBAL T_ATI_RSLT tesatPlusCGPADDR (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
char *me="+CGPADDR: ";
T_ACI_RETURN ret;
U8 index = 0;
U8 cid_array[PDP_CONTEXT_CID_MAX + 1];
int pos = 0;
#endif
TRACE_FUNCTION("tesatPlusCGPADDR ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_TST_PLUS_CGPADDR;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_tst_plus_cgpaddr = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
/* return a list of defined context identifier */
ret = tAT_PlusCGPADDR ((T_ACI_CMD_SRC)srcId, cid_array );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
pos = sprintf(g_sa,"%s(", me);
while( cid_array[index] NEQ PDP_CONTEXT_CID_INVALID )
{
if( index NEQ 0 )
{
g_sa[pos] = ','; pos++;
}
pos += sprintf(g_sa + pos,"%hd", cid_array[index]);
index ++;
}
g_sa[pos] = ')'; pos++;
g_sa[pos] = 0;
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return (ATI_CMPL);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : atPlusCGAUTO |
+--------------------------------------------------------------------+
PURPOSE : +CGAUTO command (auto answer/modem compatibility control)
*/
GLOBAL T_ATI_RSLT setatPlusCGAUTO (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_FAIL;
T_CGAUTO_N n = CGAUTO_N_OMITTED; /* Invalid range value to detect an empty parameter */
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGAUTO ()");
cl = parse (cl,"d", &n );
ret = sAT_PlusCGAUTO ((T_ACI_CMD_SRC)srcId, n );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
at.rngPrms.srcID_CGAUTO = srcId;
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGATT;
at.rngPrms.srcID_CGAUTO = srcId;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
}
GLOBAL T_ATI_RSLT queatPlusCGAUTO (char *cl, UBYTE srcId)
{
char *me="+CGAUTO: ";
T_ACI_RETURN ret = AT_FAIL;
T_CGAUTO_N n = CGAUTO_N_OMITTED; /* Invalid range value to detect an empty parameter */
TRACE_FUNCTION("queatPlusCGAUTO ()");
ret = qAT_PlusCGAUTO((T_ACI_CMD_SRC)srcId, &n);
if (ret EQ AT_CMPL)
{
sprintf(g_sa,"%s%hd", me, n);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : code ROUTINE : atPlusCGANS |
+--------------------------------------------------------------------+
PURPOSE : +CGANS command (answer NW context req)
*/
GLOBAL T_ATI_RSLT setatPlusCGANS (char *cl, UBYTE srcId)
{
char L2P[MAX_L2P_LENGTH] = "";
char *end;
T_ACI_RETURN ret = AT_FAIL;
U8 response;
U8 cid = PDP_CONTEXT_CID_OMITTED;
U8 count = 0;
U8 stop = 1;
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGANS ()");
/*
* Process parameters
*/
response = (U8) strtol (cl, &end, 10);
cl = end;
if( *cl EQ ',' )
{
cl++;
switch ( *cl )
{
case ',':
/* the L2P is unspecified/omitted */
*L2P = 0;
break;
case '\"':
cl++;
while (*cl AND stop)
{
if ( *cl NEQ '\"' AND count < MAX_L2P_LENGTH - 1 )
{
L2P[count] = *cl;
count ++;
cl ++;
}
else
{
L2P[count] = 0;
stop = 0;
}
}
if ( *cl NEQ '\"' )
{ /* Bad user input, abort */
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
cl++;
break;
default:
/* Bad user input, abort */
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
if( *cl EQ ',' )
{
cl++; /* Remove the "," and convert the cid */
cid = ( U8 ) strtol( cl, &end, 10 );
cl = end;
}
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgans cgans;
UBYTE len;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGANS;
cmd.params.ptr_set_plus_cgans=&cgans;
cgans.cid=(T_BAT_pdp_cid)cid;
/*
* This relies on T_BAT_plus_cgans_response and T_CGANS_RESPONSE
* being identical.
*/
cgans.response=(T_BAT_plus_cgans_response)response;
len=strlen(L2P);
cgans.v_l2p=FALSE;
if ((len) AND (len<=BAT_MAX_CGANS_L2P_LEN))
{
memcpy(cgans.l2p,L2P,len);
cgans.c_l2p=(U8)len;
cgans.v_l2p=TRUE;
}
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGANS;
if ((at.rngPrms.isRng EQ TRUE) AND (at.rngPrms.mode EQ CRING_MOD_Gprs))
ati_stop_ring();
return(ATI_EXCT);
}
#else
/* return a list of PDP addresses for the specified context identifier */
ret = sAT_PlusCGANS ((T_ACI_CMD_SRC)srcId, response, L2P, cid );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGANS;
if ( at.rngPrms.isRng EQ TRUE AND
at.rngPrms.mode EQ CRING_MOD_Gprs )
{
ati_stop_ring();
}
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : code ROUTINE : atPlusCGEREP |
+--------------------------------------------------------------------+
PURPOSE : +CGEREP command
*/
GLOBAL T_ATI_RSLT setatPlusCGEREP (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret;
T_CGEREP_MODE mode = CGEREP_MODE_OMITTED;
T_CGEREP_BFR bfr = CGEREP_BFR_OMITTED;
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGEREP ()");
cl=parse(cl,"dd",&mode, &bfr);
ret = sAT_PlusCGEREP ( (T_ACI_CMD_SRC)srcId, mode, bfr );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGEREP;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
}
GLOBAL T_ATI_RSLT queatPlusCGEREP (char *cl, UBYTE srcId)
{
char *me="+CGEREP: ";
T_ACI_RETURN ret;
T_CGEREP_MODE mode = CGEREP_MODE_OMITTED;
T_CGEREP_BFR bfr = CGEREP_BFR_OMITTED;
TRACE_FUNCTION("queatPlusCGEREP ()");
ret=qAT_PlusCGEREP((T_ACI_CMD_SRC)srcId, &mode, &bfr);
if (ret EQ AT_CMPL)
{
sprintf(g_sa,"%s%d,%d", me, mode, bfr);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : code ROUTINE : atPercentCGEREP |
+--------------------------------------------------------------------+
PURPOSE : %CGEREP command
*/
GLOBAL T_ATI_RSLT setatPercentCGEREP (char *cl, UBYTE srcId)
{
TRACE_FUNCTION("setatPercentCGEREP ()");
switch( *cl )
{
case '0':
ati_user_output_cfg[srcId].Percent_CGEREP_stat = 0;
return (ATI_CMPL);
case '1':
ati_user_output_cfg[srcId].Percent_CGEREP_stat = 1;
return (ATI_CMPL);
default:
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
}
GLOBAL T_ATI_RSLT queatPercentCGEREP (char *cl, UBYTE srcId)
{
char *me="%CGEREP: ";
UBYTE mode;
TRACE_FUNCTION("queatPercentCGEREP ()");
mode = ati_user_output_cfg[srcId].Percent_CGEREP_stat;
sprintf(g_sa,"%s%d", me, mode);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return (ATI_CMPL);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : code ROUTINE : setatPlusCGREG |
+--------------------------------------------------------------------+
PURPOSE : +CGREG command
*/
GLOBAL T_ATI_RSLT setatPlusCGREG (char *cl, UBYTE srcId)
{
T_ATI_CREG_MOD mode=CREG_MOD_OFF;
TRACE_FUNCTION("setatPlusCGREG()");
cl=parse(cl,"d",&mode);
switch(mode)
{
case CREG_MOD_OFF:
case CREG_MOD_ON:
case CREG_MOD_LOC_INF_ON:
/* user wants to set mode: reset CREG related ATI parameters */
ati_creg_init(srcId, PlusCGREG_CMD);
ati_gprs_user_output_cfg[srcId].plus_cgreg.mod_lac_cid.pres_mode = mode;
return ATI_CMPL;
default:
cmdCmeError(CME_ERR_OpNotAllow);
return ATI_FAIL;
}
}
GLOBAL T_ATI_RSLT queatPlusCGREG (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_CGREG_STAT stat;
USHORT lac, cid;
T_ATI_CREG_MOD mode;
short pos;
#endif
TRACE_FUNCTION("queatPlusCGREG()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGREG;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgreg = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
mode = ati_gprs_user_output_cfg[srcId].plus_cgreg.mod_lac_cid.pres_mode;
if (qAT_PlusCGREG((T_ACI_CMD_SRC)srcId, &stat, &lac, &cid) NEQ AT_CMPL)
{
cmdCmeError(CME_ERR_Unknown);
return ATI_FAIL;
}
pos = sprintf(g_sa, "+CGREG: %d,%d", mode, stat);
if(mode EQ CREG_MOD_LOC_INF_ON)
{
if(stat EQ CGREG_STAT_REG_HOME OR stat EQ CGREG_STAT_REG_ROAM)
sprintf(g_sa+pos, ",\"%04X\",\"%04X\"", lac, cid);
}
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return ATI_CMPL;
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : code ROUTINE : setatPercentCGREG |
+--------------------------------------------------------------------+
PURPOSE : %CGREG command
*/
GLOBAL T_ATI_RSLT setatPercentCGREG (char *cl, UBYTE srcId)
{
T_ATI_CREG_MOD mode=CREG_MOD_OFF;
TRACE_FUNCTION("setatPercentCGREG()");
cl=parse(cl,"d",&mode);
switch(mode)
{
case CREG_MOD_OFF:
case CREG_MOD_ON:
case CREG_MOD_LOC_INF_ON:
case CREG_MOD_LOC_INF_ON_CTXACT:
/* user wants to set mode: reset CREG related ATI parameters */
ati_creg_init(srcId, PercentCGREG_CMD);
ati_gprs_user_output_cfg[srcId].percent_cgreg.mod_lac_cid.pres_mode = mode;
return ATI_CMPL;
default:
cmdCmeError(CME_ERR_OpNotAllow);
return ATI_FAIL;
}
}
GLOBAL T_ATI_RSLT queatPercentCGREG (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_P_CGREG_STAT stat;
USHORT lac, cid;
T_ATI_CREG_MOD mode;
SHORT pos;
#endif
TRACE_FUNCTION("queatPercentCGREG()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PERCENT_CGREG;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgreg = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
mode = ati_gprs_user_output_cfg[srcId].percent_cgreg.mod_lac_cid.pres_mode;
if (qAT_PercentCGREG((T_ACI_CMD_SRC)srcId, &stat, &lac, &cid) NEQ AT_CMPL)
{
cmdCmeError(CME_ERR_Unknown);
return ATI_FAIL;
}
pos = sprintf(g_sa,"%s: %d,%d", "%CGREG", mode, stat);
if (mode EQ CREG_MOD_LOC_INF_ON OR mode EQ CREG_MOD_LOC_INF_ON_CTXACT)
{
if (stat EQ P_CGREG_STAT_REG_HOME OR stat EQ P_CGREG_STAT_REG_ROAM)
pos += sprintf(g_sa+pos, ",\"%04X\",\"%04X\"", lac, cid);
else if (mode EQ CREG_MOD_LOC_INF_ON_CTXACT)
pos += sprintf(g_sa+pos, ",,"); /* if CTXACT follows so lac and cid are ommitted */
}
if (mode EQ CREG_MOD_LOC_INF_ON_CTXACT)
sprintf(g_sa+pos, (cmhSM_isContextActive() ? ",1" : ",0"));
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return ATI_CMPL;
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : code ROUTINE : atPlusCGSMS |
+--------------------------------------------------------------------+
PURPOSE : +CGSMS command (define MO SMS behaviour)
*/
GLOBAL T_ATI_RSLT setatPlusCGSMS (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_ACI_RETURN ret;
#endif
T_CGSMS_SERVICE service = CGSMS_SERVICE_OMITTED; /* Invalid range value to detect an empty parameter */
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("setatPlusCGSMS ()");
cl=parse(cl,"d",&service);
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgsms cgsms;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGSMS;
cmd.params.ptr_set_plus_cgsms=&cgsms;
/*
* This relies on T_BAT_plus_cgsms_service and T_CGSMS_SERVICE
* being identical.
*/
cgsms.service=(T_BAT_plus_cgsms_service)service;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGSMS;
return(ATI_EXCT);
}
#else
if( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
ret = sAT_PlusCGSMS ( (T_ACI_CMD_SRC)srcId, service );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
src_params->curAtCmd = AT_CMD_CGSMS;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
GLOBAL T_ATI_RSLT queatPlusCGSMS (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
char *me="+CGSMS: ";
T_ACI_RETURN ret;
T_CGSMS_SERVICE service = CGSMS_SERVICE_OMITTED; /* Invalid range value to detect an empty parameter */
#endif
TRACE_FUNCTION("queatPlusCGSMS ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PLUS_CGSMS;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgsms = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret = qAT_PlusCGSMS((T_ACI_CMD_SRC)srcId, &service);
if (ret EQ AT_CMPL)
{
sprintf(g_sa,"%s%hd", me, service);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return (ATI_CMPL);
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
GLOBAL T_ATI_RSLT tesatPlusCGSMS (char *cl, UBYTE srcId)
{
char *me="+CGSMS: ", list[10] = "(0-3)";
T_ACI_RETURN ret;
T_CGSMS_SERVICE service = CGSMS_SERVICE_OMITTED; /* Invalid range value to detect an empty parameter */
SHORT service_list;
TRACE_FUNCTION("tesatPlusCGSMS ()");
ret = tAT_PlusCGSMS ( (T_ACI_CMD_SRC)srcId, &service_list );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
if ( service_list NEQ 15 )
{
list[1] = service EQ 1 ? '0':'1';
list[2] = ')';
list[3] = 0;
}
cl++;
sprintf(g_sa,"%s%s", me, list);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return (ATI_CMPL);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finnished ROUTINE : atGD |
+--------------------------------------------------------------------+
PURPOSE : +ATD command
*/
GLOBAL T_ATI_RSLT atGD (char *cl, UBYTE srcId, BOOL *gprs_command)
{
enum
{
ATD_CMD_NOT_VALID = 0,
ATD_CMD_98 = 1,
ATD_CMD_99 = 2
} atd_cmd_type = ATD_CMD_NOT_VALID;
U8 i = 0;
U8 star_count = 0;
char tmp_cmd[40];
char *p_tmp_cmd = tmp_cmd;
char c_addr[MAX_B_SUBSCR_NUM_LEN];
char L2P[MAX_L2P_LENGTH];
U8 cid_array[PDP_CONTEXT_CID_MAX];
U8 cid_length = PDP_CONTEXT_CID_MAX + 1;
#if defined (FF_WAP) OR defined (FF_SAT_E)
BOOL src_flag = FALSE;
#endif
T_PDP_TYPE pdp_type = "IP";
T_PDP_CONTEXT pdp_context;
T_ACI_RETURN ret = AT_FAIL;
T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL;
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
TRACE_FUNCTION("atGD ()");
TRACE_EVENT ("ati_gprs, atGD, start");
//TRACE_EVENT (cl);
memset( L2P, 0, sizeof( L2P ) );
memset( cid_array, PDP_CONTEXT_CID_INVALID, sizeof( cid_array ) );
cid_array[0] = PDP_CONTEXT_CID_OMITTED;
memset( tmp_cmd, 0, sizeof(tmp_cmd) );
#if defined (FF_WAP) OR defined (FF_SAT_E)
if( (ati_is_src_type((UBYTE)srcId, ATI_SRC_TYPE_TST) EQ TRUE) OR
(srcId EQ CMD_SRC_LCL) )
{
TRACE_EVENT ("Source Found is LOCAL");
/* if call not yet marked as WAP call, mark it now */
if (Wap_Call)
{
TRACE_EVENT ("ati_gprs, atGD, WAP Call for atd*98# OR atd*99#");
src_flag = TRUE;
}
}
#endif
if (cl EQ NULL)
{
*gprs_command = FALSE;
return (ATI_FAIL);
}
/* ignore modifier */
switch ( *cl )
{
case 'T':
case 't':
case 'P':
case 'p':
if ( *(cl + 1) EQ '*' )
{
cl+=2;
}
else
{
*gprs_command = FALSE;
return (ATI_FAIL);
}
break;
case '*':
cl++;
break;
default:
*gprs_command = FALSE;
return (ATI_FAIL);
}
do
{
switch( *(cl + i) )
{
case '*':
tmp_cmd[i] = ',';
star_count++;
break;
case '#':
tmp_cmd[i] = 0;
break;
default :
tmp_cmd[i] = *(cl + i);
break;
}
i++;
}
while( *(cl + i) NEQ '#' AND i < 40 );
if( i EQ 40 )
{
*gprs_command = FALSE;
return (ATI_FAIL);
}
if( tmp_cmd[0] EQ '9' AND
tmp_cmd[1] EQ '8' )
{
/* Character after *98 should be * or # for GPRS; otherwise
this is USSD (refer issue 16289) */
if( tmp_cmd[2] NEQ ',' AND
tmp_cmd[2] NEQ 0 )
{
*gprs_command = FALSE;
return (ATI_FAIL);
}
if ( tmp_cmd[2] NEQ 0 )
p_tmp_cmd = parse( &tmp_cmd[3], "i", &cid_length, &cid_array );
if(p_tmp_cmd)
atd_cmd_type = ATD_CMD_98;
}
else if( tmp_cmd[0] EQ '9' AND
tmp_cmd[1] EQ '9' )
{
/* Character after *99 should be * or # for GPRS; otherwise
this is USSD (refer issue 16289) */
if( tmp_cmd[2] NEQ ',' AND
tmp_cmd[2] NEQ 0 )
{
*gprs_command = FALSE;
return (ATI_FAIL);
}
switch( star_count )
{
case 1:
tmp_cmd[i] = ',';
tmp_cmd[i+1] = ',';
tmp_cmd[i+1] = 0;
break;
case 2:
tmp_cmd[i] = ',';
tmp_cmd[i+1] = 0;
break;
}
if ( tmp_cmd[2] NEQ 0 )
p_tmp_cmd = parse( &tmp_cmd[3], "aai", (LONG)MAX_B_SUBSCR_NUM_LEN, c_addr,
(LONG)MAX_L2P_LENGTH, L2P,
&cid_length, &cid_array );
if(p_tmp_cmd)
atd_cmd_type = ATD_CMD_99;
}
else
{
*gprs_command = FALSE;
return (ATI_FAIL);
}
switch( atd_cmd_type )
{
case ATD_CMD_98:
{
strcpy( L2P, "PPP" );
strcpy( pdp_type, "IP" );
break;
}
case ATD_CMD_99:
{
if( ! strcmp(L2P,"") )
{
/* L2P is omitted use PPP as L2 protocol*/
strcpy( L2P, "PPP" );
}
else if( !(strcmp(L2P, "1") AND strcmp(L2P,"PPP")) )
{
strcpy( L2P, "PPP" );
}
#if defined(FF_PKTIO) OR defined(FF_TCP_IP) OR defined (FF_PSI)
else if( !(strcmp(L2P, "901") AND strcmp(L2P, "M-PKT")) )
{
strcpy( L2P, "M-PKT" );
}
#endif /* FF_PKTIO or FF_TCP_IP or FF_PSI */
else
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
strcpy( pdp_type, "IP" );
break;
}
}
if( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
*gprs_command = FALSE;
return (ATI_FAIL);
}
#if defined (FF_WAP) OR defined (FF_SAT_E)
if (src_flag)
{
memset (work_cids, PDP_CONTEXT_CID_INVALID, PDP_CONTEXT_CID_MAX);
cid_pointer=0;
}
#endif
/*
* If the cid is omitted a matching defined context is found or a new context is created.
*/
if( cid_array[0] EQ PDP_CONTEXT_CID_OMITTED )
{
p_pdp_context_node = p_pdp_context_list;
while(p_pdp_context_node AND
strcmp(p_pdp_context_node->attributes.pdp_type, pdp_type) AND
p_pdp_context_node->internal_data.state NEQ PDP_CONTEXT_STATE_DEFINED )
{
p_pdp_context_node = p_pdp_context_node->p_next;
}
if(p_pdp_context_node)
{
cid_array[0] = p_pdp_context_node->cid;
#if defined (FF_WAP) OR defined (FF_SAT_E)
if (src_flag)
{
work_cids[cid_pointer] = cid_array[0];
}
#endif
}
else
{
cid_array[0] = pdp_context_get_free_cid();
memcpy( &pdp_context, &pdp_context_default.attributes, sizeof(T_PDP_CONTEXT) );
memcpy( pdp_context.pdp_type, pdp_type, sizeof(T_PDP_TYPE));
sAT_PlusCGDCONT((T_ACI_CMD_SRC) srcId, cid_array[0], &pdp_context );
#if defined (FF_WAP) OR defined (FF_SAT_E)
if (src_flag)
{
work_cids[cid_pointer] = cid_array[0];
}
#endif
}
}
else
{
i=0;
while( cid_array[i] NEQ PDP_CONTEXT_CID_INVALID )
{
p_pdp_context_node = pdp_context_find_node_from_cid( cid_array[i] );
if( p_pdp_context_node )
{
if( strcmp( p_pdp_context_node->attributes.pdp_type, pdp_type ) )
strcpy( p_pdp_context_node->attributes.pdp_type, pdp_type );
#if defined (FF_WAP) OR defined (FF_SAT_E)
if (src_flag)
{
work_cids[i] = cid_array[i];
cid_pointer = i;
}
#endif
}
else
{
memcpy( &pdp_context, &pdp_context_default.attributes, sizeof(T_PDP_CONTEXT) );
memcpy( pdp_context.pdp_type, pdp_type, sizeof(T_PDP_TYPE));
if( sAT_PlusCGDCONT((T_ACI_CMD_SRC) srcId, cid_array[i], &pdp_context ) EQ AT_FAIL )
{
*gprs_command = FALSE;
return (ATI_FAIL);
}
#if defined (FF_WAP) OR defined (FF_SAT_E)
if (src_flag)
{
work_cids[i] = cid_array[i];
cid_pointer = i;
}
#endif
}
i++;
}
}
*gprs_command = TRUE;
#if defined (FF_WAP) OR defined (FF_SAT_E)
if (src_flag)
{
BYTE options;
SRCC_LINK_NO link_no = SRCC_INVALID_LINK;
/* process WAP over GPRS */
/*
*-------------------------------------------------------------------
* check entity status
*-------------------------------------------------------------------
*/
if( smEntStat.curCmd NEQ AT_CMD_NONE )
{
return( ATI_BUSY );
}
if(is_gpf_tcpip_call()) {
GPF_TCPIP_STATEMENT(link_no = SRCC_TCPIP_SNDCP_LINK);
}
else {
link_no = SRCC_IP_SNDCP_LINK;
}
/* check number of context */
if ( TRUE NEQ srcc_reserve_sources( link_no, 1 ) )
{
TRACE_EVENT ("srcc_reserve_sources failed!");
cmdCmeError(CME_ERR_Unknown);
return ( ATI_FAIL );
}
/* get dti id */
srcc_new_count(link_no);
wap_dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
p_pdp_context_node = pdp_context_find_node_from_cid( cid_array[0] );
p_pdp_context_node->internal_data.link_id_new =
dti_conn_compose_link_id (0,0, wap_dti_id, DTI_TUPLE_NO_NOTPRESENT );
p_pdp_context_node->internal_data.owner = ( T_ACI_CMD_SRC)srcId;
TRACE_EVENT_P1 ("ati_gprs, atGD, link_id_new = %0X", p_pdp_context_node->internal_data.link_id_new);
/* set IP options */
if(is_gpf_tcpip_call()) {
options = TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_TCPIP;
}
else {
options = TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP;
}
/* send request to ACI WAP to activate WAP */
smShrdPrm.owner = srcId;
smEntStat.entOwn = (T_ACI_CMD_SRC)smShrdPrm.owner;
smEntStat.curCmd = AT_CMD_CGDATA;
gpppEntStat.curCmd = AT_CMD_CGDATA;
gpppEntStat.entOwn = ( T_ACI_CMD_SRC)srcId;
gpppShrdPrm.owner = (UBYTE) srcId;
if(src_params)
{
src_params->curAtCmd = AT_CMD_CGDATA;
}
psaTCPIP_Activate( srcId, wap_dti_id,
wapId, options, TCPIP_CONNECTION_TYPE_GPRS_WAP,
cmhSM_IP_activate_cb);
return (ATI_EXCT);
}
#endif /* of WAP OR SAT E */
if( cmhSM_sAT_A(( T_ACI_CMD_SRC) srcId, &ret ) EQ TRUE )
{
switch (ret)
{
case (AT_CMPL): /* Operation completed */
return (ATI_CMPL);
case (AT_EXCT):
/* curAtCmd = AT_CMD_CGANS; */
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /* Command failed */
return (ATI_FAIL);
}
}
else
{
ret = sAT_PlusCGDATA ((T_ACI_CMD_SRC) srcId, L2P, cid_array );
switch (ret)
{
case (AT_CMPL): /* Operation completed */
return (ATI_CMPL);
case (AT_EXCT):
if(src_params)
{
src_params->curAtCmd = AT_CMD_CGDATA;
}
return (ATI_EXCT);
case (AT_BUSY):
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
default:
cmdCmeError(CME_ERR_NotPresent); /*Command failed*/
return (ATI_FAIL);
}
}
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : setatPercentCGAATT |
+--------------------------------------------------------------------+
PURPOSE : %CGAATT command ( GPRS automatic attach mode )
*/
GLOBAL T_ATI_RSLT setatPercentCGAATT (char *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_FAIL;
T_CGAATT_ATTACH_MODE att_m = CGAATT_ATTACH_MODE_OMITTED;
T_CGAATT_DETACH_MODE det_m = CGAATT_DETACH_MODE_OMITTED;
TRACE_FUNCTION("setatPercentCGAATT ()");
cl=parse(cl,"dd",&att_m, &det_m);
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_percent_cgaatt cgaatt;
cmd.ctrl_params = BAT_CMD_SET_PERCENT_CGAATT;
cmd.params.ptr_set_percent_cgaatt=&cgaatt;
/*
* This relies on T_CGAATT_ATTACH_MODE and T_GGAATT_DETACH_MODE being
* identical to T_BAT_percent_cgaatt_att_m and T_BAT_percent_cgaatt_det_m.
*/
cgaatt.att_m=(T_BAT_percent_cgaatt_att_m)att_m;
cgaatt.det_m=(T_BAT_percent_cgaatt_det_m)det_m;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
if( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
ret = sAT_PercentCGAATT ((T_ACI_CMD_SRC)srcId, att_m, det_m );
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
GLOBAL T_ATI_RSLT queatPercentCGAATT (char *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_ACI_RETURN ret;
T_CGAATT_ATTACH_MODE att_m = CGAATT_ATTACH_MODE_OMITTED;
T_CGAATT_DETACH_MODE det_m = CGAATT_DETACH_MODE_OMITTED;
#endif
TRACE_FUNCTION("atPercentCGAATT ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PERCENT_CGAATT;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_percent_cgaatt = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret = qAT_PercentCGAATT((T_ACI_CMD_SRC)srcId, &att_m, &det_m);
if (ret EQ AT_CMPL)
{
sprintf(g_sa,"%s: %d,%d", "%CGAATT", att_m, det_m);
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
return (ATI_CMPL);
}
else
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : setatPercentSNCNT |
+--------------------------------------------------------------------+
PURPOSE : %SNCNT command ( SNDCP Counter )
= 0: reset SNCNT counter.
?: ask for current count.
*/
GLOBAL T_ATI_RSLT setatPercentSNCNT (CHAR *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_CMPL;
TRACE_FUNCTION("setatPercentSNCNT ()");
if( *cl NEQ '0' )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
cl++;
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_percent_sncnt sncnt;
cmd.ctrl_params = BAT_CMD_SET_PERCENT_SNCNT;
cmd.params.ptr_set_percent_sncnt=&sncnt;
sncnt.rst=BAT_P_SNCNT_RESET_RESET;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
/* AT%SNCNT = 0 resets counter */
ret = sAT_PercentSNCNT((T_ACI_CMD_SRC)srcId, TRUE );
return (map_aci_2_ati_rslt(ret));
#endif /*FF_ATI_BAT*/
}
GLOBAL T_ATI_RSLT queatPercentSNCNT (CHAR *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_CMPL;
TRACE_FUNCTION("queatPercentSNCNT ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PERCENT_SNCNT;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_percent_sncnt = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
/* AT%SNCNT? returns current counter without resetting */
ret = sAT_PercentSNCNT( (T_ACI_CMD_SRC)srcId, FALSE );
return (map_aci_2_ati_rslt(ret));
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : setatPercentCGMM |
+--------------------------------------------------------------------+
PURPOSE : %CGMM command ( Configure GMM )
%CGMM = cipher_on, tlli_handling
*/
GLOBAL T_ATI_RSLT setatPercentCGMM(CHAR *cl, UBYTE srcId)
{
T_ACI_RETURN ret = AT_CMPL;
USHORT cipher_on, tlli_handling;
TRACE_FUNCTION("setatPercentCGMM()");
cl=parse(cl, "rr", &cipher_on, &tlli_handling);
if(!cl)
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_percent_cgmm my_bat_set_percent_cgmm;
TRACE_FUNCTION("setatPercentCGMM() calls bat_send() <=== as APPLICATION");
memset(&my_bat_set_percent_cgmm, 0, sizeof(my_bat_set_percent_cgmm));
cmd.ctrl_params = BAT_CMD_SET_PERCENT_CGMM;
cmd.params.ptr_set_percent_cgmm = &my_bat_set_percent_cgmm;
my_bat_set_percent_cgmm.cipher_on = cipher_on;
my_bat_set_percent_cgmm.tlli_handling = tlli_handling;
bat_send(ati_bat_get_client(srcId), &cmd);
return ATI_EXCT; /* executing, because response is passed by callback function */
}
#else /* OLD FUNCTION BODY */
TRACE_FUNCTION("setatPercentCGMM()");
ret = sAT_PercentCGMM( (T_ACI_CMD_SRC)srcId, (UBYTE)cipher_on, (UBYTE)tlli_handling );
if (ret NEQ AT_CMPL)
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (ATI_CMPL);
#endif /* no FF_ATI_BAT*/
}
T_ATI_RSLT setatPercentCGPCO_HEX (UBYTE srcId, USHORT cid,
UBYTE *pco_hex_string, USHORT len)
{
UBYTE pco_len;
UBYTE *pco_array;
TRACE_FUNCTION("setatPercentCGPCO_HEX():");
/*
* The functionality of the command is changed due to the
* introduction of dynamic data structures for PCO.
*/
ACI_MALLOC (pco_array, ACI_PCO_MAX_LEN + 1);
pco_len = (UBYTE) utl_HexStrToBin( pco_hex_string, len, pco_array, ACI_PCO_MAX_LEN + 1 );
if(sAT_PercentCGPCO_HEX ((T_ACI_CMD_SRC)srcId, (U8) cid, pco_array, pco_len) EQ AT_FAIL )
{
cmdCmeError (CME_ERR_Unknown);
ACI_MFREE (pco_array);
return (ATI_FAIL);
}
ACI_MFREE (pco_array);
return (ATI_CMPL);
}
T_ACI_RETURN setatPercentCGPCO_ASCII (UBYTE srcId, U8 cid, UBYTE *pco_ascii_string, USHORT len)
{
CHAR aut_prot[5];
CHAR user[MAX_USER_LEN+1]; /* + '\0' */
CHAR pwd[MAX_PSWD_LEN+1]; /* + '\0' */
CHAR dns1[MAX_DNS_LEN];
CHAR dns2[MAX_DNS_LEN];
CHAR *cl;
TRACE_FUNCTION("setatPercentCGPCO_ASCII():");
/* Initialize arrays */
user[0] = '\0';
pwd[0] = '\0';
dns1[0] = '\0';
dns2[0] = '\0';
cl = parse ((CHAR*)pco_ascii_string, "qqqqq",
sizeof (aut_prot), aut_prot,
sizeof (user), user, sizeof (pwd), pwd, sizeof(dns1), dns1, sizeof(dns2), dns2);
if(cl EQ NULL)
{
cmdCmeError (CME_ERR_InvalidTxtChar);
return ((T_ACI_RETURN)ATI_FAIL);
}
strupper (aut_prot);
if (strcmp (aut_prot, "PAP"))
{
cmdCmeError (CME_ERR_OpNotSupp);
return ((T_ACI_RETURN)ATI_FAIL);
}
if (sAT_PercentCGPCO ((T_ACI_CMD_SRC)srcId, cid,
ACI_PCO_AUTH_PROT_PAP, user, pwd, dns1, dns2) EQ AT_FAIL)
{
cmdCmeError (CME_ERR_Unknown);
return ((T_ACI_RETURN)ATI_FAIL);
}
return ((T_ACI_RETURN)ATI_CMPL);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS MODULE : ATI_GPRS |
| STATE : finished ROUTINE : ipaddr_to_string |
+--------------------------------------------------------------------+
PURPOSE : print the IP address (little endian!) to the supplied string.
*/
GLOBAL void ipaddr_to_string(ULONG ipaddr, char *ipaddr_string)
{
UBYTE *addrbyte_p ; /* Pointer to single address bytes. */
if (ipaddr_string)
{
addrbyte_p = (UBYTE *) &ipaddr ;
if (ipaddr NEQ 0)
{
/* This is for little endian *only*! */
sprintf(ipaddr_string,"%u.%u.%u.%u",
addrbyte_p[3], addrbyte_p[2], addrbyte_p[1], addrbyte_p[0]);
}
else
{
*ipaddr_string = '\0' ;
}
}
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS MODULE : GACI_CMD |
| STATE : finished ROUTINE : queatPercentCGPCO |
+--------------------------------------------------------------------+
PURPOSE : %CGPCO command
* query network pco for cid
*/
LOCAL T_ATI_RSLT queatPercentCGPCO (UBYTE srcId, USHORT cid)
{
char *me="%CGPCO:";
ULONG gateway,dns1,dns2;
char dns1_str[sizeof("255.255.255.255")];
char dns2_str[sizeof("255.255.255.255")];
char gatew_str[sizeof("255.255.255.255")];
USHORT i; /* Counter for loop over context IDs. */
TRACE_FUNCTION("queatPercentCGPCO( )");
if( cid EQ PDP_CONTEXT_CID_OMITTED ) /* for all available cid's: recurse */
{
for( i=1; i<=PDP_CONTEXT_CID_MAX; i++ )
{
queatPercentCGPCO(srcId, i);
}
}
else /* for a specific cid */
{
gateway = dns1 = dns2 = 0 ; /* Just in case... */
if( qAT_PercentCGPCO((T_ACI_CMD_SRC)srcId, &gateway, &dns1, &dns2, cid) EQ AT_CMPL )
{
ipaddr_to_string(dns1, dns1_str);
ipaddr_to_string(dns2, dns2_str);
ipaddr_to_string(gateway, gatew_str);
sprintf( g_sa, "%s \"%s,%s,%s\",%d",
me, dns1_str, dns2_str, gatew_str, cid );
io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT);
memset(g_sa,0,MAX_CMD_LEN);
}
}
return (ATI_CMPL);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS MODULE : GACI_CMD |
| STATE : finished ROUTINE : setatPercentCGPCO |
+--------------------------------------------------------------------+
PURPOSE : %CGPCO command
* set the PCO for context activation
*/
GLOBAL T_ATI_RSLT setatPercentCGPCO(CHAR *cl, UBYTE srcId)
{
U8 cid = PDP_CONTEXT_CID_OMITTED;
T_ACI_CGPCO_FORMAT format;
T_ATI_RSLT ret = ATI_FAIL;
CHAR *pco_string;
T_ACI_CGPCO_MODE mode;
TRACE_FUNCTION("setatPercentCGPCO()");
ACI_MALLOC (pco_string, ACI_PCO_MAX_LEN * 2 + 1);
cl = parse(cl, "ddsr",&mode, &format, ACI_PCO_MAX_LEN * 2 + 1, pco_string, &cid);
if(cl EQ NULL)
{
cmdCmeError (CME_ERR_OpNotAllow);
ACI_MFREE (pco_string);
return (ATI_FAIL);
}
if( !((cid >= PDP_CONTEXT_CID_MIN AND cid <= PDP_CONTEXT_CID_MAX) OR cid EQ PDP_CONTEXT_CID_OMITTED) )
{
cmdCmeError (CME_ERR_OpNotSupp);
ACI_MFREE (pco_string);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_percent_cgpco cgpco;
SHORT len;
cmd.ctrl_params = BAT_CMD_SET_PERCENT_CGPCO;
cmd.params.ptr_set_percent_cgpco = &cgpco;
cgpco.cid=(T_BAT_pdp_cid)cid;
cgpco.v_pco=FALSE;
ret=ATI_EXCT;
switch (mode)
{
case CGPCO_MODE_QUERY_PCO:
cgpco.mode=BAT_P_CGPCO_MODE_QUERY_PCO;
cgpco.format=(T_BAT_percent_cgpco_format)format;
break;
case CGPCO_MODE_SET_PCO:
cgpco.mode=BAT_P_CGPCO_MODE_SET_PCO;
cgpco.format=(T_BAT_percent_cgpco_format)format;
len=strlen(pco_string);
if (len>BAT_MAX_CGPCO_PCO_LEN)
{
ret=ATI_FAIL;
}
else
{
memcpy(cgpco.pco,pco_string,len);
cgpco.c_pco=(U8)len;
cgpco.v_pco=TRUE;
}
break;
default:
cmdCmeError(CME_ERR_OpNotSupp);
ret=ATI_FAIL;
break;
}
if (ret EQ ATI_EXCT)
{
bat_send(ati_bat_get_client(srcId), &cmd);
}
} /* FF_ATI_BAT */
#else
switch (mode)
{
case CGPCO_MODE_QUERY_PCO:
ret = queatPercentCGPCO (srcId,cid);
break;
case CGPCO_MODE_SET_PCO:
{
switch (format)
{
case CGPCO_FORMAT_HEX:
ret = (T_ATI_RSLT)setatPercentCGPCO_HEX (srcId,cid, (UBYTE*)pco_string, (USHORT)strlen (pco_string));
break;
case CGPCO_FORMAT_ASCII:
ret = (T_ATI_RSLT)setatPercentCGPCO_ASCII (srcId, cid, (UBYTE*)pco_string, (USHORT)strlen (pco_string));
break;
default:
cmdCmeError (CME_ERR_OpNotSupp);
ret = ATI_FAIL;
break;
}
}
break;
default:
cmdCmeError (CME_ERR_OpNotSupp);
ret = ATI_FAIL;
break;
}
#endif
ACI_MFREE (pco_string);
return (ret);
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS MODULE : GACI_CMD |
| STATE : finished ROUTINE : setatPercentCGPPP |
+--------------------------------------------------------------------+
PURPOSE : %CGPPP command
* set PPP values in GPRS case
PPP_AP_NO 0x0 no authentication
PPP_AP_PAP 0x1 password authentication protocol
PPP_AP_CHAP 0x2 challenge handshake authentication protocol
PPP_AP_AUTO 0x3 automatic authentication
*/
GLOBAL T_ATI_RSLT setatPercentCGPPP (CHAR *cl, UBYTE srcId)
{
T_ACI_PPP_PROT protocol;
T_ACI_RETURN ret = AT_FAIL;
TRACE_FUNCTION("setatPercentCGPPP( )");
cl=parse(cl,"d",&protocol);
if(!cl)
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_percent_cgppp my_bat_set_percent_cgppp;
TRACE_FUNCTION("setatPercentCGPPP() calls bat_send() <=== as APPLICATION");
memset(&my_bat_set_percent_cgppp, 0, sizeof(my_bat_set_percent_cgppp));
cmd.ctrl_params = BAT_CMD_SET_PERCENT_CGPPP;
cmd.params.ptr_set_percent_cgppp = &my_bat_set_percent_cgppp;
my_bat_set_percent_cgppp.protocol = protocol;
bat_send(ati_bat_get_client(srcId), &cmd);
return ATI_EXCT; /* executing, because response is passed by callback function */
}
#else /* OLD FUNCTION BODY */
TRACE_FUNCTION("setatPercentCGPPP( )");
ret = sAT_PercentCGPPP((T_ACI_CMD_SRC)srcId, protocol);
if (ret EQ AT_FAIL)
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
#endif /* no FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS MODULE : GACI_CMD |
| STATE : finished ROUTINE : queatPercentCGPPP |
+--------------------------------------------------------------------+
PURPOSE : %CGPPP command
* query PPP values in GPRS case
PPP_AP_NO 0x0 no authentication
PPP_AP_PAP 0x1 password authentication protocol
PPP_AP_CHAP 0x2 challenge handshake authentication protocol
PPP_AP_AUTO 0x3 automatic authentication
*/
GLOBAL T_ATI_RSLT queatPercentCGPPP (CHAR *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_ACI_PPP_PROT protocol;
T_ACI_RETURN ret;
#endif
TRACE_FUNCTION("queatPercentCGPPP( )");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PERCENT_CGPPP;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_percent_cgppp = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret = qAT_PercentCGPPP((T_ACI_CMD_SRC)srcId, &protocol);
if (ret EQ AT_FAIL)
{
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
sprintf (g_sa, "%s: %d", "%CGPPP", protocol);
io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT);
return (map_aci_2_ati_rslt(ret));
#endif /*FF_ATI_BAT*/
}
/*
+--------------------------------------------------------------------+
| PROJECT : GPRS (8441) MODULE : GACI_CMD |
| STATE : finished ROUTINE : atPercentCGCLASS |
+--------------------------------------------------------------------+
PURPOSE : %CGCLASS command (GPRS class change)
*/
GLOBAL T_ATI_RSLT setatPercentCGCLASS (CHAR *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
T_ACI_RETURN ret;
#endif
char test_class[3]="";
T_PERCENT_CGCLASS m_class = PERCENT_CGCLASS_OMITTED;
TRACE_FUNCTION("setatPercentCGCLASS ()");
cl = parse (cl,"s", (LONG)3, &test_class );
switch (*test_class)
{
case 'A':
break;
case 'B':
switch(*(test_class + 1))
{
case 'G':
m_class = PERCENT_CGCLASS_BG;
break;
case 'C':
m_class = PERCENT_CGCLASS_BC;
break;
case 'X':
m_class = PERCENT_CGCLASS_BX;
break;
case '\0':
m_class = PERCENT_CGCLASS_B;
break;
default:
break;
}
break;
case 'C':
switch(*(test_class + 1))
{
case 'G':
m_class = PERCENT_CGCLASS_CG;
break;
case 'C':
m_class = PERCENT_CGCLASS_CC;
break;
default:
break;
}
break;
default:
break;
}
if ( !cl OR m_class EQ PERCENT_CGCLASS_OMITTED )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_percent_cgclass cgclass;
cmd.ctrl_params = BAT_CMD_SET_PERCENT_CGCLASS;
cmd.params.ptr_set_percent_cgclass=&cgclass;
/*
* BAT and ACI versions of mobile class are different enough
* to require this conversion.
*/
/*
* This relies on T_BAT_p_mobile_class and T_PERCENT_CGCLASS
* being identical.
*/
cgclass.p_mobile_class=(T_BAT_p_mobile_class)m_class;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret = sAT_PercentCGCLASS ( (T_ACI_CMD_SRC)srcId, m_class );
if (ret EQ AT_FAIL)
{
cmdCmeError (CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
#endif
}
GLOBAL T_ATI_RSLT queatPercentCGCLASS (CHAR *cl, UBYTE srcId)
{
#ifndef FF_ATI_BAT
char *classes[] = {"A","B","BG","BC","BX","CG","CC"};
T_ACI_RETURN ret;
T_PERCENT_CGCLASS m_class, currentClass;
#endif
TRACE_FUNCTION("queatPercentCGCLASS ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_QUE_PERCENT_CGCLASS;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_que_plus_cgclass = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
ret = qAT_PercentCGCLASS((T_ACI_CMD_SRC)srcId, &m_class, ¤tClass);
if (ret EQ AT_CMPL)
{
if(m_class NEQ currentClass)
{
sprintf(g_sa,"%s: \"%s\",\"%s\"", "%CGCLASS", classes[m_class], classes[currentClass]);
}
else
{
sprintf(g_sa,"%s: \"%s\"", "%CGCLASS", classes[m_class]);
}
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
return (map_aci_2_ati_rslt(ret));
#endif /*FF_ATI_BAT*/
}
#ifdef REL99
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : GACI_CMD |
| STATE : devellopment ROUTINE : setatPlusCGEQREQ |
+--------------------------------------------------------------------+
PURPOSE : +CGEQREQ command
Set 3G Quality of Service Profile (Requested)
*/
GLOBAL T_ATI_RSLT setatPlusCGEQREQ( char *cl, UBYTE srcId )
{
T_ACI_RETURN ret;
T_PS_qos input_qos;
U8 cid;
#ifdef FF_ATI_BAT
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
#endif
TRACE_FUNCTION("setatPlusCGEQREQ ()");
cid = PDP_CONTEXT_CID_OMITTED;
input_qos.qos_r99.tc = QOS_R99_TC_OMITTED;
input_qos.qos_r99.order = QOS_R99_ORDER_OMITTED;
input_qos.qos_r99.del_err_sdu = QOS_R99_DEL_ERR_SDU_OMITTED;
input_qos.qos_r99.max_sdu = QOS_R99_MAX_SDU_OMITTED;
input_qos.qos_r99.max_rate_ul = QOS_R99_MAX_BR_UL_OMITTED;
input_qos.qos_r99.max_rate_dl = QOS_R99_MAX_BR_DL_OMITTED;
input_qos.qos_r99.xfer_delay = QOS_R99_XFER_DELAY_OMITTED;
input_qos.qos_r99.handling_pri = QOS_R99_HANDLING_PRIO_OMITTED;
input_qos.qos_r99.guar_br_ul = QOS_R99_GUAR_BR_UL_OMITTED;
input_qos.qos_r99.guar_br_dl = QOS_R99_GUAR_BR_DL_OMITTED;
input_qos.qos_r99.ber.ratio_mant = QOS_R99_RATIO_MANT_OMITTED; /* Residual bit error ratio */
input_qos.qos_r99.ber.ratio_exp = QOS_R99_RATIO_EXP_OMITTED;
input_qos.qos_r99.sdu_err_ratio.ratio_mant = QOS_R99_RATIO_MANT_OMITTED;
input_qos.qos_r99.sdu_err_ratio.ratio_exp = QOS_R99_RATIO_EXP_OMITTED;
cl = parse( cl,"ccrrrrcreecrc", &cid,
&input_qos.qos_r99.tc,
&input_qos.qos_r99.max_rate_ul,
&input_qos.qos_r99.max_rate_dl,
&input_qos.qos_r99.guar_br_ul,
&input_qos.qos_r99.guar_br_dl,
&input_qos.qos_r99.order,
&input_qos.qos_r99.max_sdu,
&input_qos.qos_r99.sdu_err_ratio,
&input_qos.qos_r99.ber, /* Residual bit error ratio */
&input_qos.qos_r99.del_err_sdu,
&input_qos.qos_r99.xfer_delay,
&input_qos.qos_r99.handling_pri );
if( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgeqreq cgeqreq;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGEQREQ;
cmd.params.ptr_set_plus_cgeqreq = &cgeqreq;
cgeqreq.cid = cid;
cgeqreq.tc = input_qos.qos_r99.tc;
cgeqreq.max_rate_ul = input_qos.qos_r99.max_rate_ul;
cgeqreq.max_rate_dl = input_qos.qos_r99.max_rate_dl;
cgeqreq.guar_br_ul = input_qos.qos_r99.guar_br_ul;
cgeqreq.guar_br_dl = input_qos.qos_r99.guar_br_dl;
cgeqreq.order = input_qos.qos_r99.order;
cgeqreq.max_sdu = input_qos.qos_r99.max_sdu;
/* sdu_err_ratio */
if (input_qos.qos_r99.sdu_err_ratio.ratio_mant NEQ
QOS_R99_RATIO_MANT_OMITTED)
{
cgeqreq.v_sdu_err_ratio = TRUE;
cgeqreq.c_sdu_err_ratio = 2;
cgeqreq.sdu_err_ratio[0] = input_qos.qos_r99.sdu_err_ratio.ratio_mant;
if (input_qos.qos_r99.sdu_err_ratio.ratio_exp NEQ
QOS_R99_RATIO_EXP_OMITTED)
cgeqreq.sdu_err_ratio[1] = input_qos.qos_r99.sdu_err_ratio.ratio_exp;
else
cgeqreq.sdu_err_ratio[1] = 1;
}
else
{
cgeqreq.v_sdu_err_ratio = FALSE;
cgeqreq.c_sdu_err_ratio = 0;
}
/* ber */
if (input_qos.qos_r99.ber.ratio_mant NEQ QOS_R99_RATIO_MANT_OMITTED)
{
cgeqreq.v_ber = TRUE;
cgeqreq.c_ber = 2;
cgeqreq.ber[0] = input_qos.qos_r99.ber.ratio_mant;
if (input_qos.qos_r99.ber.ratio_exp NEQ QOS_R99_RATIO_EXP_OMITTED)
cgeqreq.ber[1] = input_qos.qos_r99.ber.ratio_exp;
else
cgeqreq.ber[1] = 1;
}
else
{
cgeqreq.v_ber = FALSE;
cgeqreq.c_ber = 0;
}
cgeqreq.del_err_sdu = input_qos.qos_r99.del_err_sdu;
cgeqreq.xfer_delay = input_qos.qos_r99.xfer_delay;
cgeqreq.handling_pri = input_qos.qos_r99.handling_pri;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGEQREQ;
return(ATI_EXCT);
}
#else
ret = (T_ACI_RETURN)sAT_PlusCGEQREQ ((T_ACI_CMD_SRC)srcId, (U8)cid ,&input_qos);
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
// curAtCmd = AT_CMD_CGEQREQ;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : GACI_CMD |
| STATE : devellopment ROUTINE : setatPlusCGEQMIN |
+--------------------------------------------------------------------+
PURPOSE : +CGEQMIN command
Set 3G Quality of Service Profile (Minimum)
*/
GLOBAL T_ATI_RSLT setatPlusCGEQMIN( char *cl, UBYTE srcId )
{
T_ACI_RETURN ret;
T_PS_qos input_qos;
U8 cid;
#ifdef FF_ATI_BAT
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
#endif
TRACE_FUNCTION("setatPlusCGEQMIN ()");
cid = PDP_CONTEXT_CID_OMITTED;
input_qos.qos_r99.tc = QOS_R99_TC_OMITTED;
input_qos.qos_r99.order = QOS_R99_ORDER_OMITTED;
input_qos.qos_r99.del_err_sdu = QOS_R99_DEL_ERR_SDU_OMITTED;
input_qos.qos_r99.max_sdu = QOS_R99_MAX_SDU_OMITTED;
input_qos.qos_r99.max_rate_ul = QOS_R99_MAX_BR_UL_OMITTED;
input_qos.qos_r99.max_rate_dl = QOS_R99_MAX_BR_DL_OMITTED;
input_qos.qos_r99.xfer_delay = QOS_R99_XFER_DELAY_OMITTED;
input_qos.qos_r99.handling_pri = QOS_R99_HANDLING_PRIO_OMITTED;
input_qos.qos_r99.guar_br_ul = QOS_R99_GUAR_BR_UL_OMITTED;
input_qos.qos_r99.guar_br_dl = QOS_R99_GUAR_BR_DL_OMITTED;
input_qos.qos_r99.ber.ratio_mant = QOS_R99_RATIO_MANT_OMITTED; /* Residual bit error ratio */
input_qos.qos_r99.ber.ratio_exp = QOS_R99_RATIO_EXP_OMITTED;
input_qos.qos_r99.sdu_err_ratio.ratio_mant = QOS_R99_RATIO_MANT_OMITTED;
input_qos.qos_r99.sdu_err_ratio.ratio_exp = QOS_R99_RATIO_EXP_OMITTED;
cl = parse( cl,"ccrrrrcreecrc", &cid,
&input_qos.qos_r99.tc,
&input_qos.qos_r99.max_rate_ul,
&input_qos.qos_r99.max_rate_dl,
&input_qos.qos_r99.guar_br_ul,
&input_qos.qos_r99.guar_br_dl,
&input_qos.qos_r99.order,
&input_qos.qos_r99.max_sdu,
&input_qos.qos_r99.sdu_err_ratio,
&input_qos.qos_r99.ber, /* Residual bit error ratio */
&input_qos.qos_r99.del_err_sdu,
&input_qos.qos_r99.xfer_delay,
&input_qos.qos_r99.handling_pri );
if( !cl )
{
cmdCmeError(CME_ERR_OpNotAllow);
return (ATI_FAIL);
}
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgeqmin cgeqmin;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGEQMIN;
cmd.params.ptr_set_plus_cgeqmin = &cgeqmin;
cgeqmin.cid = (T_BAT_pdp_cid)cid;
cgeqmin.tc = input_qos.qos_r99.tc;
cgeqmin.max_rate_ul = input_qos.qos_r99.max_rate_ul;
cgeqmin.max_rate_dl = input_qos.qos_r99.max_rate_dl;
cgeqmin.guar_br_ul = input_qos.qos_r99.guar_br_ul;
cgeqmin.guar_br_dl = input_qos.qos_r99.guar_br_dl;
cgeqmin.order = input_qos.qos_r99.order;
cgeqmin.max_sdu = input_qos.qos_r99.max_sdu;
/* sdu_err_ratio */
if (input_qos.qos_r99.sdu_err_ratio.ratio_mant NEQ
QOS_R99_RATIO_MANT_OMITTED)
{
cgeqmin.v_sdu_err_ratio = TRUE;
cgeqmin.c_sdu_err_ratio = 2;
cgeqmin.sdu_err_ratio[0] = input_qos.qos_r99.sdu_err_ratio.ratio_mant;
if (input_qos.qos_r99.sdu_err_ratio.ratio_exp NEQ
QOS_R99_RATIO_EXP_OMITTED)
cgeqmin.sdu_err_ratio[1] = input_qos.qos_r99.sdu_err_ratio.ratio_exp;
else
cgeqmin.sdu_err_ratio[1] = 1;
}
else
{
cgeqmin.v_sdu_err_ratio = FALSE;
cgeqmin.c_sdu_err_ratio = 0;
}
/* ber */
if (input_qos.qos_r99.ber.ratio_mant NEQ QOS_R99_RATIO_MANT_OMITTED)
{
cgeqmin.v_ber = TRUE;
cgeqmin.c_ber = 2;
cgeqmin.ber[0] = input_qos.qos_r99.ber.ratio_mant;
if (input_qos.qos_r99.ber.ratio_exp NEQ QOS_R99_RATIO_EXP_OMITTED)
cgeqmin.ber[1] = input_qos.qos_r99.ber.ratio_exp;
else
cgeqmin.ber[1] = 1;
}
else
{
cgeqmin.v_ber = FALSE;
cgeqmin.c_ber = 0;
}
cgeqmin.del_err_sdu = input_qos.qos_r99.del_err_sdu;
cgeqmin.xfer_delay = input_qos.qos_r99.xfer_delay;
cgeqmin.handling_pri = input_qos.qos_r99.handling_pri;
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGEQMIN;
return(ATI_EXCT);
}
#else
ret = sAT_PlusCGEQMIN ((T_ACI_CMD_SRC)srcId, cid ,&input_qos);
switch (ret)
{
case (AT_CMPL): /*operation completed*/
return (ATI_CMPL);
case (AT_EXCT):
// curAtCmd = AT_CMD_CGEQMIN;
return (ATI_EXCT);
default:
cmdCmeError(CME_ERR_Unknown); /*Command failed*/
return (ATI_FAIL);
}
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : finished ROUTINE : setatPlusCGEQNEG |
+--------------------------------------------------------------------+
PURPOSE : Query of 3G QoS Profile (Negotiated)
*/
GLOBAL T_ATI_RSLT setatPlusCGEQNEG (char *cl, UBYTE srcId)
{
char *me="+CGEQNEG: ";
T_PS_qos pdef_qos;
int i;
BOOL qos_valid;
U8 cid_array[PDP_CONTEXT_CID_MAX+1], current_cid;
int no_of_cids;
char *end;
#ifdef FF_ATI_BAT
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
#endif
TRACE_FUNCTION("setatPlusCGEQNEG ()");
/* Parse all the cids into the cid array */
no_of_cids = 0;
--cl; /* Decreased due to no comma the first time! */
do
{
/* Remove the "," */
cl++;
/* Set the entry to omitted. */
cid_array[no_of_cids] = PDP_CONTEXT_CID_OMITTED;
/* Parse the value */
cid_array[no_of_cids] = ( U8 ) strtol (cl, &end, 10);
cl = end;
if( cid_array[no_of_cids] EQ 0 )
cid_array[no_of_cids] = PDP_CONTEXT_CID_OMITTED;
/* If a cid is omitted no cids must be specified at all. */
if( cid_array[no_of_cids] EQ PDP_CONTEXT_CID_OMITTED )
{
if( no_of_cids NEQ 0 )
{
/* Don't accept omitted cids inside if not the first. (AT+CGCMOD=1,2,,3 is not allowed). */
cmdCmeError(CME_ERR_OpNotSupp);
return (ATI_FAIL);
}
/* Break the while */
break;
}
if( (!cl) OR (cid_array[no_of_cids] < PDP_CONTEXT_CID_MIN) OR (cid_array[no_of_cids] > PDP_CONTEXT_CID_MAX) OR (no_of_cids >= PDP_CONTEXT_CID_MAX) )
{
cmdCmeError(CME_ERR_OpNotSupp);
return(ATI_FAIL);
}
no_of_cids++;
} while ( *cl EQ ',' );
cid_array[no_of_cids] = PDP_CONTEXT_CID_OMITTED;
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgeqneg cgeqneg;
UBYTE n;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGEQNEG;
cmd.params.ptr_set_plus_cgeqneg=&cgeqneg;
for (n=0;((n<no_of_cids) AND (n<BAT_MAX_PDP_CID));n++)
cgeqneg.cid[n]=(T_BAT_pdp_cid)cid_array[n];
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGEQNEG;
return(ATI_EXCT);
}
#else
/* Calculate number of cids: If the first cid is omitted it is treated as all cids. */
if (cid_array[0] EQ PDP_CONTEXT_CID_OMITTED)
no_of_cids = PDP_CONTEXT_CID_MAX;
for(i = 0; i<no_of_cids; i++)
{
/* If the first cid is omitted it is treated as all cids */
if (cid_array[0] EQ PDP_CONTEXT_CID_OMITTED)
current_cid = i+1;
else
current_cid = cid_array[i];
if (sAT_PlusCGEQNEG ((T_ACI_CMD_SRC)srcId, current_cid, &qos_valid, &pdef_qos) EQ AT_CMPL)
{
if (qos_valid)
{
/* Format the return string with the Release 99 QoS */
sprintf(g_sa,"%s%hd,%d,%d,%d,%d,%d,%d,%d,%dE%d,%dE%d,%d,%d,%d", me, current_cid,
pdef_qos.qos_r99.tc, /*< traffic class */
pdef_qos.qos_r99.max_rate_ul, /*< max bit-rate uplink */
pdef_qos.qos_r99.max_rate_dl, /*< max bit-rate downlink */
pdef_qos.qos_r99.guar_br_ul, /*< guaranteed bit-rate uplink */
pdef_qos.qos_r99.guar_br_dl, /*< guaranteed bit-rate downlink */
pdef_qos.qos_r99.order, /*< delivery order */
pdef_qos.qos_r99.max_sdu, /*< max SDU size */
pdef_qos.qos_r99.sdu_err_ratio.ratio_mant, /*< SDU error ratio (format is the same as ber) */
pdef_qos.qos_r99.sdu_err_ratio.ratio_exp, /*< */
pdef_qos.qos_r99.ber.ratio_mant, /*< Residual bit error ratio (ratio_mant E ratio_exp */
pdef_qos.qos_r99.ber.ratio_exp, /*< (Ex. 10E2) */
pdef_qos.qos_r99.del_err_sdu, /*< delivery of erroneous SDU */
pdef_qos.qos_r99.xfer_delay, /*< transfer delay */
pdef_qos.qos_r99.handling_pri); /*< traffic handling priority */
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
}
else
{
cmdCmeError(CME_ERR_Unknown); /* The command is invalid for srcId */
return (ATI_FAIL);
}
}
return (ATI_CMPL);
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : finished ROUTINE : setatPlusCGCMOD |
+--------------------------------------------------------------------+
PURPOSE : Modify indicated or all contexts.
*/
GLOBAL T_ATI_RSLT setatPlusCGCMOD (char *cl, UBYTE srcId)
{
U8 cid_array[PDP_CONTEXT_CID_MAX + 1];
int no_of_cids;
char *end;
T_ACI_RETURN ret;
#ifdef FF_ATI_BAT
T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
#endif
TRACE_FUNCTION("setatPlusCGCMOD ()");
--cl; /* No comma the first time!!! */
/* Parse all the cids into the cid array */
no_of_cids = 0;
do
{
/* Remove the "," */
cl++;
/* Set the entry to omitted. */
cid_array[no_of_cids] = PDP_CONTEXT_CID_OMITTED;
/* Parse the value */
cid_array[no_of_cids] = (U8) strtol (cl, &end, 10);
cl = end;
if( cid_array[no_of_cids] EQ 0 )
cid_array[no_of_cids] = PDP_CONTEXT_CID_OMITTED;
/* If a cid is omitted no cids must be specified at all. */
if( cid_array[no_of_cids] EQ PDP_CONTEXT_CID_OMITTED )
{
if (no_of_cids NEQ 0)
{
/* Don't accept omitted cids inside if not the first. (AT+CGCMOD=1,2,,3 is not allowed). */
cmdCmeError(CME_ERR_OpNotSupp);
return (ATI_FAIL);
}
/* Break the while */
break;
}
if ( (!cl) OR (cid_array[no_of_cids] < PDP_CONTEXT_CID_MIN) OR (cid_array[no_of_cids] > PDP_CONTEXT_CID_MAX) OR (no_of_cids >= PDP_CONTEXT_CID_MAX) )
{
cmdCmeError(CME_ERR_OpNotSupp);
return (ATI_FAIL);
}
no_of_cids++;
} while ( *cl EQ ',' );
cid_array[no_of_cids] = PDP_CONTEXT_CID_INVALID;
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_cmd_set_plus_cgcmod cgcmod;
UBYTE n;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGCMOD;
cmd.params.ptr_set_plus_cgcmod=&cgcmod;
for (n=0;((n<no_of_cids) AND (n<BAT_MAX_PDP_CID));n++)
cgcmod.cid[n]=(T_BAT_pdp_cid)cid_array[n];
bat_send(ati_bat_get_client(srcId), &cmd);
src_params->curAtCmd=AT_CMD_CGCMOD;
return(ATI_EXCT);
}
#else
ret = sAT_PlusCGCMOD ((T_ACI_CMD_SRC)srcId, cid_array);
switch ( ret )
{
case AT_EXCT:
cmdErrStr = NULL;
// curAtCmd = AT_CMD_CGCMOD;
return (ATI_EXCT);
case AT_CMPL:
/* The command can not return AT_CMPL!! This is an error! */
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
return (map_aci_2_ati_rslt(ret));
#endif /*FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : finished ROUTINE : queatPlusCGEQREQ |
+--------------------------------------------------------------------+
PURPOSE : Query of 3G QoS Profile (Requested)
*/
GLOBAL T_ATI_RSLT queatPlusCGEQREQ (char *cl, UBYTE srcId)
{
char *me="+CGEQREQ: ";
T_PS_qos pdef_qos;
U8 cid;
BOOL qos_valid = FALSE;
TRACE_FUNCTION("queatPlusCGEQREQ ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGEQREQ;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_set_plus_cgeqreq = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
for ( cid = PDP_CONTEXT_CID_MIN; cid <= PDP_CONTEXT_CID_MAX; cid++ )
{
if (qAT_PlusCGEQREQ ((T_ACI_CMD_SRC)srcId, cid, &qos_valid, &pdef_qos) EQ AT_CMPL)
{
if (qos_valid)
{
/* Format the return string with the Release 99 QoS */
sprintf(g_sa,"%s%hd,%d,%d,%d,%d,%d,%d,%d,\"%dE%d\",\"%dE%d\",%d,%d,%d", me, cid,
pdef_qos.qos_r99.tc, /*< traffic class */
pdef_qos.qos_r99.max_rate_ul, /*< max bit-rate uplink */
pdef_qos.qos_r99.max_rate_dl, /*< max bit-rate downlink */
pdef_qos.qos_r99.guar_br_ul, /*< guaranteed bit-rate uplink */
pdef_qos.qos_r99.guar_br_dl, /*< guaranteed bit-rate downlink */
pdef_qos.qos_r99.order, /*< delivery order */
pdef_qos.qos_r99.max_sdu, /*< max SDU size */
pdef_qos.qos_r99.sdu_err_ratio.ratio_mant, /*< SDU error ratio (format is the same as ber) */
pdef_qos.qos_r99.sdu_err_ratio.ratio_exp, /*< */
pdef_qos.qos_r99.ber.ratio_mant, /*< Residual bit error ratio (ratio_mant E ratio_exp */
pdef_qos.qos_r99.ber.ratio_exp, /*< (Ex. 10E2) */
pdef_qos.qos_r99.del_err_sdu, /*< delivery of erroneous SDU */
pdef_qos.qos_r99.xfer_delay, /*< transfer delay */
pdef_qos.qos_r99.handling_pri); /*< traffic handling priority */
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
}
else
{
/* AT_FAIL has been returned */
cmdCmeError(CME_ERR_Unknown); /* The command is invalid for srcId */
return (ATI_FAIL);
}
}
return (ATI_CMPL);
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : finished ROUTINE : queatPlusCGEQMIN |
+--------------------------------------------------------------------+
PURPOSE : Query of 3G QoS Profile (Minimum)
*/
GLOBAL T_ATI_RSLT queatPlusCGEQMIN (char *cl, UBYTE srcId)
{
char *me="+CGEQMIN: ";
T_PS_min_qos pdef_qos;
U8 cid;
BOOL qos_valid;
TRACE_FUNCTION("queatPlusCGEQMIN ()");
#ifdef FF_ATI_BAT
{
T_BAT_cmd_send cmd;
T_BAT_no_parameter dummy;
cmd.ctrl_params = BAT_CMD_SET_PLUS_CGEQMIN;
dummy.bat_dummy = 0xFF;
cmd.params.ptr_set_plus_cgeqmin = &dummy;
bat_send(ati_bat_get_client(srcId), &cmd);
return(ATI_EXCT);
}
#else
for ( cid = PDP_CONTEXT_CID_MIN; cid <= PDP_CONTEXT_CID_MAX; cid++ )
{
if (qAT_PlusCGEQMIN ((T_ACI_CMD_SRC)srcId, cid, &qos_valid, &pdef_qos) EQ AT_CMPL)
{
if (qos_valid)
{
/* Format the return string with the Release 99 QoS */
sprintf(g_sa,"%s%hd", me, cid);
/* Format the return string with the Release 99 QoS */
sprintf(g_sa,"%s%hd,%d,%d,%d,%d,%d,%d,%d,\"%dE%d\",\"%dE%d\",%d,%d,%d", me, cid,
pdef_qos.qos_r99.tc, /*< traffic class */
pdef_qos.qos_r99.max_rate_ul, /*< max bit-rate uplink */
pdef_qos.qos_r99.max_rate_dl, /*< max bit-rate downlink */
pdef_qos.qos_r99.guar_br_ul, /*< guaranteed bit-rate uplink */
pdef_qos.qos_r99.guar_br_dl, /*< guaranteed bit-rate downlink */
pdef_qos.qos_r99.order, /*< delivery order */
pdef_qos.qos_r99.max_sdu, /*< max SDU size */
pdef_qos.qos_r99.sdu_err_ratio.ratio_mant, /*< SDU error ratio (format is the same as ber) */
pdef_qos.qos_r99.sdu_err_ratio.ratio_exp, /*< */
pdef_qos.qos_r99.ber.ratio_mant, /*< Residual bit error ratio (ratio_mant E ratio_exp */
pdef_qos.qos_r99.ber.ratio_exp, /*< (Ex. 10E2) */
pdef_qos.qos_r99.del_err_sdu, /*< delivery of erroneous SDU */
pdef_qos.qos_r99.xfer_delay, /*< transfer delay */
pdef_qos.qos_r99.handling_pri); /*< traffic handling priority */
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
}
else
{
/* AT_FAIL has been returned */
cmdCmeError(CME_ERR_Unknown); /* The command is invalid for srcId */
return (ATI_FAIL);
}
}
return (ATI_CMPL);
#endif /* FF_ATI_BAT */
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : finished ROUTINE : tesatPlusCGEQNEG |
+--------------------------------------------------------------------+
PURPOSE : Test function for 3G QoS Profile (Negotiated)
Return cids for all active contexts.
*/
GLOBAL T_ATI_RSLT tesatPlusCGEQNEG (char *cl, UBYTE srcId)
{
char *me="+CGEQNEG: ";
BOOL context_activated, first_time = TRUE;
U8 cid;
TRACE_FUNCTION("tesatPlusCGEQNEG ()");
for (cid = 1; cid<=PDP_CONTEXT_CID_MAX; cid++)
{
if (tAT_PlusCGEQNEG_CGCMOD ((T_ACI_CMD_SRC)srcId, cid, &context_activated) EQ AT_CMPL)
{
if (context_activated)
{
if (first_time)
{
/* First time: Place command name and no comma in front of cid */
sprintf(g_sa,"%s%d", me, cid);
first_time = FALSE;
}
else
{
/* Subsequent time: Append sa with ",<cid>" */
sprintf(g_sa,"%s,%d", g_sa, cid);
}
}
}
else
{
/* AT_FAIL has been returned */
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
}
if (!first_time)
{
/* Only send something if any contexts were activated (first_time NEQ TRUE) */
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
return (ATI_CMPL);
}
/*
+--------------------------------------------------------------------+
| PROJECT : UMTS MODULE : ATI_GPRS |
| STATE : finished ROUTINE : tesatPlusCGCMOD |
+--------------------------------------------------------------------+
PURPOSE : Test function for 3G Context Modifify command.
Return cids for all active contexts.
*/
GLOBAL T_ATI_RSLT tesatPlusCGCMOD (char *cl, UBYTE srcId)
{
char *me="+CGCMOD: ";
BOOL context_activated, first_time = TRUE;
U8 cid;
TRACE_FUNCTION("tesatPlusCGCMOD ()");
for (cid = PDP_CONTEXT_CID_MIN; cid <= PDP_CONTEXT_CID_MAX; cid++)
{
if (tAT_PlusCGEQNEG_CGCMOD ((T_ACI_CMD_SRC)srcId, cid, &context_activated) EQ AT_CMPL)
{
if (context_activated)
{
if (first_time)
{
/* First time: Place command name and no comma in front of cid */
sprintf(g_sa,"%s%d", me, cid);
first_time = FALSE;
}
else
{
/* Subsequent time: Append sa with ",<cid>" */
sprintf(g_sa,"%s,%d", g_sa, cid);
}
}
}
else
{
/* AT_FAIL has been returned */
cmdCmeError(CME_ERR_Unknown);
return (ATI_FAIL);
}
}
if (!first_time)
{
/* Only send something if any contexts were activated (first_time NEQ TRUE) */
io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
}
return (ATI_CMPL);
}
#endif /* REL99 */
#endif /* GPRS */