view src/g23m-aci/aci/aci_bat_gprs.c @ 516:1ed9de6c90bd

src/g23m-gsm/sms/sms_for.c: bogus malloc removed The new error handling code that was not present in TCS211 blob version contains a malloc call that is bogus for 3 reasons: 1) The memory allocation in question is not needed in the first place; 2) libc malloc is used instead of one of the firmware's proper ways; 3) The memory allocation is made inside a function and then never freed, i.e., a memory leak. This bug was caught in gcc-built FreeCalypso fw projects (Citrine and Selenite) because our gcc environment does not allow any use of libc malloc (any reference to malloc produces a link failure), but this code from TCS3.2 is wrong even for Magnetite: if this code path is executed repeatedly over a long time, the many small allocations made by this malloc call without a subsequent free will eventually exhaust the malloc heap provided by the TMS470 environment, malloc will start returning NULL, and the bogus code will treat it as an error. Because the memory allocation in question is not needed at all, the fix entails simply removing it.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 22 Jul 2018 06:04:49 +0000
parents 53929b40109c
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  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, &currentClass);
  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 */