FreeCalypso > hg > fc-magnetite
diff src/aci2/aci/ati_gprs.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Sep 2016 00:29:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/aci2/aci/ati_gprs.c Mon Sep 26 00:29:36 2016 +0000 @@ -0,0 +1,3009 @@ +/* ++----------------------------------------------------------------------------- +| 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" + +#ifdef FAX_AND_DATA +//#include "aci_fd.h" +#endif + +#include "cmh.h" +#include "cmh_sm.h" + +#include "aci_io.h" +#include "aci_mem.h" + +#if defined(FF_WAP) OR defined (FF_GPF_TCPIP) || defined (FF_SAT_E) +#include "gaci_srcc.h" +#include "psa_tcpip.h" +#include "wap_aci.h" +#endif /* defined(WAP) OR defined (FF_GPF_TCPIP) || defined (FF_SAT_E)*/ + +#include "gaci_cmd.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); +GLOBAL 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); +/* ++------------------------------------------------------------------------------------+ +| 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; + T_GPRS_CONT_REC inputCtxt = {MAGIC_EMPTY_APN, + "", + "", + CGDCONT_D_COMP_OMITTED, + CGDCONT_H_COMP_OMITTED, + {GPRS_QOS_OMITTED, GPRS_QOS_OMITTED, GPRS_QOS_OMITTED, GPRS_QOS_OMITTED, GPRS_QOS_OMITTED}, + {GPRS_QOS_OMITTED, GPRS_QOS_OMITTED, GPRS_QOS_OMITTED, GPRS_QOS_OMITTED, GPRS_QOS_OMITTED} }; + SHORT cid = GPRS_CID_OMITTED; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCGDCONT ()"); + + cl=parse(cl,"rsssrr",&cid + ,(LONG)MAX_PDP_TYPE_LEN, inputCtxt.pdp_type + ,(LONG)MAX_APN_LEN, inputCtxt.apn + ,(LONG)MAX_PDP_ADDR_LEN, inputCtxt.pdp_addr + ,&inputCtxt.d_comp + ,&inputCtxt.h_comp); + + if (!strcmp(inputCtxt.apn, MAGIC_EMPTY_APN)) + { + /* if APN was ommitted then parse leaves the string untouched */ + inputCtxt.apn[0]='\0'; /* so clear the apn */ + } + else if (inputCtxt.apn[0] EQ '\0') + { + /* if entered APN was "", parse clears the buffer */ + strcpy(inputCtxt.apn, MAGIC_EMPTY_APN); /* fill magic empty apn */ + } + + if ( !cl ) + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + +#ifdef FF_ATI_BAT + + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_plus_cgdcont cgdcont; + UBYTE len; + + cmd.ctrl_params = BAT_CMD_SET_PLUS_CGDCONT; + cmd.params.ptr_set_plus_cgdcont=&cgdcont; + + cgdcont.cid=(T_BAT_pdp_cid)cid; + + if (utl_strcasecmp((const char *)inputCtxt.pdp_type, (const char *)"ip")) + cgdcont.pdp_type=BAT_PDP_TYPE_NOT_PRESENT; + else + cgdcont.pdp_type=BAT_PDP_TYPE_IPV4; + + len=strlen(inputCtxt.apn); + + if (len<=BAT_MAX_APN_LEN) + { + cgdcont.v_apn=TRUE; + cgdcont.c_apn=(U8)len; + memcpy(cgdcont.apn,inputCtxt.apn,len); + } + else + { + cgdcont.v_apn=FALSE; + } + + len=strlen(inputCtxt.pdp_addr); + + if (len<=BAT_MAX_PDP_ADD) + { + cgdcont.v_pdp_addr=TRUE; + cgdcont.c_pdp_addr=(U8)len; + memcpy(cgdcont.pdp_addr,inputCtxt.pdp_addr,len); + } + else + { + cgdcont.v_pdp_addr=FALSE; + } + + cgdcont.d_comp=(T_BAT_plus_cgdcont_d_comp)inputCtxt.d_comp; + cgdcont.h_comp=(T_BAT_plus_cgdcont_h_comp)inputCtxt.h_comp; + + bat_send(ati_bat_get_client(srcId), &cmd); + + src_params->curAtCmd=AT_CMD_CGDCONT; + return(ATI_EXCT); + } + +#else + + ret = sAT_PlusCGDCONT (srcId, cid ,&inputCtxt); + 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 + char *me="+CGDCONT: "; + T_ACI_RETURN ret = AT_FAIL; + T_GPRS_CONT_REC defCtxts[MAX_CID_PLUS_EINS]; + SHORT cid_array[MAX_CID_PLUS_EINS]; + int i = 0, pos = 0, pos2 = 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 + + ret = qAT_PlusCGDCONT (srcId, &defCtxts, cid_array); + if (ret EQ AT_CMPL) + { + for ( i = 0; i < MAX_CID && cid_array[i] NEQ INVALID_CID; i++ ) + { + if (!strcmp(defCtxts[i].apn, MAGIC_EMPTY_APN)) /* special empty APN detected, printout "" */ + { + sprintf(g_sa,"%s%hd,\"%s\",\"\",\"%s\",%hd,%hd", + me, + cid_array[i], + defCtxts[i].pdp_type, +/* defCtxts[i].apn, */ + defCtxts[i].pdp_addr, + defCtxts[i].d_comp, + defCtxts[i].h_comp ); + } + + else if (defCtxts[i].apn[0] == '\0') + { /* no APN defined, printout nothing */ + sprintf(g_sa,"%s%hd,\"%s\",,\"%s\",%hd,%hd", + me, + cid_array[i], + defCtxts[i].pdp_type, +/* defCtxts[i].apn, */ + defCtxts[i].pdp_addr, + defCtxts[i].d_comp, + defCtxts[i].h_comp ); + } + else + { /* normal, printout the "apn" */ + sprintf(g_sa,"%s%hd,\"%s\",\"%s\",\"%s\",%hd,%hd", + me, + cid_array[i], + defCtxts[i].pdp_type, + defCtxts[i].apn, + defCtxts[i].pdp_addr, + defCtxts[i].d_comp, + defCtxts[i].h_comp ); + } + 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 tesatPlusCGDCONT (char *cl, UBYTE srcId) +{ + char *me="+CGDCONT: "; + + sprintf(g_sa,"%s(1-%d),\"IP\",,,(0),(0,1)", + me, MAX_CID ); + + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + return (ATI_CMPL); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GPRS (8441) MODULE : GACI_CMD | +| STATE : finnished ROUTINE : atPlusCGQREQ | ++--------------------------------------------------------------------+ + + PURPOSE : +CGQREQ command (context QOS request) +*/ + +GLOBAL T_ATI_RSLT setatPlusCGQREQ (char *cl, UBYTE srcId) +{ + T_ACI_RETURN ret = AT_FAIL; + T_QOS input_qos = { ( UBYTE ) GPRS_QOS_OMITTED }; + SHORT cid = GPRS_CID_OMITTED; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCGQREQ ()"); + + cl=parse(cl,"raaaar",&cid + ,1L ,&input_qos.preced + ,1L ,&input_qos.delay + ,1L ,&input_qos.relclass + ,1L ,&input_qos.peak + ,&input_qos.mean); + + if (cl EQ NULL) + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + + if ( input_qos.preced NEQ GPRS_QOS_OMITTED ) + input_qos.preced -= '0'; + if ( input_qos.delay NEQ GPRS_QOS_OMITTED ) + input_qos.delay -= '0'; + if ( input_qos.relclass NEQ GPRS_QOS_OMITTED ) + input_qos.relclass -= '0'; + if ( input_qos.peak NEQ GPRS_QOS_OMITTED ) + input_qos.peak -= '0'; + if ( input_qos.mean EQ 0xff ) + input_qos.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; +/* + if (input_qos.preced!=GPRS_QOS_OMITTED) + cgqreq.precedence=(T_BAT_precedence)input_qos.preced; + else + cgqreq.precedence=BAT_PRECEDENCE_NOT_PRESENT; + + if (input_qos.delay!=GPRS_QOS_OMITTED) + cgqreq.delay=(T_BAT_delay)input_qos.delay; + else + cgqreq.delay=BAT_DELAY_NOT_PRESENT; + + if (input_qos.relclass!=GPRS_QOS_OMITTED) + cgqreq.reliability=(T_BAT_reliability)input_qos.relclass; + else + cgqreq.reliability=BAT_RELIABILITY_NOT_PRESENT; + + if (input_qos.peak!=GPRS_QOS_OMITTED) + cgqreq.peak=(T_BAT_peak)input_qos.peak; + else + cgqreq.peak=BAT_PEAK_NOT_PRESENT; + + if (input_qos.mean) + cgqreq.mean=(T_BAT_mean)input_qos.mean; + else + cgqreq.mean=BAT_MEAN_NOT_PRESENT; +*/ + + cgqreq.precedence = (T_BAT_precedence)input_qos.preced; + cgqreq.delay = (T_BAT_delay)input_qos.delay; + cgqreq.reliability = (T_BAT_reliability)input_qos.relclass; + cgqreq.peak = (T_BAT_peak)input_qos.peak; + cgqreq.mean = (T_BAT_mean)input_qos.mean; + + bat_send(ati_bat_get_client(srcId), &cmd); + + src_params->curAtCmd=AT_CMD_CGQREQ; + return(ATI_EXCT); + } + +#else + + ret = sAT_PlusCGQREQ (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 +} + +GLOBAL T_ATI_RSLT queatPlusCGQREQ (char *cl, UBYTE srcId) +{ +#ifndef FF_ATI_BAT + char *me="+CGQREQ: "; + T_ACI_RETURN ret = AT_FAIL; + T_QOS *pdef_qos[MAX_CID_PLUS_EINS]; + SHORT cid_array[MAX_CID_PLUS_EINS]; + int i = 0; +#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 + + ret=qAT_PlusCGQREQ (srcId, pdef_qos, cid_array); + if (ret EQ AT_CMPL) + { + for ( i = 0; i < MAX_CID && pdef_qos[i]; i++ ) + { + sprintf(g_sa,"%s%hd,%d,%d,%d,%d,%d", me, cid_array[i], + pdef_qos[i]->preced, + pdef_qos[i]->delay, + pdef_qos[i]->relclass, + pdef_qos[i]->peak, + pdef_qos[i]->mean ); + + 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 : atPlusCGQMIN | ++--------------------------------------------------------------------+ + + PURPOSE : +CGQMIN command (context min QOS requirement) +*/ + +GLOBAL T_ATI_RSLT setatPlusCGQMIN (char *cl, UBYTE srcId) +{ + T_ACI_RETURN ret = AT_FAIL; + T_QOS input_qos = { ( UBYTE ) GPRS_QOS_OMITTED }; + SHORT cid = GPRS_CID_OMITTED; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCGQMIN ()"); + + cl=parse(cl,"raaaar",&cid + ,1L ,&input_qos.preced + ,1L ,&input_qos.delay + ,1L ,&input_qos.relclass + ,1L ,&input_qos.peak + ,&input_qos.mean); + + if ( input_qos.preced NEQ GPRS_QOS_OMITTED ) + input_qos.preced -= '0'; + if ( input_qos.delay NEQ GPRS_QOS_OMITTED ) + input_qos.delay -= '0'; + if ( input_qos.relclass NEQ GPRS_QOS_OMITTED ) + input_qos.relclass -= '0'; + if ( input_qos.peak NEQ GPRS_QOS_OMITTED ) + input_qos.peak -= '0'; + + if ( input_qos.mean EQ 0xff ) + input_qos.mean = 0; + + 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.preced; + cgqmin.delay = (T_BAT_delay)input_qos.delay; + cgqmin.reliability = (T_BAT_reliability)input_qos.relclass; + cgqmin.peak = (T_BAT_peak)input_qos.peak; + cgqmin.mean = (T_BAT_mean)input_qos.mean; + + bat_send(ati_bat_get_client(srcId), &cmd); + + src_params->curAtCmd=AT_CMD_CGQMIN; + return(ATI_EXCT); + } + +#else + + ret = sAT_PlusCGQMIN (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 +} + +GLOBAL T_ATI_RSLT queatPlusCGQMIN (char *cl, UBYTE srcId) +{ +#ifndef FF_ATI_BAT + char *me="+CGQMIN: "; + T_ACI_RETURN ret = AT_FAIL; + T_QOS *pdef_qos[MAX_CID_PLUS_EINS]; + SHORT cid_array[MAX_CID_PLUS_EINS]; + int i = 0; +#endif + + TRACE_FUNCTION("queatPlusCGQMIN ()"); + +#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 + + ret=qAT_PlusCGQMIN (srcId, pdef_qos, cid_array); + if (ret EQ AT_CMPL) + { + for ( i = 0; i < MAX_CID && pdef_qos[i]; i++ ) + { + sprintf(g_sa,"%s%hd,%d,%d,%d,%d,%d", me, cid_array[i], + pdef_qos[i]->preced, + pdef_qos[i]->delay, + pdef_qos[i]->relclass, + pdef_qos[i]->peak, + pdef_qos[i]->mean ); + + 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 : 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 ( 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 /*FF_ATI_BAT*/ +} + +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(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 /*FF_ATI_BAT*/ +} + + +/* ++--------------------------------------------------------------------+ +| 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) +{ + char *me="+CGCLASS: "; + 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 || m_class == 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 ( 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; + char test_class[3]=""; +#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(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; + SHORT count = 0; + SHORT cid, cid_array[MAX_CID_PLUS_EINS]; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCGACT ()"); + + end = cl; + + if ( *cl != ',' ) + state = (T_CGACT_STATE) strtol(cl, &end, 10); + + while ( *end EQ ',' ) + { + cl = end; /* advace to the next delimiter */ + cl ++; /* skip the delimiter */ + cid = INVALID_CID; + + cid = ( SHORT ) strtol (cl, &end, 10); + + if (cid < 1 || cid > MAX_CID || count >= MAX_CID) + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + cid_array[count] = cid; + count ++; + } + + cid_array[count] = INVALID_CID; + 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) && (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 ( 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; + SHORT count = 0; + SHORT cid_array[MAX_CID_PLUS_EINS]; + BOOL states[MAX_CID_PLUS_EINS]; +#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(srcId, states, cid_array); + if (ret EQ AT_CMPL) + { + for ( count = 0; count < MAX_CID && cid_array[count] NEQ INVALID_CID; 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; + SHORT count = 0, stop = 1; + SHORT cid_array[MAX_CID_PLUS_EINS] = { GPRS_CID_OMITTED }; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCGDATA ()"); + + switch ( *cl ) + { + case ',': + /* the L2P is unspecified */ + *L2P = 0; + break; + case '\"': + cl++; + while (*cl && stop) + { + if ( *cl NEQ '\"' && 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] = ( SHORT ) strtol (cl, &end, 10); + + if ( count >= MAX_CID ) + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + count ++; + } + + if ( count ) + cid_array[count] = INVALID_CID; + + cl = end; + +/* + * if no cid is given or if there is no matching context definition + * the function sAT_PlusCGDATA will process this + */ + +#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) && (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 + + /* establish communication between the TE and the network */ + ret = sAT_PlusCGDATA ( 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: ", *end; +#ifndef FF_ATI_BAT + T_ACI_RETURN ret; + T_PDP_ADDRESS pdp_addresses[MAX_CID]; +#endif + + SHORT count = 0; + SHORT cid_array[MAX_CID_PLUS_EINS]; + + TRACE_FUNCTION("setatPlusCGPADDR ()"); + + do + { + cid_array[count] = ( SHORT ) strtol (cl, &end, 10); + count ++; + cl = end; + if ( *cl EQ ',' ) + cl++; + } + while ( *end EQ ',' ); + + cid_array[count] = INVALID_CID; + cl = end; + +#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=0; + + if (count) + { + for (n=0;((n<count) && (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 ( srcId, cid_array, pdp_addresses ); + switch (ret) + { + case (AT_CMPL): /*operation completed*/ + count = 0; + if (cid_array[0] NEQ INVALID_CID) + { + while ( cid_array[count] NEQ INVALID_CID ) + { + if (*pdp_addresses[count]) + sprintf(g_sa,"%s%hd,\"%s\"", me, cid_array[count], pdp_addresses[count]); + else + sprintf(g_sa,"%s%hd", me, cid_array[count]); + + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + count ++; + } + } + return (ATI_CMPL); + default: + 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; + SHORT count = 0; + SHORT cid_array[MAX_CID_PLUS_EINS]; + 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 ( srcId, cid_array ); + switch (ret) + { + case (AT_CMPL): /*operation completed*/ + pos = sprintf(g_sa,"%s(", me); + while ( cid_array[count] NEQ INVALID_CID ) + { + if ( count NEQ 0 ) + { + g_sa[pos] = ','; pos++; + } + pos += sprintf(g_sa + pos,"%hd", cid_array[count]); + count ++; + } + 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 ( 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(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] = "", *end; + T_ACI_RETURN ret = AT_FAIL; + SHORT cid = GPRS_CID_OMITTED, response = -1, count = 0, stop = 1; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCGANS ()"); + + response = ( SHORT ) strtol (cl, &end, 10); + cl = end; + + if ( *cl EQ ',' ) + { + cl++; + switch ( *cl ) + { + case ',': + /* the L2P is unspecified */ + *L2P = 0; + break; + case '\"': + cl++; + while (*cl && stop) + { + if ( *cl NEQ '\"' && 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++; + cid = ( SHORT ) 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) && (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==TRUE) && (at.rngPrms.mode==CRING_MOD_Gprs)) + ati_stop_ring(); + + return(ATI_EXCT); + } + +#else + + /* return a list of PDP addresses for the specified context identifier */ + ret = sAT_PlusCGANS ( 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 : setatPlusCGEREP | ++--------------------------------------------------------------------+ + + 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 ( 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(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(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(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 + + ret = sAT_PlusCGSMS ( 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(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 ( 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) +{ + + SHORT count = 0, cid_array[2] = { GPRS_CID_OMITTED, INVALID_CID }, i = 0; + T_ACI_RETURN ret = AT_FAIL; + char L2P[MAX_L2P_LENGTH] = "PPP", save_char, *p_save_char, *end; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + int l2pID = -1; + + TRACE_FUNCTION ("atGD()"); + + 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 ++; + } + else + { + *gprs_command = FALSE; + return (ATI_FAIL); + } + break; + case '*': + break; + default: + *gprs_command = FALSE; + return (ATI_FAIL); + } + + /* check the service code */ + +#if defined(FF_WAP) OR defined(FF_GPF_TCPIP) || defined (FF_SAT_E) + if ( (*(cl + 1) NEQ '9') || + ( ( *(cl + 2) NEQ '9' ) && ( *(cl + 2) NEQ '8' ) ) ) + { + *gprs_command = FALSE; + return (ATI_FAIL); + } + + else if ( *(cl + 2) EQ '8' ) /* atd*98# -> WAP over GPRS */ + { + /* if call not yet marked as WAP call, mark it now */ + if (!Wap_Call) + { + TRACE_EVENT ("ati_gprs, atGD, cmd is atd*98#"); + sAT_PercentWAP(srcId, 1); + } + l2pID = GPRS_CID_OMITTED; +} + +#else /* defined(WAP) OR defined(FF_GPF_TCPIP) || defined (FF_SAT_E)*/ + if ( *(cl + 1) NEQ '9' || *(cl + 2) NEQ '9' ) + { + *gprs_command = FALSE; + return (ATI_FAIL); + } +#endif /*defined(WAP) OR defined(FF_GPF_TCPIP) || defined (FF_SAT_E)*/ + + cl += 3; + /* now *98 or *99 detected */ + /* the next character must be # or * for GPRS, otherwise this is USSD and not GPRS related! */ + + if (*cl NEQ '#' AND *cl NEQ '*') + { + *gprs_command = FALSE; + return (ATI_FAIL); + } + + *gprs_command = TRUE; + + /* parse the parameter list */ + while ( *cl EQ '*' ) + { + count ++; /* count the parameter of the command */ + cl ++; + p_save_char = strpbrk (cl, "*#" ); + if ( !p_save_char ) + { /* Bad user input*/ + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + +#if defined(FF_WAP) OR defined(FF_GPF_TCPIP) || defined (FF_SAT_E) + if( Wap_Call ) + { + l2pID = *cl - '0'; + cl++; + break; + } + else +#endif /* defined(WAP) OR defined(FF_GPF_TCPIP) || defined (FF_SAT_E)*/ + { + /* parse one parameter */ + switch ( count ) + { + case 1: /* called_address */ + cl = p_save_char; + break; + case 2: /* L2P */ + if ( *cl NEQ '*' ) + { + l2pID = (SHORT) strtol(cl, &end, 10); + + if(cl + 1 EQ end) + { /* L2P obmitted */ + l2pID = -1; + } + else if(-1 EQ l2pID) + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + cl = end; + } + break; + case 3: /* cid */ + save_char = *p_save_char; + *p_save_char = 0; + + cid_array[0] = (SHORT) strtol(cl, &end, 10); + + *p_save_char = save_char; + + cl = end; + break; + default: + /* Bad user input*/ + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + } + + } /* while */ + + /* check end of line charakter */ + if ( *cl NEQ '#') + { /* Bad user input*/ + cmdCmeError(CME_ERR_OpNotAllow); + return (ATI_FAIL); + } + +#if defined(FF_WAP) OR defined(FF_GPF_TCPIP) || defined (FF_SAT_E) + if ( Wap_Call ) + { + BYTE options; + SHORT j = 0; + 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 ); + + cid_array[0] = l2pID; + + 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 ); + } + + if ( cmhSM_define_cid_list( srcId, cid_array ) EQ 0) /* process cid list */ + { + TRACE_EVENT ("*** cmhSM_define_cid_list 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); + pdp_context[work_cids[cid_pointer] - 1].link_id_new = + dti_conn_compose_link_id (0,0, wap_dti_id, DTI_TUPLE_NO_NOTPRESENT ); + pdp_context[work_cids[cid_pointer] - 1].owner = srcId; + + TRACE_EVENT_P1 ("ati_gprs, atGD, link_id_new = %0X", pdp_context[work_cids[0] - 1].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 = smShrdPrm.owner; + smEntStat.curCmd = AT_CMD_CGDATA; + + 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 /* defined(WAP) OR defined(FF_GPF_TCPIP) || defined (FF_SAT_E) */ + /* + * patch for testing of network requested context activation + * and answer by dial-up-network (ATD -> ATA) + */ + if ( cmhSM_sAT_A( srcId, &ret ) EQ TRUE ) + { + switch (ret) + { + case (AT_CMPL): /*operation completed*/ + return (ATI_CMPL); + case (AT_EXCT): + if(src_params) + { + src_params->curAtCmd = AT_CMD_CGANS; + } + return (ATI_EXCT); + default: + cmdCmeError(CME_ERR_Unknown); /*Command failed*/ + return (ATI_FAIL); + } + } + else + { + /* process function */ + switch(l2pID) + { + case -1: /* L2P obmitted */ + case 1: /* PPP */ + break; + +#if defined(FF_PKTIO) OR defined(FF_TCP_IP) || defined(FF_GPF_TCPIP) OR defined (FF_PSI) + case 901: /* M-PKT */ + strcpy(L2P, "M-PKT"); + break; +#endif /* FF_PKTIO || FF_TCP_IP || FF_GPF_TCPIP OR FF_PSI */ + case 0: /* NULL - not supported at this moment -> use CGACT */ + default: + cmdCmeError(CME_ERR_Unknown); /*Command failed*/ + return (ATI_FAIL); + } + + ret = sAT_PlusCGDATA ( 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 + + ret = sAT_PercentCGAATT ( 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(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( 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( 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; + + 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( 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*/ +} + + +GLOBAL T_ATI_RSLT setatPercentCGPCO_HEX (USHORT cid, + UBYTE *pco_hex_string, USHORT len) +{ + USHORT pco_len; + UBYTE *pco_array; + int i; + + ACI_MALLOC (pco_array, ACI_PCO_MAX_LEN + 1); + + pco_len = utl_HexStrToBin (pco_hex_string, len, + pco_array, ACI_PCO_MAX_LEN + 1); + if (pco_len EQ 0) + { + cmdCmeError (CME_ERR_InvalidTxtChar); + ACI_MFREE (pco_array); + return (ATI_FAIL); + } + + if (cid EQ 0) + { + for (i = 0; i < MAX_CID; i++) + { + pdp_context[i].user_pco.len = (UBYTE)pco_len; + memcpy (pdp_context[i].user_pco.pco, pco_array, pco_len); + } + } + else + { + pdp_context[cid - 1].user_pco.len = (UBYTE)pco_len; + memcpy (pdp_context[cid - 1].user_pco.pco, pco_array, pco_len); + } + + ACI_MFREE (pco_array); + + return (ATI_CMPL); +} + +GLOBAL T_ATI_RSLT setatPercentCGPCO_ASCII (UBYTE srcId, USHORT cid, + UBYTE *pco_ascii_string, USHORT len) +{ + CHAR aut_prot[5]; + CHAR user[MAX_USER_LEN+1]; /* + '\0' */ + CHAR pwd[MAX_PWD_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 (ATI_FAIL); + } + if (strcmp (aut_prot, "PAP")) + { + cmdCmeError (CME_ERR_OpNotSupp); + return (ATI_FAIL); + } + + if (sAT_PercentCGPCO (srcId, cid, + ACI_PCO_AUTH_PROT_PAP, user, pwd, dns1, dns2) EQ AT_FAIL) + { + cmdCmeError (CME_ERR_Unknown); + return (ATI_FAIL); + } + + 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 +*/ + +GLOBAL 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) /* for all available cid's: recurse */ + { + for (i=1; i<MAX_CID; i++) + { + queatPercentCGPCO(srcId, i) ; + } + } + else /* for a specific cid */ + { + gateway = dns1 = dns2 = 0 ; /* Just in case... */ + qAT_PercentCGPCO(srcId,&gateway,&dns1,&dns2,cid); + if(dns1 OR dns2 OR gateway) + { + 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); + } + } + 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) +{ + USHORT cid = 0; + 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); + } + else if (cid > MAX_CID) + { + cmdCmeError (CME_ERR_OpNotSupp); + } + else + { + +#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==ATI_EXCT) + { + bat_send(ati_bat_get_client(srcId), &cmd); + } + +#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 = setatPercentCGPCO_HEX (cid, (UBYTE*)pco_string, (USHORT)strlen (pco_string)); + break; + case CGPCO_FORMAT_ASCII: + ret = setatPercentCGPCO_ASCII (srcId, cid, (UBYTE*)pco_string, (USHORT)strlen (pco_string)); + break; + default: + cmdCmeError (CME_ERR_OpNotSupp); + break; + } + break; + default: + cmdCmeError (CME_ERR_OpNotSupp); + 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 = ATI_FAIL; + + cl = parse(cl, "d", &protocol); + + if (!cl) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ret; + } + +#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(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(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 + char *me="+CGCLASS: "; + T_ACI_RETURN ret; +#endif + + T_PERCENT_CGCLASS m_class = PERCENT_CGCLASS_OMITTED; + char test_class[3]=""; + + 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 == 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 ( 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; + char test_class[3]=""; +#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(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*/ +} +#endif /* GPRS */ +