FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-aci/aci/aci_bat_gprs.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-aci/aci/aci_bat_gprs.c Sun Oct 12 01:45:14 2014 +0000 @@ -0,0 +1,2041 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-F&D (8411) +| Modul : ACI_BAT ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This BAT wrapper modul is ... +| ++----------------------------------------------------------------------------- +*/ + +#ifdef GPRS + +#include "aci_all.h" /* includes prim.h, which includes p_bat.h */ +#include "aci_cmh.h" /* prototypes of sAT_,qAT_,tAT_ */ +#include "aci_bat_cmh.h" /* prototypes of sBAT_,qBAT_,tBAT_ */ +#include "ati_cmd.h" +#include "aci_cmd.h" +#include "gaci_cmh.h" +#include "aci_bat.h" +#include "aci_mem.h" +#include "gaci.h" + +/*==== VARIABLES ==================================================*/ +EXTERN T_PDP_CONTEXT_INTERNAL *p_pdp_context_list; + +extern BOOL cmhSM_isContextActive( void ); +extern T_ATI_RSLT setatPercentCGPCO_HEX (UBYTE srcId,USHORT cid, + UBYTE *pco_hex_string, USHORT len); +extern T_ATI_RSLT setatPercentCGPCO_ASCII (UBYTE srcId, USHORT cid, + UBYTE *pco_ascii_string, USHORT len); +extern void ipaddr_to_string(ULONG ipaddr, char *ipaddr_string); + + +#define MAGIC_EMPTY_APN "\x0ff" +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGDCONT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGDCONT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_pdp_cid cid = BAT_PDP_CID_NOT_PRESENT ; + T_PDP_CONTEXT inputCtxt; /*lint !e813*/ + + TRACE_FUNCTION ("sBAT_PlusCGDCONT()"); + + memset(&inputCtxt,0,sizeof(T_PDP_CONTEXT)); + + cid = cmd->params.ptr_set_plus_cgdcont->cid; + inputCtxt.pdp_addr.ctrl_ip_address = NAS_is_ip_not_present; + inputCtxt.pdp_addr.ip_address.ip_not_present = BAT_PARAMETER_NOT_PRESENT; + + if (cid EQ BAT_PDP_CID_NOT_PRESENT ) + { + cid = (T_BAT_pdp_cid)PDP_CONTEXT_CID_OMITTED ; + } + + switch (cmd->params.ptr_set_plus_cgdcont->pdp_type) + { + case BAT_PDP_TYPE_IPV4: + strcpy(inputCtxt.pdp_type, "IP"); + if(cmd->params.ptr_set_plus_cgdcont->v_pdp_addr) + { + inputCtxt.pdp_addr.ctrl_ip_address = NAS_is_ipv4; + memcpy(inputCtxt.pdp_addr.ip_address.ipv4_addr.a4,cmd->params.ptr_set_plus_cgdcont->pdp_addr,cmd->params.ptr_set_plus_cgdcont->c_pdp_addr); + } + break; + case BAT_PDP_TYPE_IPV6: + strcpy(inputCtxt.pdp_type, "IPV6"); + if(cmd->params.ptr_set_plus_cgdcont->v_pdp_addr) + { + inputCtxt.pdp_addr.ctrl_ip_address = NAS_is_ipv6; + memcpy(inputCtxt.pdp_addr.ip_address.ipv6_addr.a6,cmd->params.ptr_set_plus_cgdcont->pdp_addr,cmd->params.ptr_set_plus_cgdcont->c_pdp_addr); + } + break; + default: + { + break; + } + //return ret; + } + if(cmd->params.ptr_set_plus_cgdcont->v_apn) + { + memcpy(inputCtxt.pdp_apn,cmd->params.ptr_set_plus_cgdcont->apn,cmd->params.ptr_set_plus_cgdcont->c_apn); + } + inputCtxt.d_comp = cmd->params.ptr_set_plus_cgdcont->d_comp; + inputCtxt.h_comp = cmd->params.ptr_set_plus_cgdcont->h_comp; + + ret = (T_ACI_BAT_RSLT) sAT_PlusCGDCONT ((T_ACI_CMD_SRC)src_infos_psi->srcId, (U8)cid ,&inputCtxt); + return(ret); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGDCONT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGDCONT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgdcont que_cgdcont_buffer; /*lint !e813*/ + T_PDP_CONTEXT defCtxts[PDP_CONTEXT_CID_MAX]; /*lint !e813*/ + SHORT cid_array[PDP_CONTEXT_CID_MAX]; + U8 i ; + + TRACE_FUNCTION ("qBAT_PlusCGDCONT()"); + resp.ctrl_response = BAT_RES_QUE_PLUS_CGDCONT; + resp.response.ptr_que_plus_cgdcont = &que_cgdcont_buffer; + + ret = (T_ACI_BAT_RSLT)qAT_PlusCGDCONT ((T_ACI_CMD_SRC)src_infos_psi->srcId, defCtxts, cid_array); + + if (ret EQ ACI_BAT_CMPL) + { + for ( i = 0; i < PDP_CONTEXT_CID_MAX AND cid_array[i] NEQ PDP_CONTEXT_CID_OMITTED; i++ ) + { + que_cgdcont_buffer.cid = (T_BAT_pdp_cid)cid_array[i]; + if(!(utl_strcasecmp((const char *)defCtxts[i].pdp_type, (const char *)"ip"))) + { + que_cgdcont_buffer.pdp_type = BAT_PDP_TYPE_IPV4; + memcpy(que_cgdcont_buffer.pdp_addr,defCtxts[i].pdp_addr.ip_address.ipv4_addr.a4,NAS_SIZE_IPv4_ADDR); + que_cgdcont_buffer.c_pdp_addr = NAS_SIZE_IPv4_ADDR; + } + + else if(!(utl_strcasecmp((const char *)defCtxts[i].pdp_type, (const char *)"ipv6"))) + { + que_cgdcont_buffer.pdp_type = BAT_PDP_TYPE_IPV6; + memcpy(que_cgdcont_buffer.pdp_addr,defCtxts[i].pdp_addr.ip_address.ipv6_addr.a6,NAS_SIZE_IPv6_ADDR); + que_cgdcont_buffer.c_pdp_addr = NAS_SIZE_IPv6_ADDR; + } + else + { + que_cgdcont_buffer.pdp_type = BAT_PDP_TYPE_NOT_PRESENT; + } + + que_cgdcont_buffer.c_apn = strlen(defCtxts[i].pdp_apn); + memcpy(que_cgdcont_buffer.apn,defCtxts[i].pdp_apn,strlen(defCtxts[i].pdp_apn)); + que_cgdcont_buffer.d_comp = (T_BAT_plus_cgdcont_d_comp)defCtxts[i].d_comp; + que_cgdcont_buffer.h_comp = (T_BAT_plus_cgdcont_h_comp)defCtxts[i].h_comp; + aci_bat_send(src_infos_psi,&resp); + } + return ACI_BAT_CMPL; + } + return(ret); +} + + +#ifdef REL99 +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGCMOD | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGCMOD (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + SHORT count = 0; + U8 cid_array[PDP_CONTEXT_CID_MAX]; + + TRACE_FUNCTION ("sBAT_PlusCGCMOD()"); + + if(cmd->params.ptr_set_plus_cgact->c_cid EQ 0) + cid_array[0] = PDP_CONTEXT_CID_INVALID; + for(count=0;count<cmd->params.ptr_set_plus_cgact->c_cid;count++) + { + cid_array[count] = (cmd->params.ptr_set_plus_cgact->cid[count] EQ BAT_PDP_CID_NOT_PRESENT) + ? PDP_CONTEXT_CID_INVALID : cmd->params.ptr_set_plus_cgact->cid[count]; + } + if(count > 0) + cid_array[count]= PDP_CONTEXT_CID_INVALID; + ret = (T_ACI_BAT_RSLT) sAT_PlusCGCMOD ((T_ACI_CMD_SRC) src_infos_psi->srcId, cid_array ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGDSCONT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGDSCONT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_pdp_cid cid = BAT_PDP_CID_NOT_PRESENT; + T_PDP_CONTEXT inputCtxt; /*lint !e813*/ + + TRACE_FUNCTION ("sBAT_PlusCGDSCONT()"); + + memset(&inputCtxt,0,sizeof(T_PDP_CONTEXT)); + + cid = cmd->params.ptr_set_plus_cgdscont->cid; + inputCtxt.p_cid = cmd->params.ptr_set_plus_cgdscont->p_cid; + + if (cid EQ BAT_PDP_CID_NOT_PRESENT ) + { + cid = (T_BAT_pdp_cid)PDP_CONTEXT_CID_OMITTED; + } + + if (cmd->params.ptr_set_plus_cgdscont->p_cid EQ (U8)BAT_PDP_CID_NOT_PRESENT ) +// if (inputCtxt.p_cid EQ (U8)BAT_PDP_CID_NOT_PRESENT ) + { + inputCtxt.p_cid = PDP_CONTEXT_CID_OMITTED; + } + + inputCtxt.d_comp = cmd->params.ptr_set_plus_cgdscont->d_comp; + inputCtxt.h_comp = cmd->params.ptr_set_plus_cgdscont->h_comp; + + ret =(T_ACI_BAT_RSLT) sAT_PlusCGDSCONT ((T_ACI_CMD_SRC)src_infos_psi->srcId, (U8)cid ,&inputCtxt); + if(ret EQ ACI_BAT_CMPL) + { + return ACI_BAT_CMPL; + } + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGDSCONT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGDSCONT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_cmd_response resp; + T_PDP_CONTEXT pdp_context_array[PDP_CONTEXT_CID_MAX]; + U8 pdp_context_cid_array[PDP_CONTEXT_CID_MAX]; + int i; + + TRACE_FUNCTION("qBAT_PlusCGDSCONT()"); + resp.ctrl_response = BAT_RES_QUE_PLUS_CGDSCONT; + + memset( pdp_context_cid_array, 0, sizeof(pdp_context_cid_array) ); + memset( pdp_context_array, 0, sizeof(pdp_context_array) ); + + ret = (T_ACI_BAT_RSLT) qAT_PlusCGDSCONT((T_ACI_CMD_SRC)src_infos_psi->srcId, pdp_context_array, pdp_context_cid_array); + + if (ret EQ ACI_BAT_CMPL) + { + for ( i = 0; i < PDP_CONTEXT_CID_MAX AND pdp_context_cid_array[i] NEQ PDP_CONTEXT_CID_OMITTED; i++ ) + { + resp.response.ptr_que_plus_cgdscont->cid = (T_BAT_pdp_cid)pdp_context_cid_array[i]; + resp.response.ptr_que_plus_cgdscont->p_cid = (U8)pdp_context_array[i].p_cid; + resp.response.ptr_que_plus_cgdscont->d_comp = (T_BAT_plus_cgdcont_d_comp)pdp_context_array[i].d_comp; + resp.response.ptr_que_plus_cgdscont->h_comp = (T_BAT_plus_cgdcont_h_comp)pdp_context_array[i].h_comp; + + aci_bat_send(src_infos_psi,&resp); + } + return ACI_BAT_CMPL; + } + return ret; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGTFT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGTFT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_NAS_tft_pf tft_pf_input; + T_BAT_cmd_set_plus_cgtft *cgtft_prm; + + TRACE_FUNCTION ("sBAT_PlusCGTFT()"); + + memset( &tft_pf_input, 0x00, sizeof(T_NAS_tft_pf) ); + cgtft_prm = cmd->params.ptr_set_plus_cgtft; + + /* cid */ + if (cgtft_prm->cid EQ BAT_PDP_CID_NOT_PRESENT) + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ACI_BAT_FAIL); + } + + /* pf id, precedence */ + if ((cgtft_prm->tft_pf_id >= BAT_MIN_TFT_PF_ID) AND + (cgtft_prm->tft_pf_id <= BAT_MAX_TFT_PF_ID)) + { + tft_pf_input.tft_pf_id = (U8)cgtft_prm->tft_pf_id; + /* precedence has to be present in case of valid pf id */ + if ( cgtft_prm->tft_pf_precedence >= BAT_MAX_TFT_PRECEDENCE ) + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ACI_BAT_FAIL); + } + tft_pf_input.tft_pf_precedence = (U8)cgtft_prm->tft_pf_precedence; + } + else + { + tft_pf_input.tft_pf_id = (U8)-1; + tft_pf_input.tft_pf_precedence = (U8)-1;// valid val (more suspicious than 0) + } + + /* addr_n_mask */ + if( cgtft_prm->v_addr_n_mask AND cgtft_prm->c_addr_n_mask ) + { + /* IP4 addr_n_mask */ + if( cgtft_prm->c_addr_n_mask EQ 8) + { + tft_pf_input.ctrl_tft_pf_entry = NAS_is_tft_pf_ipv4; + memcpy(tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_addr, + cgtft_prm->addr_n_mask, + NAS_SIZE_IPv4_ADDR); + memcpy(tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_mask, + cgtft_prm->addr_n_mask+NAS_SIZE_IPv4_ADDR, + NAS_SIZE_IPv4_ADDR); + + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPv4_SRC_ADDR_MASK; + } + + /* IP6 addr_n_mask */ + else if( cgtft_prm->c_addr_n_mask EQ 32) + { + tft_pf_input.ctrl_tft_pf_entry = NAS_is_tft_pf_ipv6; + memcpy(tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr, + cgtft_prm->addr_n_mask, + NAS_SIZE_IPv6_ADDR); + memcpy(tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_mask, + cgtft_prm->addr_n_mask+NAS_SIZE_IPv6_ADDR, + NAS_SIZE_IPv6_ADDR); + + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPv6_SRC_ADDR_MASK; + } + else + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ACI_BAT_FAIL); + } + } + else + { + /* The following does not make sense according 27.007: + if addr_n_mask isn't present, flow label isn't present either, + but +CGTFT behaviour should not change */ + if ( cgtft_prm->flow_label > BAT_MAX_TFT_FLOW_LABEL ) + { + /* 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; + } + } + + switch( tft_pf_input.ctrl_tft_pf_entry ) + { + /*** IP v4 prmeters */ + case NAS_is_tft_pf_ipv4: + { + /* Protocol number */ + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_protocol = + (U8)cgtft_prm->prt_num_or_nxt_hd; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR; + + + /* Destination port */ + if( cgtft_prm->v_dest_port_range AND cgtft_prm->c_dest_port_range) + { + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.low_limit = + cgtft_prm->dest_port_range[0]; + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.high_limit = + cgtft_prm->dest_port_range[1]; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_DEST_PORT_RANGE; + } + + /* Source port */ + if( cgtft_prm->v_src_port_range AND cgtft_prm->c_src_port_range) + { + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.low_limit = + cgtft_prm->src_port_range[0]; + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.high_limit = + cgtft_prm->src_port_range[1]; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_SRC_PORT_RANGE; + } + + /* IPSEC security parameter spi */ + /* valid val=[0..ffffffff] -> no way to find out if parameter was + omitted, but can't change BAT interface for PlusCGTFT -> open issue */ + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_ipsec_spi = cgtft_prm->ipsec_spi; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPSEC_SPI; + + /* Type of service and mask */ + if( cgtft_prm->v_tos_mask_or_tc_mask AND cgtft_prm->c_tos_mask_or_tc_mask ) + { + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_value = + cgtft_prm->tos_mask_or_tc_mask[0]; + tft_pf_input.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_mask = + cgtft_prm->tos_mask_or_tc_mask[1]; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_TOS_AND_MASK; + } + + break; + + } /* END: case NAS_is_tft_pf_ipv4 */ + + /*** IP v6 parameters ***/ + case NAS_is_tft_pf_ipv6: + { + /* Next header */ + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_next_hdr = + (U8)cgtft_prm->prt_num_or_nxt_hd; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR; + + /* Destination port */ + if( cgtft_prm->v_dest_port_range AND cgtft_prm->c_dest_port_range) + { + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.low_limit = + cgtft_prm->dest_port_range[0]; + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.high_limit = + cgtft_prm->dest_port_range[1]; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_DEST_PORT_RANGE; + } + + /* Source port */ + if( cgtft_prm->v_src_port_range AND cgtft_prm->c_src_port_range) + { + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.low_limit = + cgtft_prm->src_port_range[0]; + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.high_limit = + cgtft_prm->src_port_range[1]; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_SRC_PORT_RANGE; + } + + /* IPSEC security parameter spi */ + /* valid val=[0..ffffffff] -> no way to find out if parameter was + omitted, but can't change BAT interface for PlusCGTFT -> open issue */ + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_ipsec_spi = cgtft_prm->ipsec_spi; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_IPSEC_SPI; + + /* Type of service and mask */ + if( cgtft_prm->v_tos_mask_or_tc_mask AND cgtft_prm->c_tos_mask_or_tc_mask ) + { + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_value = + cgtft_prm->tos_mask_or_tc_mask[0]; + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_mask = + cgtft_prm->tos_mask_or_tc_mask[1]; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_TOS_AND_MASK; + } + + /* Flow label */ + if (cgtft_prm->flow_label <= BAT_MAX_TFT_FLOW_LABEL) + { + tft_pf_input.tft_pf_entry.tft_pf_ipv6.tft_flow_label = cgtft_prm->flow_label; + tft_pf_input.tft_pf_valid_bits |= NAS_TFT_ID_FLOW_LABEL; + } + + break; + } /* END: case NAS_is_tft_pf_ipv6 */ + + default: + { + cmdCmeError(CME_ERR_OpNotAllow); + return (ACI_BAT_FAIL); + } + } /* END: switch( tft_pf_input.ctrl_tft_pf_entry ) */ + + ret = (T_ACI_BAT_RSLT) sAT_PlusCGTFT ((T_ACI_CMD_SRC)src_infos_psi->srcId, (U8)cgtft_prm->cid, &tft_pf_input); + + switch( ret ) + { + case (ACI_BAT_CMPL): /* Operation completed */ + case (ACI_BAT_EXCT): /* Operation in progress */ + return ret; + default: + cmdCmeError(CME_ERR_Unknown); /* Command failed */ + return (ACI_BAT_FAIL); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGTFT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGTFT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + T_TFT_INTERNAL *p_tft_pf_node = NULL; + U8 pdp_context_cid_array[PDP_CONTEXT_CID_MAX]; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgtft que_cgtft_buffer; + int i; + + TRACE_FUNCTION("qBAT_PlusCGTFT()"); + resp.ctrl_response = BAT_RES_QUE_PLUS_CGTFT; + resp.response.ptr_que_plus_cgtft = &que_cgtft_buffer; + + memset( &pdp_context_cid_array, PDP_CONTEXT_CID_OMITTED, sizeof(pdp_context_cid_array) ); + ret = (T_ACI_BAT_RSLT) qAT_PlusCGTFT((T_ACI_CMD_SRC)src_infos_psi->srcId, (U8*) &pdp_context_cid_array[0]); + + if (ret EQ ACI_BAT_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 ) + { + memset(&que_cgtft_buffer, 0,sizeof(T_BAT_res_que_plus_cgtft)); + que_cgtft_buffer.cid = (T_BAT_pdp_cid)pdp_context_cid_array[i]; + que_cgtft_buffer.tft_pf_id = p_tft_pf_node->pf_attributes.tft_pf_id; + que_cgtft_buffer.tft_pf_precedence = p_tft_pf_node->pf_attributes.tft_pf_precedence; + + switch( p_tft_pf_node->pf_attributes.ctrl_tft_pf_entry ) + { + case NAS_is_tft_pf_ipv4: + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPv4_SRC_ADDR_MASK ) + { + que_cgtft_buffer.v_addr_n_mask = TRUE; + que_cgtft_buffer.c_addr_n_mask = 8; + memcpy(que_cgtft_buffer.addr_n_mask, p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipv4_src_addr_mask.tft_ipv4_addr,que_cgtft_buffer.c_addr_n_mask); + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR ) + { + que_cgtft_buffer.prt_num_or_nxt_hd = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_protocol; + } + else + { + que_cgtft_buffer.prt_num_or_nxt_hd = (U8)TFT_PROT_OR_NXT_HDR_INVALID; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_DEST_PORT_RANGE ) + { + que_cgtft_buffer.c_dest_port_range = 2; + que_cgtft_buffer.dest_port_range[0] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.low_limit; + que_cgtft_buffer.dest_port_range[1] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_dest_port_range.high_limit; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_SRC_PORT_RANGE ) + { + que_cgtft_buffer.c_src_port_range = 2; + que_cgtft_buffer.src_port_range[0] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.low_limit; + que_cgtft_buffer.src_port_range[1] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_src_port_range.high_limit; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPSEC_SPI ) + { + que_cgtft_buffer.ipsec_spi = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_ipsec_spi; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_TOS_AND_MASK ) + { + que_cgtft_buffer.c_tos_mask_or_tc_mask = 2; + que_cgtft_buffer.tos_mask_or_tc_mask[0] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_value; + que_cgtft_buffer.tos_mask_or_tc_mask[1] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv4.tft_tos_and_mask.tos_mask; + } + que_cgtft_buffer.flow_label = (U8)TFT_FLOW_LABEL_INVALID; + break; + + case NAS_is_tft_pf_ipv6: + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPv6_SRC_ADDR_MASK ) + { + que_cgtft_buffer.v_addr_n_mask = TRUE; + que_cgtft_buffer.c_addr_n_mask = 32; + memcpy(que_cgtft_buffer.addr_n_mask, p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipv6_src_addr_mask.tft_ipv6_addr,que_cgtft_buffer.c_addr_n_mask); + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_PROTOCOL_OR_NEXT_HDR ) + { + que_cgtft_buffer.prt_num_or_nxt_hd = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_next_hdr; + } + else + { + que_cgtft_buffer.prt_num_or_nxt_hd = (U8)TFT_PROT_OR_NXT_HDR_INVALID; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_DEST_PORT_RANGE ) + { + que_cgtft_buffer.c_dest_port_range = 2; + que_cgtft_buffer.dest_port_range[0] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.low_limit; + que_cgtft_buffer.dest_port_range[1] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_dest_port_range.high_limit; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_SRC_PORT_RANGE ) + { + que_cgtft_buffer.c_src_port_range = 2; + que_cgtft_buffer.src_port_range[0] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.low_limit; + que_cgtft_buffer.src_port_range[1] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_src_port_range.high_limit; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_IPSEC_SPI ) + { + que_cgtft_buffer.ipsec_spi = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_ipsec_spi; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_TOS_AND_MASK ) + { + que_cgtft_buffer.c_tos_mask_or_tc_mask = 2; + que_cgtft_buffer.tos_mask_or_tc_mask[0] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_value; + que_cgtft_buffer.tos_mask_or_tc_mask[1] = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_tos_and_mask.tos_mask; + } + if( p_tft_pf_node->pf_attributes.tft_pf_valid_bits & NAS_TFT_ID_FLOW_LABEL ) + { + que_cgtft_buffer.flow_label = p_tft_pf_node->pf_attributes.tft_pf_entry.tft_pf_ipv6.tft_flow_label; + } + else + { + que_cgtft_buffer.flow_label = (U8)TFT_FLOW_LABEL_INVALID; + } + break; + } + aci_bat_send(src_infos_psi,&resp); + + p_tft_pf_node = p_tft_pf_node->p_next; + } + } + } + else + { + return (ret); + } + return ACI_BAT_CMPL; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGEQREQ | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGEQREQ (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_PS_qos input_qos; + U8 cid = PDP_CONTEXT_CID_OMITTED; + + TRACE_FUNCTION ("sBAT_PlusCGEQREQ()"); + + 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; + + if (cmd->params.ptr_set_plus_cgeqreq->cid NEQ BAT_PDP_CID_NOT_PRESENT) + cid = cmd->params.ptr_set_plus_cgeqreq->cid; + if (cmd->params.ptr_set_plus_cgeqreq->tc NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.tc = cmd->params.ptr_set_plus_cgeqreq->tc; + if (cmd->params.ptr_set_plus_cgeqreq->order NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.order = cmd->params.ptr_set_plus_cgeqreq->order; + if (cmd->params.ptr_set_plus_cgeqreq->del_err_sdu NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.del_err_sdu = cmd->params.ptr_set_plus_cgeqreq->del_err_sdu; + if (cmd->params.ptr_set_plus_cgeqreq->max_sdu NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.max_sdu = (U16)cmd->params.ptr_set_plus_cgeqreq->max_sdu; + if (cmd->params.ptr_set_plus_cgeqreq->max_rate_ul NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.max_rate_ul = (U16)cmd->params.ptr_set_plus_cgeqreq->max_rate_ul; + if (cmd->params.ptr_set_plus_cgeqreq->max_rate_dl NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.max_rate_dl = (U16)cmd->params.ptr_set_plus_cgeqreq->max_rate_dl; + if (cmd->params.ptr_set_plus_cgeqreq->xfer_delay NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.xfer_delay = (U16)cmd->params.ptr_set_plus_cgeqreq->xfer_delay; + if (cmd->params.ptr_set_plus_cgeqreq->handling_pri NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.handling_pri = (U8)cmd->params.ptr_set_plus_cgeqreq->handling_pri; + if (cmd->params.ptr_set_plus_cgeqreq->guar_br_ul NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.guar_br_ul = (U16)cmd->params.ptr_set_plus_cgeqreq->guar_br_ul; + if (cmd->params.ptr_set_plus_cgeqreq->guar_br_dl NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.guar_br_dl = (U16)cmd->params.ptr_set_plus_cgeqreq->guar_br_dl; + if (cmd->params.ptr_set_plus_cgeqreq->c_ber NEQ 0) + { + input_qos.qos_r99.ber.ratio_mant = cmd->params.ptr_set_plus_cgeqreq->ber[0]; + input_qos.qos_r99.ber.ratio_exp = cmd->params.ptr_set_plus_cgeqreq->ber[1]; + } + if (cmd->params.ptr_set_plus_cgeqreq->c_sdu_err_ratio NEQ 0) + { + input_qos.qos_r99.sdu_err_ratio.ratio_mant = cmd->params.ptr_set_plus_cgeqreq->sdu_err_ratio[0]; + input_qos.qos_r99.sdu_err_ratio.ratio_exp = cmd->params.ptr_set_plus_cgeqreq->sdu_err_ratio[1]; + } + + + ret = (T_ACI_BAT_RSLT)sAT_PlusCGEQREQ ((T_ACI_CMD_SRC)src_infos_psi->srcId, (U8)cid, &input_qos); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGEQREQ | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGEQREQ (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgeqreq que_cgeqreq_buffer; + T_PS_qos pdef_qos; + U8 cid; + BOOL qos_valid = FALSE; + + TRACE_FUNCTION ("qBAT_PlusCGEQREQ()"); + + resp.ctrl_response = BAT_RES_QUE_PLUS_CGEQREQ; + resp.response.ptr_que_plus_cgeqreq = &que_cgeqreq_buffer; + + for ( cid = PDP_CONTEXT_CID_MIN; cid <= PDP_CONTEXT_CID_MAX; cid++ ) + { + ret = (T_ACI_BAT_RSLT) qAT_PlusCGEQREQ ((T_ACI_CMD_SRC)src_infos_psi->srcId, cid, &qos_valid, &pdef_qos); + if (ret EQ ACI_BAT_CMPL AND qos_valid) + { + que_cgeqreq_buffer.cid = (T_BAT_pdp_cid)cid; + que_cgeqreq_buffer.tc = pdef_qos.qos_r99.tc; + que_cgeqreq_buffer.order = pdef_qos.qos_r99.order; + que_cgeqreq_buffer.del_err_sdu = pdef_qos.qos_r99.del_err_sdu; + que_cgeqreq_buffer.max_sdu = pdef_qos.qos_r99.max_sdu; + que_cgeqreq_buffer.max_rate_ul = pdef_qos.qos_r99.max_rate_ul; + que_cgeqreq_buffer.max_rate_dl = pdef_qos.qos_r99.max_rate_dl; + que_cgeqreq_buffer.xfer_delay = pdef_qos.qos_r99.xfer_delay; + que_cgeqreq_buffer.handling_pri = pdef_qos.qos_r99.handling_pri; + que_cgeqreq_buffer.guar_br_ul = pdef_qos.qos_r99.guar_br_ul; + que_cgeqreq_buffer.guar_br_dl = pdef_qos.qos_r99.guar_br_dl; + que_cgeqreq_buffer.ber[0] = pdef_qos.qos_r99.ber.ratio_mant; + que_cgeqreq_buffer.ber[1] = pdef_qos.qos_r99.ber.ratio_exp; + que_cgeqreq_buffer.sdu_err_ratio[0] = pdef_qos.qos_r99.sdu_err_ratio.ratio_mant; + que_cgeqreq_buffer.sdu_err_ratio[1] = pdef_qos.qos_r99.sdu_err_ratio.ratio_exp; + aci_bat_send(src_infos_psi,&resp); + } + else + return ret; + } + return ACI_BAT_CMPL; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGEQNEG | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGEQNEG (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_res_que_plus_cgeqneg que_cgeqneg_buffer; + T_BAT_cmd_response resp; + T_PS_qos pdef_qos; + BOOL qos_valid; + U8 *cid_array; + U8 current_cid; + int no_of_cids, i; + + TRACE_FUNCTION ("sBAT_PlusCGEQNEG()"); + + resp.ctrl_response = BAT_RES_QUE_PLUS_CGEQNEG; + resp.response.ptr_que_plus_cgeqneg = &que_cgeqneg_buffer; + + no_of_cids = cmd->params.ptr_set_plus_cgeqneg->c_cid; + cid_array = (U8*)cmd->params.ptr_set_plus_cgeqneg->cid; + + /* 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]; + + ret = (T_ACI_BAT_RSLT) sAT_PlusCGEQNEG ((T_ACI_CMD_SRC) src_infos_psi->srcId, current_cid, &qos_valid, &pdef_qos); + + if (ret EQ ACI_BAT_CMPL) + { + if (qos_valid) + { + que_cgeqneg_buffer.cid = (T_BAT_pdp_cid)cid_array[i]; + que_cgeqneg_buffer.tc = (U8)pdef_qos.qos_r99.tc; + que_cgeqneg_buffer.order = pdef_qos.qos_r99.order; + que_cgeqneg_buffer.del_err_sdu = pdef_qos.qos_r99.del_err_sdu; + que_cgeqneg_buffer.max_sdu = pdef_qos.qos_r99.max_sdu; + que_cgeqneg_buffer.max_rate_ul = pdef_qos.qos_r99.max_rate_ul; + que_cgeqneg_buffer.max_rate_dl = pdef_qos.qos_r99.max_rate_dl; + que_cgeqneg_buffer.xfer_delay = pdef_qos.qos_r99.xfer_delay; + que_cgeqneg_buffer.handling_pri = pdef_qos.qos_r99.handling_pri; + que_cgeqneg_buffer.guar_br_ul = pdef_qos.qos_r99.guar_br_ul; + que_cgeqneg_buffer.guar_br_dl = pdef_qos.qos_r99.guar_br_dl; + que_cgeqneg_buffer.ber[0] = pdef_qos.qos_r99.ber.ratio_mant; + que_cgeqneg_buffer.ber[1] = pdef_qos.qos_r99.ber.ratio_exp; + que_cgeqneg_buffer.sdu_err_ratio[0] = pdef_qos.qos_r99.sdu_err_ratio.ratio_mant; + que_cgeqneg_buffer.sdu_err_ratio[1] = pdef_qos.qos_r99.sdu_err_ratio.ratio_exp; + + aci_bat_send(src_infos_psi,&resp); + } + } + else + return ret; + } + return ACI_BAT_CMPL; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGEQMIN | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGEQMIN (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_PS_qos input_qos; + U8 cid; + + TRACE_FUNCTION ("sBAT_PlusCGEQMIN()"); + + memset(&input_qos, 0, sizeof(T_PS_qos)); + 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; + + if (cmd->params.ptr_set_plus_cgeqreq->cid NEQ BAT_PDP_CID_NOT_PRESENT) + cid = cmd->params.ptr_set_plus_cgeqmin->cid; + + if (cmd->params.ptr_set_plus_cgeqreq->tc NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.tc = cmd->params.ptr_set_plus_cgeqmin->tc; + + if (cmd->params.ptr_set_plus_cgeqreq->order NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.order = cmd->params.ptr_set_plus_cgeqmin->order; + + if (cmd->params.ptr_set_plus_cgeqreq->del_err_sdu NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.del_err_sdu = cmd->params.ptr_set_plus_cgeqmin->del_err_sdu; + + if (cmd->params.ptr_set_plus_cgeqreq->max_sdu NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.max_sdu = (U16)cmd->params.ptr_set_plus_cgeqmin->max_sdu; + + if (cmd->params.ptr_set_plus_cgeqreq->max_rate_ul NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.max_rate_ul = (U16)cmd->params.ptr_set_plus_cgeqmin->max_rate_ul; + + if (cmd->params.ptr_set_plus_cgeqreq->max_rate_dl NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.max_rate_dl = (U16)cmd->params.ptr_set_plus_cgeqmin->max_rate_dl; + + if (cmd->params.ptr_set_plus_cgeqreq->xfer_delay NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.xfer_delay = (U16)cmd->params.ptr_set_plus_cgeqmin->xfer_delay; + + if (cmd->params.ptr_set_plus_cgeqreq->handling_pri NEQ NOT_PRESENT_8BIT) + input_qos.qos_r99.handling_pri = (U8)cmd->params.ptr_set_plus_cgeqmin->handling_pri; + + if (cmd->params.ptr_set_plus_cgeqreq->guar_br_ul NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.guar_br_ul = (U16)cmd->params.ptr_set_plus_cgeqmin->guar_br_ul; + + if (cmd->params.ptr_set_plus_cgeqreq->guar_br_dl NEQ NOT_PRESENT_16BIT) + input_qos.qos_r99.guar_br_dl = (U16)cmd->params.ptr_set_plus_cgeqmin->guar_br_dl; + + if (cmd->params.ptr_set_plus_cgeqreq->c_ber NEQ 0) + { + input_qos.qos_r99.ber.ratio_mant = cmd->params.ptr_set_plus_cgeqmin->ber[0]; + input_qos.qos_r99.ber.ratio_exp = cmd->params.ptr_set_plus_cgeqmin->ber[1]; + } + if (cmd->params.ptr_set_plus_cgeqreq->c_sdu_err_ratio NEQ 0) + { + input_qos.qos_r99.sdu_err_ratio.ratio_mant = cmd->params.ptr_set_plus_cgeqmin->sdu_err_ratio[0]; + input_qos.qos_r99.sdu_err_ratio.ratio_exp = cmd->params.ptr_set_plus_cgeqmin->sdu_err_ratio[1]; + } + + ret = (T_ACI_BAT_RSLT)sAT_PlusCGEQMIN ((T_ACI_CMD_SRC)src_infos_psi->srcId, cid ,&input_qos); + + return ret; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGEQMIN | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGEQMIN (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgeqmin que_cgeqmin_buffer; + T_PS_min_qos pdef_qos; + U8 cid; + BOOL qos_valid; + + TRACE_FUNCTION ("qBAT_PlusCGEQMIN()"); + + resp.ctrl_response = BAT_RES_QUE_PLUS_CGEQMIN; + resp.response.ptr_que_plus_cgeqmin = &que_cgeqmin_buffer; + + for ( cid = PDP_CONTEXT_CID_MIN; cid <= PDP_CONTEXT_CID_MAX; cid++ ) + { + ret = (T_ACI_BAT_RSLT) qAT_PlusCGEQMIN ((T_ACI_CMD_SRC) src_infos_psi->srcId, cid, &qos_valid, &pdef_qos); + if ( ret EQ ACI_BAT_CMPL) + { + if (qos_valid) + { + que_cgeqmin_buffer.cid = (T_BAT_pdp_cid)cid; + que_cgeqmin_buffer.tc = (U8)pdef_qos.qos_r99.tc; + que_cgeqmin_buffer.order = pdef_qos.qos_r99.order; + que_cgeqmin_buffer.del_err_sdu = pdef_qos.qos_r99.del_err_sdu; + que_cgeqmin_buffer.max_sdu = pdef_qos.qos_r99.max_sdu; + que_cgeqmin_buffer.max_rate_ul = pdef_qos.qos_r99.max_rate_ul; + que_cgeqmin_buffer.max_rate_dl = pdef_qos.qos_r99.max_rate_dl; + que_cgeqmin_buffer.xfer_delay = pdef_qos.qos_r99.xfer_delay; + que_cgeqmin_buffer.handling_pri = pdef_qos.qos_r99.handling_pri; + que_cgeqmin_buffer.guar_br_ul = pdef_qos.qos_r99.guar_br_ul; + que_cgeqmin_buffer.guar_br_dl = pdef_qos.qos_r99.guar_br_dl; + que_cgeqmin_buffer.ber[0] = pdef_qos.qos_r99.ber.ratio_mant; + que_cgeqmin_buffer.ber[1] = pdef_qos.qos_r99.ber.ratio_exp; + que_cgeqmin_buffer.sdu_err_ratio[0] = pdef_qos.qos_r99.sdu_err_ratio.ratio_mant; + que_cgeqmin_buffer.sdu_err_ratio[1] = pdef_qos.qos_r99.sdu_err_ratio.ratio_exp; + + aci_bat_send(src_infos_psi,&resp); + } + } + else + return ret; + } + return ACI_BAT_CMPL; +} + +#endif /* REL99 */ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGQREQ | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGQREQ (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_PS_qos input_qos; + T_BAT_pdp_cid cid = BAT_PDP_CID_NOT_PRESENT ; + + TRACE_FUNCTION ("sBAT_PlusCGQREQ()"); + + cid = cmd->params.ptr_set_plus_cgqreq->cid; + if (cid EQ BAT_PDP_CID_NOT_PRESENT ) + { + cid = (T_BAT_pdp_cid)GPRS_CID_OMITTED ; + } + input_qos.qos_r97.preced = (U8)cmd->params.ptr_set_plus_cgqreq->precedence; + input_qos.qos_r97.delay = (U8)cmd->params.ptr_set_plus_cgqreq->delay; + input_qos.qos_r97.relclass = (U8)cmd->params.ptr_set_plus_cgqreq->reliability; + input_qos.qos_r97.peak = (U8)cmd->params.ptr_set_plus_cgqreq->peak; + input_qos.qos_r97.mean = (U8)cmd->params.ptr_set_plus_cgqreq->mean; + + if (input_qos.qos_r97.preced EQ (U8)BAT_PRECEDENCE_NOT_PRESENT) + { + input_qos.qos_r97.preced = PDP_CONTEXT_QOS_OMITTED ; + } + if (input_qos.qos_r97.delay EQ (U8)BAT_DELAY_NOT_PRESENT) + { + input_qos.qos_r97.delay = PDP_CONTEXT_QOS_OMITTED ; + } + if (input_qos.qos_r97.relclass EQ (U8)BAT_RELIABILITY_NOT_PRESENT) + { + input_qos.qos_r97.relclass = PDP_CONTEXT_QOS_OMITTED ; + } + if (input_qos.qos_r97.peak EQ (U8)BAT_PEAK_NOT_PRESENT) + { + input_qos.qos_r97.peak= PDP_CONTEXT_QOS_OMITTED ; + } + if (input_qos.qos_r97.mean EQ (U8)BAT_MEAN_NOT_PRESENT) + { + input_qos.qos_r97.mean = PDP_CONTEXT_QOS_OMITTED ; + } + ret = (T_ACI_BAT_RSLT) sAT_PlusCGQREQ ((T_ACI_CMD_SRC)src_infos_psi->srcId, (U8)cid ,&input_qos); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGQREQ | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGQREQ (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_PS_qos pdef_qos; + BOOL qos_valid = FALSE; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgqreq que_cgqreq_buffer; + + TRACE_FUNCTION ("qBAT_PlusCGQREQ()"); + + resp.ctrl_response = BAT_RES_QUE_PLUS_CGQREQ; + resp.response.ptr_que_plus_cgqreq = &que_cgqreq_buffer; + + p_pdp_context_node = p_pdp_context_list; + + while( p_pdp_context_node ) + { + if (qAT_PlusCGQREQ ( (T_ACI_CMD_SRC)src_infos_psi->srcId, p_pdp_context_node->cid, &qos_valid, &pdef_qos ) EQ AT_CMPL) + { + if( qos_valid ) + { + resp.response.ptr_que_plus_cgqreq->cid = (T_BAT_pdp_cid)p_pdp_context_node->cid; + resp.response.ptr_que_plus_cgqreq->precedence = (T_BAT_precedence)pdef_qos.qos_r97.preced; + resp.response.ptr_que_plus_cgqreq->delay = (T_BAT_delay)pdef_qos.qos_r97.delay; + resp.response.ptr_que_plus_cgqreq->reliability= (T_BAT_reliability)pdef_qos.qos_r97.relclass; + resp.response.ptr_que_plus_cgqreq->peak = (T_BAT_peak)pdef_qos.qos_r97.peak; + resp.response.ptr_que_plus_cgqreq->mean = (T_BAT_mean)pdef_qos.qos_r97.mean ; + + aci_bat_send(src_infos_psi,&resp); + } + } + else + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return (ACI_BAT_FAIL); + } + p_pdp_context_node = p_pdp_context_node->p_next; + } + return ACI_BAT_CMPL; +} +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGQMIN | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGQMIN (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_PS_min_qos input_qos; + T_BAT_pdp_cid cid = BAT_PDP_CID_NOT_PRESENT ; + + TRACE_FUNCTION ("sBAT_PlusCGQMIN()"); + cid = cmd->params.ptr_set_plus_cgqmin->cid; + if (cid EQ BAT_PDP_CID_NOT_PRESENT ) + { + cid = (T_BAT_pdp_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; + + input_qos.qos_r97.preced = cmd->params.ptr_set_plus_cgqmin->precedence; + input_qos.qos_r97.delay = cmd->params.ptr_set_plus_cgqmin->delay; + input_qos.qos_r97.relclass = cmd->params.ptr_set_plus_cgqmin->reliability; + input_qos.qos_r97.peak = cmd->params.ptr_set_plus_cgqmin->peak; + input_qos.qos_r97.mean = cmd->params.ptr_set_plus_cgqmin->mean; + + ret = (T_ACI_BAT_RSLT) sAT_PlusCGQMIN ((T_ACI_CMD_SRC)src_infos_psi->srcId, (U8)cid ,&input_qos); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGQMIN | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGQMIN (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgqmin que_cgqmin_buffer; + T_PS_qos pdef_qos; + BOOL qos_valid = FALSE; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + + TRACE_FUNCTION ("qBAT_PlusCGQMIN()"); + + resp.ctrl_response = BAT_RES_QUE_PLUS_CGQMIN; + resp.response.ptr_que_plus_cgqmin = &que_cgqmin_buffer; + p_pdp_context_node = p_pdp_context_list; + + while( p_pdp_context_node ) + { + if( qAT_PlusCGQMIN((T_ACI_CMD_SRC) src_infos_psi->srcId, p_pdp_context_node->cid, &qos_valid, &pdef_qos ) EQ AT_CMPL ) + { + if (qos_valid) + { + resp.response.ptr_que_plus_cgqmin->cid = (T_BAT_pdp_cid)p_pdp_context_node->cid; + resp.response.ptr_que_plus_cgqmin->precedence = (T_BAT_precedence)pdef_qos.qos_r97.preced; + resp.response.ptr_que_plus_cgqmin->delay = (T_BAT_delay)pdef_qos.qos_r97.delay; + resp.response.ptr_que_plus_cgqmin->reliability= (T_BAT_reliability)pdef_qos.qos_r97.relclass; + resp.response.ptr_que_plus_cgqmin->peak = (T_BAT_peak)pdef_qos.qos_r97.peak; + resp.response.ptr_que_plus_cgqmin->mean = (T_BAT_mean)pdef_qos.qos_r97.mean; + aci_bat_send(src_infos_psi,&resp); + } + } + else + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return (ACI_BAT_FAIL); + } + p_pdp_context_node = p_pdp_context_node->p_next; + } + return ACI_BAT_CMPL; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGATT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGATT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_CGATT_STATE state = CGATT_STATE_OMITTED; + + TRACE_FUNCTION ("sBAT_PlusCGATT()"); + + state = (T_CGATT_STATE)cmd->params.ptr_set_plus_cgatt->state; + ret = (T_ACI_BAT_RSLT)sAT_PlusCGATT ( (T_ACI_CMD_SRC)src_infos_psi->srcId, state ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGATT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGATT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgatt que_cgatt_buffer; + T_CGATT_STATE state = CGATT_STATE_OMITTED; + + TRACE_FUNCTION ("qBAT_PlusCGATT()"); + resp.ctrl_response = BAT_RES_QUE_PLUS_CGATT; + resp.response.ptr_que_plus_cgatt = &que_cgatt_buffer; + + ret = (T_ACI_BAT_RSLT)qAT_PlusCGATT((T_ACI_CMD_SRC)src_infos_psi->srcId, &state); + if (ret EQ ACI_BAT_CMPL) + { + resp.response.ptr_que_plus_cgatt->state = (T_BAT_plus_cgatt_state)state; + aci_bat_send(src_infos_psi,&resp); + return ACI_BAT_CMPL; + } + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return (ACI_BAT_FAIL); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGCLASS | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGCLASS (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_CGCLASS_CLASS m_class = CGCLASS_CLASS_OMITTED; + + TRACE_FUNCTION ("sBAT_PlusCGCLASS()"); + + m_class = (T_CGCLASS_CLASS)cmd->params.ptr_set_plus_cgclass->mobile_class; + + if (m_class EQ CGCLASS_CLASS_OMITTED) + { + ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_OpNotAllow); + return (ACI_BAT_FAIL); + } + ret =(T_ACI_BAT_RSLT) sAT_PlusCGCLASS ((T_ACI_CMD_SRC)src_infos_psi->srcId, m_class ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGCLASS | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGCLASS (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret; + T_CGCLASS_CLASS m_class; + + TRACE_FUNCTION ("qBAT_PlusCGCLASS()"); + + ret=(T_ACI_BAT_RSLT)qAT_PlusCGCLASS((T_ACI_CMD_SRC)src_infos_psi->srcId,&m_class); + + /* + * If the query completes, send the response now. + */ + if (ret EQ ACI_BAT_CMPL) + { + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgclass cgclass_data; + + resp.ctrl_response=BAT_RES_QUE_PLUS_CGCLASS; + resp.response.ptr_que_plus_cgclass=&cgclass_data; + + /* + * This relies on T_BAT_mobile_class and T_CGCLASS_CLASS + * being identical. + */ + resp.response.ptr_que_plus_cgclass->mobile_class=(T_BAT_mobile_class)m_class; + + aci_bat_send(src_infos_psi,&resp); + return ACI_BAT_CMPL; + } + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return (ACI_BAT_FAIL); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGACT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGACT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_CGACT_STATE state = CGACT_STATE_OMITTED; + SHORT count = 0; + SHORT cid_array[PDP_CONTEXT_CID_MAX]; + + TRACE_FUNCTION ("sBAT_PlusCGACT()"); + + state =(T_CGACT_STATE) cmd->params.ptr_set_plus_cgact->state; + if(cmd->params.ptr_set_plus_cgact->c_cid EQ 0) + cid_array[0] = PDP_CONTEXT_CID_INVALID; + for(count=0;count<cmd->params.ptr_set_plus_cgact->c_cid;count++) + { + cid_array[count] = (cmd->params.ptr_set_plus_cgact->cid[count] EQ BAT_PDP_CID_NOT_PRESENT) + ? PDP_CONTEXT_CID_INVALID : cmd->params.ptr_set_plus_cgact->cid[count]; + } + if(count > 0) + cid_array[count]= PDP_CONTEXT_CID_INVALID; + ret =(T_ACI_BAT_RSLT) sAT_PlusCGACT ((T_ACI_CMD_SRC)src_infos_psi->srcId, state, cid_array ); + return(ret); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGACT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGACT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + SHORT cid_array[PDP_CONTEXT_CID_MAX]; + SHORT count = 0; + BOOL states[PDP_CONTEXT_CID_MAX]; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgact que_cgact_buffer; + + TRACE_FUNCTION ("qBAT_PlusCGACT()"); + resp.ctrl_response = BAT_RES_QUE_PLUS_CGACT; + resp.response.ptr_que_plus_cgact = &que_cgact_buffer; + + ret=(T_ACI_BAT_RSLT)qAT_PlusCGACT((T_ACI_CMD_SRC)src_infos_psi->srcId, states, cid_array); + if(ret EQ ACI_BAT_CMPL) + { + for ( count = 0; count < PDP_CONTEXT_CID_MAX AND cid_array[count] NEQ PDP_CONTEXT_CID_INVALID; count++ ) + { + resp.response.ptr_que_plus_cgact->state = (T_BAT_plus_cgact_state)states[count]; + resp.response.ptr_que_plus_cgact->cid = (T_BAT_pdp_cid)cid_array[count]; + aci_bat_send(src_infos_psi,&resp); + } + return(ret); + } + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return (ACI_BAT_FAIL); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGDATA | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGDATA (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + char L2P[MAX_L2P_LENGTH] = ""; + U8 cid_array[PDP_CONTEXT_CID_MAX] = { GPRS_CID_OMITTED }; + + TRACE_FUNCTION ("sBAT_PlusCGDATA()"); + + if(cmd->params.ptr_set_plus_cgdata->v_l2p) + { + memcpy(L2P,cmd->params.ptr_set_plus_cgdata->l2p,cmd->params.ptr_set_plus_cgdata->c_l2p); + } + else + { + L2P[0] = 0; + } + + if(cmd->params.ptr_set_plus_cgdata->v_cid) + { + memcpy(cid_array,cmd->params.ptr_set_plus_cgdata->cid,2*cmd->params.ptr_set_plus_cgdata->c_cid); + cid_array[cmd->params.ptr_set_plus_cgdata->c_cid] = PDP_CONTEXT_CID_INVALID; + } + ret =(T_ACI_BAT_RSLT) sAT_PlusCGDATA ((T_ACI_CMD_SRC)src_infos_psi->srcId, L2P, cid_array ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGPADDR | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGPADDR (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_NAS_ip *pdp_addresses; + SHORT count = 0; + SHORT cid_array[PDP_CONTEXT_CID_MAX + 1]; + T_BAT_cmd_set_plus_cgpaddr *cgpaddr; + + TRACE_FUNCTION ("sBAT_PlusCGPADDR()"); + + ACI_MALLOC (pdp_addresses, sizeof (T_NAS_ip) * PDP_CONTEXT_CID_MAX); + + /* + * Get a pointer to the CGPADDR data for convenience. + */ + cgpaddr=cmd->params.ptr_set_plus_cgpaddr; + + if (cgpaddr->c_cid) + { + for (count=0; ((count<PDP_CONTEXT_CID_MAX) AND (count<cgpaddr->c_cid)); count++) + cid_array[count]=(U8)cgpaddr->cid[count]; + + cid_array[count] = PDP_CONTEXT_CID_INVALID; + } + else + { + cid_array[0] = PDP_CONTEXT_CID_OMITTED; + } + + ret = (T_ACI_BAT_RSLT)sAT_PlusCGPADDR((T_ACI_CMD_SRC)src_infos_psi->srcId, cid_array, pdp_addresses ); + + if (ret EQ ACI_BAT_CMPL) + { + T_BAT_cmd_response resp; + T_BAT_res_set_plus_cgpaddr cgpaddr_data; + UBYTE len = 0; + + resp.ctrl_response=BAT_RES_SET_PLUS_CGPADDR; + resp.response.ptr_set_plus_cgpaddr=&cgpaddr_data; + + for (count=0;count<PDP_CONTEXT_CID_MAX;count++) + { + if (cid_array[count] EQ PDP_CONTEXT_CID_INVALID) + break; + + cgpaddr_data.cid=(T_BAT_pdp_cid)cid_array[count]; + + switch( pdp_addresses[count].ctrl_ip_address ) + { + case NAS_is_ip_not_present: + len = 0; + break; + + case NAS_is_ipv4: + len = 4; + memcpy(cgpaddr_data.pdp_addr, pdp_addresses[count].ip_address.ipv4_addr.a4,len); + break; + + case NAS_is_ipv6: + len = 16; + memcpy(cgpaddr_data.pdp_addr, pdp_addresses[count].ip_address.ipv6_addr.a6,len); + break; + } + + cgpaddr_data.c_pdp_addr=(U8)len; + aci_bat_send(src_infos_psi,&resp); + } + } + + ACI_MFREE(pdp_addresses); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGANS | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGANS (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + char L2P[MAX_L2P_LENGTH] = "" ; + SHORT cid = GPRS_CID_OMITTED, response = -1 ; + + TRACE_FUNCTION ("sBAT_PlusCGANS()"); + + response = cmd->params.ptr_set_plus_cgans->response; + if(cmd->params.ptr_set_plus_cgans->v_l2p) + { + memcpy(L2P,cmd->params.ptr_set_plus_cgans->l2p,cmd->params.ptr_set_plus_cgans->c_l2p); + } + else + { + L2P[0] = 0; + } + + cid = cmd->params.ptr_set_plus_cgans->cid; + if (cid EQ BAT_PDP_CID_NOT_PRESENT ) + { + cid = GPRS_CID_OMITTED ; + } + ret =(T_ACI_BAT_RSLT)sAT_PlusCGANS ((T_ACI_CMD_SRC) src_infos_psi->srcId, response, L2P, cid ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGREG | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGREG (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_CGREG_STAT stat; + USHORT lac, cid; + + TRACE_FUNCTION ("qBAT_PlusCGREG()"); + + ret=(T_ACI_BAT_RSLT)qAT_PlusCGREG((T_ACI_CMD_SRC)src_infos_psi->srcId, &stat, &lac, &cid); + + if (ret==ACI_BAT_CMPL) + { + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgreg que_cgreg_buffer; + + resp.ctrl_response = BAT_RES_QUE_PLUS_CGREG; + resp.response.ptr_que_plus_cgreg = &que_cgreg_buffer; + + resp.response.ptr_que_plus_cgreg->stat = (T_BAT_plus_cgreg_stat)stat; + resp.response.ptr_que_plus_cgreg->lac = lac; + resp.response.ptr_que_plus_cgreg->ci = cid; + aci_bat_send(src_infos_psi,&resp); + } + + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PercentCGREG | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PercentCGREG (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_P_CGREG_STAT stat; + USHORT lac, cid; + + TRACE_FUNCTION ("qBAT_PercentCGREG()"); + ret=(T_ACI_BAT_RSLT)qAT_PercentCGREG((T_ACI_CMD_SRC)src_infos_psi->srcId, &stat, &lac, &cid); + + if (ret EQ ACI_BAT_CMPL) + { + T_BAT_cmd_response resp; + T_BAT_res_que_percent_cgreg que_cgreg_buffer; + + resp.ctrl_response = BAT_RES_QUE_PERCENT_CGREG; + resp.response.ptr_que_percent_cgreg = &que_cgreg_buffer; + + resp.response.ptr_que_percent_cgreg->stat = (T_BAT_percent_cgreg_stat)stat; + resp.response.ptr_que_percent_cgreg->lac = lac; + resp.response.ptr_que_percent_cgreg->ci = cid; + resp.response.ptr_que_percent_cgreg->state = (cmhSM_isContextActive() ? BAT_P_CGREG_STATE_STAT_1 + : BAT_P_CGREG_STATE_STAT_0 ); + aci_bat_send(src_infos_psi,&resp); + } + + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : tBAT_PlusCGPADDR | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT tBAT_PlusCGPADDR (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + U8 count = 0; + U8 cid_array[PDP_CONTEXT_CID_MAX]; + T_BAT_cmd_response resp; + T_BAT_res_tst_plus_cgpaddr tst_cgpaddr_buffer; + + TRACE_FUNCTION ("tBAT_PlusCGPADDR()"); + + ret = (T_ACI_BAT_RSLT)tAT_PlusCGPADDR ((T_ACI_CMD_SRC) src_infos_psi->srcId, cid_array ); + resp.ctrl_response = BAT_RES_TST_PLUS_CGPADDR; + resp.response.ptr_tst_plus_cgpaddr = &tst_cgpaddr_buffer; + if (ret EQ ACI_BAT_CMPL) + { + while ( cid_array[count] NEQ PDP_CONTEXT_CID_INVALID ) + { + resp.response.ptr_tst_plus_cgpaddr->cid[count]=(T_BAT_pdp_cid)cid_array[count]; + count ++; + } + if(count EQ 0) + resp.response.ptr_tst_plus_cgpaddr->cid[0] = BAT_PDP_CID_NOT_PRESENT; + + resp.response.ptr_tst_plus_cgpaddr->c_cid = count; + aci_bat_send(src_infos_psi,&resp); + return(ACI_BAT_CMPL); + } + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return(ACI_BAT_FAIL); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PlusCGSMS | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGSMS (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_CGSMS_SERVICE service = CGSMS_SERVICE_OMITTED; + + TRACE_FUNCTION ("sBAT_PlusCGSMS()"); + + service =(T_CGSMS_SERVICE) cmd->params.ptr_set_plus_cgsms->service; + ret = (T_ACI_BAT_RSLT)sAT_PlusCGSMS ((T_ACI_CMD_SRC) src_infos_psi->srcId, service ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PlusCGSMS | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PlusCGSMS (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_cmd_response resp; + T_BAT_res_que_plus_cgsms que_cgsms_buffer; + T_CGSMS_SERVICE service = CGSMS_SERVICE_OMITTED; + + TRACE_FUNCTION ("qBAT_PlusCGSMS()"); + + ret = (T_ACI_BAT_RSLT)qAT_PlusCGSMS((T_ACI_CMD_SRC)src_infos_psi->srcId, &service); + resp.ctrl_response = BAT_RES_QUE_PLUS_CGSMS; + resp.response.ptr_que_plus_cgsms = &que_cgsms_buffer; + if(ret EQ ACI_BAT_CMPL) + { + resp.response.ptr_que_plus_cgsms->service = (T_BAT_plus_cgsms_service)service; + aci_bat_send(src_infos_psi,&resp); + return ret; + } + else + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return (ACI_BAT_FAIL); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PercentCGAATT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PercentCGAATT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_percent_cgaatt_att_m att_m; + T_BAT_percent_cgaatt_det_m det_m; + + TRACE_FUNCTION ("sBAT_PercentCGAATT()"); + + att_m = cmd->params.ptr_set_percent_cgaatt->att_m; + det_m = cmd->params.ptr_set_percent_cgaatt->det_m; + ret = (T_ACI_BAT_RSLT)sAT_PercentCGAATT ((T_ACI_CMD_SRC)src_infos_psi->srcId,(T_CGAATT_ATTACH_MODE)att_m, (T_CGAATT_DETACH_MODE)det_m ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PercentCGAATT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PercentCGAATT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_BAT_percent_cgaatt_att_m att_m; + T_BAT_percent_cgaatt_det_m det_m; + + TRACE_FUNCTION ("qBAT_PercentCGAATT()"); + + ret = (T_ACI_BAT_RSLT)qAT_PercentCGAATT((T_ACI_CMD_SRC) + src_infos_psi->srcId, (T_CGAATT_ATTACH_MODE *)&att_m, (T_CGAATT_DETACH_MODE *)&det_m); + + if(ret EQ ACI_BAT_CMPL) + { + T_BAT_cmd_response resp; + T_BAT_res_que_percent_cgaatt que_cgaatt_buffer; + + resp.ctrl_response = BAT_RES_QUE_PERCENT_CGAATT; + resp.response.ptr_que_percent_cgaatt = &que_cgaatt_buffer; + + resp.response.ptr_que_percent_cgaatt->att_m = att_m; + resp.response.ptr_que_percent_cgaatt->det_m = det_m; + aci_bat_send(src_infos_psi,&resp); + } + + return ret; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PercentSNCNT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PercentSNCNT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + + TRACE_FUNCTION ("sBAT_PercentSNCNT()"); + ret =(T_ACI_BAT_RSLT) sAT_PercentSNCNT( (T_ACI_CMD_SRC)src_infos_psi->srcId, TRUE ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PercentSNCNT | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PercentSNCNT (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + + TRACE_FUNCTION ("qBAT_PercentSNCNT()"); + ret = (T_ACI_BAT_RSLT)sAT_PercentSNCNT((T_ACI_CMD_SRC) src_infos_psi->srcId, FALSE ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PercentCGMM | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PercentCGMM (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + UBYTE cipher_on , tlli_handling ; + + TRACE_FUNCTION ("sBAT_PercentCGMM()"); + + cipher_on = cmd->params.ptr_set_percent_cgmm->cipher_on; + tlli_handling = cmd->params.ptr_set_percent_cgmm->tlli_handling; + + ret =(T_ACI_BAT_RSLT) sAT_PercentCGMM((T_ACI_CMD_SRC) src_infos_psi->srcId, cipher_on, tlli_handling ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PercentCGPCO | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PercentCGPCO (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ATI_RSLT ret = ATI_FAIL; + USHORT cid = 0; + T_ACI_CGPCO_FORMAT format; + CHAR pco_string[BAT_MAX_CGPCO_PCO_LEN+1]; + T_ACI_CGPCO_MODE mode; + + TRACE_FUNCTION ("sBAT_PercentCGPCO()"); + + memset(pco_string,0,sizeof(pco_string)); + + mode = (T_ACI_CGPCO_MODE)cmd->params.ptr_set_percent_cgpco->mode; + format = (T_ACI_CGPCO_FORMAT)cmd->params.ptr_set_percent_cgpco->format; + + if (cmd->params.ptr_set_percent_cgpco->v_pco) + { + memcpy(pco_string,cmd->params.ptr_set_percent_cgpco->pco,cmd->params.ptr_set_percent_cgpco->c_pco); + } + cid = cmd->params.ptr_set_percent_cgpco->cid; + if(cid EQ (USHORT)BAT_PDP_CID_NOT_PRESENT) + { + cid = (USHORT) INVALID_CID ; + } + if (cid > MAX_CID) + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotSupp); + return ACI_BAT_FAIL ; + } + + switch (mode) + { + case CGPCO_MODE_QUERY_PCO: + { + 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; + + for (i=1;i<MAX_CID;i++) + { + if ((i EQ cid) OR (cid EQ INVALID_CID)) + { + gateway=dns1=dns2=0; + + /* + * Ignore the return value of the ACI function, which is + * always AT_CMPL. + */ + qAT_PercentCGPCO((T_ACI_CMD_SRC)src_infos_psi->srcId,&gateway,&dns1,&dns2,i); + + if (dns1 OR dns2 OR gateway) + { + T_BAT_cmd_response resp; + T_BAT_res_set_percent_cgpco cgpco; + + resp.ctrl_response=BAT_RES_SET_PERCENT_CGPCO; + resp.response.ptr_set_percent_cgpco=&cgpco; + + ipaddr_to_string(dns1, dns1_str); + ipaddr_to_string(dns2, dns2_str); + ipaddr_to_string(gateway, gatew_str); + + cgpco.cid=(T_BAT_pdp_cid)i; + + sprintf((char *)cgpco.pco,"%s,%s,%s",dns1_str,dns2_str,gatew_str); + cgpco.c_pco=strlen((char *)cgpco.pco); + + aci_bat_send(src_infos_psi,&resp); + } + } + } + } + return (ACI_BAT_CMPL); + + case CGPCO_MODE_SET_PCO: + { + switch (format) + { + case CGPCO_FORMAT_HEX: + ret = setatPercentCGPCO_HEX (src_infos_psi->srcId,cid, (UBYTE*)pco_string, (USHORT)strlen (pco_string)); + break; + case CGPCO_FORMAT_ASCII: + ret = setatPercentCGPCO_ASCII (src_infos_psi->srcId, cid, (UBYTE*)pco_string, (USHORT)strlen (pco_string)); + break; + default: + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotSupp); + break; + } + break; + } + default: + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotSupp); + break; + } + + /* + * Convert the ATI return value into ACI/BAT format. + */ + switch (ret) + { + default: + case ATI_FAIL: + case ATI_FAIL_NO_OUTPUT: + return(ACI_BAT_FAIL); + + case ATI_BUSY: + return(ACI_BAT_BUSY); + + case ATI_EXCT: + return(ACI_BAT_EXCT); + + case ATI_CMPL: + case ATI_CMPL_NO_OUTPUT: + return(ACI_BAT_CMPL); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PercentCGPPP | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PercentCGPPP (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_ACI_PPP_PROT protocol; + + TRACE_FUNCTION ("sBAT_PercentCGPPP()"); + + protocol =(T_ACI_PPP_PROT)cmd->params.ptr_set_percent_cgppp->protocol; + ret = (T_ACI_BAT_RSLT)sAT_PercentCGPPP((T_ACI_CMD_SRC)src_infos_psi->srcId, protocol); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PercentCGPPP | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PercentCGPPP (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_ACI_PPP_PROT protocol; + T_BAT_cmd_response resp; + T_BAT_res_que_percent_cgppp que_cgppp_buffer; + + TRACE_FUNCTION ("qBAT_PercentCGPPP()"); + + ret =(T_ACI_BAT_RSLT) qAT_PercentCGPPP((T_ACI_CMD_SRC)src_infos_psi->srcId, &protocol); + resp.ctrl_response = BAT_RES_QUE_PERCENT_CGPPP; + resp.response.ptr_que_percent_cgppp = &que_cgppp_buffer; + if( ret EQ ((T_ACI_BAT_RSLT)ATI_FAIL)) + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); + return (ACI_BAT_FAIL); + } + resp.response.ptr_que_percent_cgppp->protocol = (T_BAT_percent_cgppp_protocol)protocol; + aci_bat_send(src_infos_psi,&resp); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : sBAT_PercentCGCLASS | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT sBAT_PercentCGCLASS (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_PERCENT_CGCLASS m_class = PERCENT_CGCLASS_OMITTED; + + TRACE_FUNCTION ("sBAT_PercentCGCLASS()"); + + m_class=(T_PERCENT_CGCLASS)cmd->params.ptr_set_percent_cgclass->p_mobile_class; + + if (m_class EQ PERCENT_CGCLASS_OMITTED) + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow); + return (ACI_BAT_FAIL); + } + ret = (T_ACI_BAT_RSLT)sAT_PercentCGCLASS ((T_ACI_CMD_SRC) src_infos_psi->srcId, m_class ); + return(ret); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : qBAT_PercentCGCLASS | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT qBAT_PercentCGCLASS (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_send *cmd) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_PERCENT_CGCLASS m_class, currentClass; + T_BAT_cmd_response resp; + T_BAT_res_que_percent_cgclass que_cgclass_buffer; + + TRACE_FUNCTION ("qBAT_PercentCGCLASS()"); + + resp.ctrl_response = BAT_RES_QUE_PERCENT_CGCLASS; + resp.response.ptr_que_percent_cgclass = &que_cgclass_buffer; + ret =(T_ACI_BAT_RSLT) qAT_PercentCGCLASS((T_ACI_CMD_SRC)src_infos_psi->srcId, &m_class, ¤tClass); + if (ret EQ ACI_BAT_CMPL) + { + resp.response.ptr_que_percent_cgclass->p_mobile_class = (T_BAT_p_mobile_class)m_class; + resp.response.ptr_que_percent_cgclass->current_mobile_class = (T_BAT_p_mobile_class)currentClass; + aci_bat_send(src_infos_psi,&resp); + } + return(ret); +} + +#endif /* GPRS */ +