view src/aci2/aci/gaci_cmh.h @ 114:3454a514891b

cfg-headers/2092 added
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 06 Oct 2016 17:18:43 +0000
parents 93999a60b835
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  
|  Modul   :  
+----------------------------------------------------------------------------- 
|  Copyright 2002 Texas Instruments Berlin, AG 
|                 All rights reserved. 
| 
|                 This file is confidential and a trade secret of Texas 
|                 Instruments Berlin, AG 
|                 The receipt of or possession of this file does not convey 
|                 any rights to reproduce or disclose its contents or to 
|                 manufacture, use, or sell anything it may describe, in 
|                 whole, or in part, without the specific written consent of 
|                 Texas Instruments Berlin, AG. 
+----------------------------------------------------------------------------- 
|  Purpose :  GPRS Command handler interface definitions.
+----------------------------------------------------------------------------- 
*/ 

#ifndef GACI_CMH_H
#define GACI_CMH_H


/*==== MACROS =====================================================*/
#define GPRS_EVENT_REPORTING_BUFFER_SIZE  10

/*==== DEFINES ====================================================*/
/* the maximum length of strings to describe the PDP typ, PDP address, APN and L2P */
#define MAX_PDP_TYPE_LEN  7
#define MAX_APN_LEN       103
#define MAX_DNS_LEN       15
#define MAX_USER_LEN      63  /* this is a common value for Routers etc... */
#define MAX_PWD_LEN       63
#define MAX_PDP_ADDR_LEN  21
#if defined (FF_PKTIO) OR defined (FF_TCP_IP) || defined(FF_GPF_TCPIP) OR defined (FF_PSI)
#define MAX_L2P_LENGTH    6
#else /* FF_PKTIO || FF_TCP_IP || FF_GPF_TCPIP OR FF_PSI */
#define MAX_L2P_LENGTH    4
#endif /* FF_PKTIO || FF_TCP_IP || FF_GPF_TCPIP OR FF_PSI */

typedef enum                    /* CGDCONT command d_comp */
{
  GPRS_CID_OMITTED = 0,         /* value is omitted */
  GPRS_CID_1,                   /* PDP data compression off (default) */
  GPRS_CID_2,                   /* PDP data compression on */
#if defined (FF_PKTIO) OR defined (FF_PSI)
  GPRS_CID_3,
  GPRS_CID_4,
  GPRS_CID_5,
  GPRS_CID_6,
#endif /* FF_PKTIO OR FF_PSI */
  GPRS_CID_INVALID              /* invalid value */

} T_GPRS_CID;

#define INVALID_CID         GPRS_CID_OMITTED

#if defined (FF_PKTIO) OR defined (FF_PSI)
#define MAX_CID             GPRS_CID_6
#else /* FF_PKTIO OR FF_PSI */
#define MAX_CID             GPRS_CID_2
#endif /* FF_PKTIO OR FF_PSI */

#define MAX_CID_PLUS_EINS   GPRS_CID_INVALID

/*==== TYPES ======================================================*/
#define GPRS_QOS_OMITTED  0

typedef struct
{
  UBYTE           preced;
  UBYTE           delay;
  UBYTE           relclass;
  UBYTE           peak;
  UBYTE           mean;
} T_QOS;

typedef char T_PDP_ADDRESS  [MAX_PDP_ADDR_LEN];
typedef char T_PDP_TYPE     [MAX_PDP_TYPE_LEN];
typedef char T_APN          [MAX_APN_LEN];
typedef char T_L2P          [MAX_L2P_LENGTH];

typedef struct
{
  T_APN               apn;
  T_PDP_TYPE          pdp_type;
  T_PDP_ADDRESS       pdp_addr;
  SHORT               d_comp;
  SHORT               h_comp;
  T_QOS               qos;
  T_QOS               min_qos;
} T_GPRS_CONT_REC;

/*---- Types of  -----------------------------------------*/
typedef enum                    /* CGDCONT command d_comp */
{
  CGDCONT_D_COMP_OMITTED = -1,  /* value is omitted */
  CGDCONT_D_COMP_OFF,           /* PDP data compression off (default) */
  CGDCONT_D_COMP_ON,            /* PDP data compression on */
  CGDCONT_D_COMP_INVALID        /* invalid value */

} T_CGDCONT_D_COMP;

typedef enum                    /* CGDCONT command h_comp */
{
  CGDCONT_H_COMP_OMITTED = -1,  /* value is omitted */
  CGDCONT_H_COMP_OFF,           /* PDP header compression off (default) */
  CGDCONT_H_COMP_ON,            /* PDP header compression on */
  CGDCONT_H_COMP_INVALID        /* invalid value */

} T_CGDCONT_H_COMP;

typedef enum                    /* CGATT command state */
{
  CGATT_STATE_OMITTED = -1,     /* value is omitted */
  CGATT_STATE_DETACHED,         /* GPRS detached */
  CGATT_STATE_ATTACHED,         /* GPRS attached */
  CGATT_STATE_INVALID           /* invalid value */

} T_CGATT_STATE;

typedef enum                    /* CGACT command state */
{
  CGACT_STATE_OMITTED = -1,     /* value is omitted */
  CGACT_STATE_DEACTIVATED,      /* PDP context detached */
  CGACT_STATE_ACTIVATED,        /* PDP context attached */
  CGACT_STATE_INVALID           /* invalid value */

} T_CGACT_STATE;

typedef enum                    /* CGAUTO command n */
{
  CGAUTO_N_OMITTED = -1,        /* value is omitted */
  CGAUTO_N_GPRS_RES_OFF,        /* turn off automatic response for GPRS only */
  CGAUTO_N_GPRS_RES_ON,         /* turn on automatic response for GPRS only */
  CGAUTO_N_MCM_GPRS_ONLY,       /* modem compabitbility mode, GPRS only */
  CGAUTO_N_MCM_GPRS_CSC,        /* modem compabitbility mode, GPRS and circuit switched calls (default) */
  CGAUTO_N_INVALID              /* invalid value */

} T_CGAUTO_N;

typedef enum                    /* CGANS command response */
{
  CGANS_RESPONSE_OMITTED = -1,  /* value is omitted */
  CGANS_RESPONSE_REJECT,        /* reject the request */
  CGANS_RESPONSE_ACCEPT,        /* accept and request that the PDP context be activated */
  CGANS_RESPONSE_INVALID        /* invalid value */

} T_CGANS_RESPONSE;

typedef enum                    /* CGANS command response */
{
  CGCLASS_CLASS_OMITTED = -1,   /* value is omitted */
  CGCLASS_CLASS_A,              /* mobile class A  (highest) */
  CGCLASS_CLASS_B,              /* mobile class B  (if necessary consider NET III) */
  CGCLASS_CLASS_CG,             /* mobile class CG (GPRS only mode) */
  CGCLASS_CLASS_CC,             /* mobile class CC (circuit switched only mode - lowest) */
  CGCLASS_CLASS_MAX             /* invalid value */

} T_CGCLASS_CLASS;

typedef enum                    /* CGANS command response */
{
  PERCENT_CGCLASS_OMITTED = -1,   /* value is omitted */
  PERCENT_CGCLASS_A,              /* mobile class A  (highest) */
  PERCENT_CGCLASS_B,              /* mobile class B   */
  PERCENT_CGCLASS_BG,             /* mobile class BG   */
  PERCENT_CGCLASS_BC,             /* mobile class BC   */
  PERCENT_CGCLASS_BX,             /* mobile class BX   */
  PERCENT_CGCLASS_CG,             /* mobile class CG (GPRS only mode) */
  PERCENT_CGCLASS_CC,             /* mobile class CC (circuit switched only mode - lowest) */
  PERCENT_CGCLASS_MAX             /* invalid value */

} T_PERCENT_CGCLASS;

typedef enum                    /* CGEREP command mode */
{
  CGEREP_MODE_OMITTED = -1,     /* value is omitted */
  CGEREP_MODE_BUFFER,           /* buffer unsolicited result codes */
  CGEREP_MODE_DICARD_RESERVED,  /* discard unsolicited result codes when MT-TE link is reserved */
  CGEREP_MODE_BUFFER_RESERVED,  /* buffer unsolicited result codes in the MT when MT-TE link is reserved */
  CGEREP_MODE_INVALID           /* invalid value */

} T_CGEREP_MODE;

typedef enum                    /* CGEREP command bfr */
{
  CGEREP_BFR_OMITTED = -1,      /* value is omitted */
  CGEREP_BFR_CLEAR,             /* buffer unsolicited result codes */
  CGEREP_BFR_FLUSH,             /* discard unsolicited result codes when MT-TE link is reserved */
  CGEREP_BFR_INVALID            /* invalid value */

} T_CGEREP_BFR;

typedef enum                    /* CGREG command read stat */
{
  CGREG_STAT_NOT_PRESENT = -1,  /* not present, last state is not indicated */
  CGREG_STAT_NOT_REG,           /* not registered, no searching */
  CGREG_STAT_REG_HOME,          /* registered, home network */
  CGREG_STAT_SEARCHING,         /* not registered, but searching */
  CGREG_STAT_REG_DEN,           /* registration denied */
  CGREG_STAT_UNKN,              /* unknown */
  CGREG_STAT_REG_ROAM           /* registered, roaming */

} T_CGREG_STAT;

typedef enum                    /* %CGREG command read stat */
{
  P_CGREG_STAT_NOT_PRESENT = -1,  /* not present, last state is not indicated */
  P_CGREG_STAT_NOT_REG,           /* not registered, no searching */
  P_CGREG_STAT_REG_HOME,          /* registered, home network */
  P_CGREG_STAT_SEARCHING,         /* not registered, but searching */
  P_CGREG_STAT_REG_DEN,           /* registration denied */
  P_CGREG_STAT_UNKN,              /* unknown */
  P_CGREG_STAT_REG_ROAM,          /* registered, roaming */
  P_CGREG_STAT_LIMITED,           /* limited service */
  P_CGREG_STAT_GSM_CALL,          /* GSM call is active */
  P_CGREG_STAT_NO_CELL,           /* no cell available */
  P_CGREG_STAT_TRY_TO_UPDATE      /* next attempt to update MS */

} T_P_CGREG_STAT;


typedef enum                    /* CGSMS command service */
{
  CGSMS_SERVICE_OMITTED = -1,   /* value is omitted */
  CGSMS_SERVICE_GPRS,           /* GPRS */
  CGSMS_SERVICE_CS,             /* circuit switched */
  CGSMS_SERVICE_GPRS_PREFERRED, /* GPRS preferred */
  CGSMS_SERVICE_CS_PREFERRED,   /* circuit switched preferred */
  CGSMS_SERVICE_INVALID         /* invalid value */

} T_CGSMS_SERVICE;

typedef enum                    /* CGAATT command automatic attach mode */
{
  CGAATT_ATTACH_MODE_OMITTED = -1, /* value is omitted */
  CGAATT_ATTACH_MODE_AUTOMATIC,    /* automatic attach */
  CGAATT_ATTACH_MODE_MANUAL,       /* manual attach */
  CGAATT_ATTACH_MODE_INVALID       /* invalid value */

} T_CGAATT_ATTACH_MODE;

typedef enum                    /* CGAATT command automatic detach after context deactivation */
{
  CGAATT_DETACH_MODE_OMITTED = -1, /* value is omitted */
  CGAATT_DETACH_MODE_ON,           /* on */
  CGAATT_DETACH_MODE_OFF,          /* off */
  CGAATT_DETACH_MODE_INVALID       /* invalid value */

} T_CGAATT_DETACH_MODE;

/*---- Types for event reporting-----------------------------------*/

typedef enum                /* Defined events for GPRS event reporting */
{
  CGEREP_EVENT_INVALID = -1, /* reserved value */
  CGEREP_EVENT_REJECT,      /* network request context activation */
  CGEREP_EVENT_NW_REACT,    /* network requested context reactivation */
  CGEREP_EVENT_NW_DEACT,    /* network forced context deactivation */
  CGEREP_EVENT_ME_DEACT,    /* mobile equipment forced context deactivation */
  CGEREP_EVENT_NW_DETACH,   /* network forced detach */
  CGEREP_EVENT_ME_DETACH,   /* mobile equipment forced detach */
  CGEREP_EVENT_NW_CLASS,    /* network forced class change */
  CGEREP_EVENT_ME_CLASS,    /* mobile equipment forced class change */
  CGEREP_EVENT_NW_ACT,    /* network requested context activation */
  CGEREP_EVENT_ME_ACT    /* mobile equipment initiated context activation */
} T_CGEREP_EVENT;

typedef struct              /* parameter of unsolicited event: REJECT */
{
  T_PDP_TYPE        pdp_type;
  T_PDP_ADDRESS     pdp_addr;

} T_EVENT_REJECT;

typedef struct              /* parameter of unsolicited event: NW REACT, NW DEACT, ME DEACT */
{
  T_PDP_TYPE        pdp_type;
  T_PDP_ADDRESS     pdp_addr;
  SHORT             cid;

} T_EVENT_ACT;

typedef union
{
  T_EVENT_REJECT    reject;
  T_EVENT_ACT       act;
  T_CGCLASS_CLASS   mobile_class;

} T_CGEREP_EVENT_REP_PARAM;

/*---- %CGPCO -----------------------------------------------------*/

#define ACI_PCO_MAX_LEN                         251
#define ACI_PCO_CONTENTMASK_AUTH                0x00000001
#define ACI_PCO_CONTENTMASK_DNS1                0x00000002
#define ACI_PCO_CONTENTMASK_DNS2                0x00000004

#define ACI_PCO_CONFIG_PROT_PPP                 0

#define ACI_PCO_AUTH_PROT_PAP                   0xc023

#define ACI_PCO_PAP_OVERHEAD                    9
#define ACI_PCO_IPCP_OVERHEAD                   7
#define ACI_PCO_PAP_AUTH_REQ                    0x01
#define ACI_PCO_IPCP_PROT_MSB                   0x80
#define ACI_PCO_IPCP_PROT_LSB                   0x21
#define ACI_PCO_IPCP_CONF_REQ                   0x01
#define ACI_PCO_IPCP_CONF_ACK                   0x02
#define ACI_PCO_IPCP_CONF_NAK                   0x03
#define ACI_PCO_IPCP_TYPE_IP                    3
#define ACI_PCO_IPCP_TYPE_DNS1                  129
#define ACI_PCO_IPCP_TYPE_DNS2                  131
#define ACI_PCO_IPCP_LENGTH_IP                  6
#define ACI_PCO_IPCP_LENGTH_DNS1                6
#define ACI_PCO_IPCP_LENGTH_DNS2                6

typedef enum
{
  CGPCO_FORMAT_HEX = 0,
  CGPCO_FORMAT_ASCII
}T_ACI_CGPCO_FORMAT;

typedef enum
{
  CGPCO_MODE_SET_PCO = 0,
  CGPCO_MODE_QUERY_PCO
}T_ACI_CGPCO_MODE;


/*==== PROTOTYPES =================================================*/

/***  set commands  ***/
EXTERN T_ACI_RETURN sAT_PercentCGPCO (T_ACI_CMD_SRC srcId, 
                                      SHORT cid, USHORT protocol,
                                      CHAR *user, CHAR *pwd,CHAR *dns1, CHAR *dns2);
EXTERN T_ACI_RETURN qAT_PercentCGPCO ( UBYTE srcId, ULONG * gateway, ULONG * dns1,ULONG * dns2, USHORT cid);
EXTERN T_ACI_RETURN sAT_PlusCGDCONT ( T_ACI_CMD_SRC srcId, SHORT cid, T_GPRS_CONT_REC *inputCtxt);
EXTERN T_ACI_RETURN sAT_PlusCGQREQ  ( T_ACI_CMD_SRC srcId, SHORT cid ,T_QOS *qos);
EXTERN T_ACI_RETURN sAT_PlusCGQMIN  ( T_ACI_CMD_SRC srcId, SHORT cid ,T_QOS *qos);
EXTERN T_ACI_RETURN sAT_PlusCGATT   ( T_ACI_CMD_SRC srcId, T_CGATT_STATE state );
EXTERN T_ACI_RETURN sAT_PlusCGACT   ( T_ACI_CMD_SRC srcId, T_CGACT_STATE state, SHORT *cids );
EXTERN T_ACI_RETURN sAT_PlusCGDATA  ( T_ACI_CMD_SRC srcId, char *L2P, SHORT *cids );
EXTERN T_ACI_RETURN sAT_PlusCGPADDR ( T_ACI_CMD_SRC srcId, SHORT *cids, T_PDP_ADDRESS *pdp_adress );
EXTERN T_ACI_RETURN sAT_PlusCGAUTO  ( T_ACI_CMD_SRC srcId, T_CGAUTO_N n );
EXTERN T_ACI_RETURN sAT_PlusCGANS   ( T_ACI_CMD_SRC srcId, SHORT response, char *l2p, SHORT cid );
EXTERN T_ACI_RETURN sAT_PlusCGCLASS ( T_ACI_CMD_SRC srcId, T_CGCLASS_CLASS m_class );
EXTERN T_ACI_RETURN sAT_PlusCGEREP  ( T_ACI_CMD_SRC srcId, T_CGEREP_MODE mode, T_CGEREP_BFR bfr );
EXTERN T_ACI_RETURN sAT_PlusCGSMS   ( T_ACI_CMD_SRC srcId, T_CGSMS_SERVICE service );

EXTERN T_ACI_RETURN sAT_PercentCGAATT ( T_ACI_CMD_SRC srcId, T_CGAATT_ATTACH_MODE att_m, T_CGAATT_DETACH_MODE det_m );
EXTERN T_ACI_RETURN sAT_PercentCGMM ( T_ACI_CMD_SRC srcId, UBYTE cipher_on,
                                                           UBYTE tlli_handling );
EXTERN T_ACI_RETURN sAT_PercentSNCNT( T_ACI_CMD_SRC srcId, BOOL reset_counter );

EXTERN T_ACI_RETURN sAT_PercentCGPPP( T_ACI_CMD_SRC srcId,
                                      T_ACI_PPP_PROT protocol );
EXTERN T_ACI_RETURN sAT_PercentCGCLASS ( T_ACI_CMD_SRC srcId, T_PERCENT_CGCLASS m_class );
EXTERN T_ACI_RETURN qAT_PercentCGPPP( T_ACI_CMD_SRC srcId,
                                      T_ACI_PPP_PROT *protocol );

/***  read commands  ***/
EXTERN T_ACI_RETURN qAT_PlusCGDCONT ( T_ACI_CMD_SRC srcId, T_GPRS_CONT_REC (*Ctxt)[MAX_CID_PLUS_EINS], SHORT *cid );
EXTERN T_ACI_RETURN qAT_PlusCGQREQ  ( T_ACI_CMD_SRC srcId, T_QOS **qos, SHORT *cid);
EXTERN T_ACI_RETURN qAT_PlusCGQMIN  ( T_ACI_CMD_SRC srcId, T_QOS **qos, SHORT *cid);
EXTERN T_ACI_RETURN qAT_PlusCGATT   ( T_ACI_CMD_SRC srcId, T_CGATT_STATE *state );
EXTERN T_ACI_RETURN qAT_PlusCGACT   ( T_ACI_CMD_SRC srcId, BOOL  *states, SHORT *cid );
EXTERN T_ACI_RETURN qAT_PlusCGAUTO  ( T_ACI_CMD_SRC srcId, T_CGAUTO_N *n);
EXTERN T_ACI_RETURN qAT_PlusCGCLASS ( T_ACI_CMD_SRC srcId, T_CGCLASS_CLASS *m_class );
EXTERN T_ACI_RETURN qAT_PlusCGEREP  ( T_ACI_CMD_SRC srcId, T_CGEREP_MODE *mode, T_CGEREP_BFR *bfr );
EXTERN T_ACI_RETURN qAT_PlusCGREG   ( T_ACI_CMD_SRC srcId, T_CGREG_STAT *stat, USHORT *lac, USHORT *ci );
EXTERN T_ACI_RETURN qAT_PercentCGREG( T_ACI_CMD_SRC srcId, T_P_CGREG_STAT *stat, USHORT *lac, USHORT *ci );
EXTERN T_ACI_RETURN qAT_PlusCGSMS   ( T_ACI_CMD_SRC srcId, T_CGSMS_SERVICE *service );

EXTERN T_ACI_RETURN qAT_PercentCGAATT  ( T_ACI_CMD_SRC srcId, T_CGAATT_ATTACH_MODE *att_m, T_CGAATT_DETACH_MODE *det_m );
EXTERN T_ACI_RETURN qAT_PercentCGCLASS  ( T_ACI_CMD_SRC srcId, T_PERCENT_CGCLASS *m_class, T_PERCENT_CGCLASS *currentClass );

/***  test commands  ***/
EXTERN T_ACI_RETURN tAT_PlusCGPADDR ( T_ACI_CMD_SRC srcId, SHORT *cids);
EXTERN T_ACI_RETURN tAT_PlusCGSMS   ( T_ACI_CMD_SRC srcId, SHORT *service_list);


/*--------------- extension mechansim ----------------------------*/

/*--------------- constants --------------------------------------*/

/*--------------- configuration ----------------------------------*/

/*--------------- Extension Handler -> AT Interpreter ------------*/

/*--------------- AT Interpreter -> Extension Handler ------------*/

/*------- call-backs for MMI --------------------------------------*/

#ifdef CMH_F_C /*lint -save -e18 */ /* Turn off Lint errors for this "construct" */
EXTERN void rAT_PlusCGACT            ( void );
EXTERN void rAT_PlusCGDATA           ( void );
EXTERN void rAT_PlusCGANS            ( void );
EXTERN void rAT_PlusCGEREP           ( void );
EXTERN void rAT_PlusCGREG            ( void );
EXTERN void rAT_changedQOS           ( void );
EXTERN void rAT_PercentSNCNT         ( void );
EXTERN void rAT_PercentCGREG         ( void );
EXTERN void rAT_PercentCGEV           ( void );
/*lint -restore */
#else
EXTERN void rAT_PlusCGACT            ( SHORT link_id );
EXTERN void rAT_PlusCGDATA           ( SHORT link_id );
EXTERN void rAT_PlusCGANS            ( SHORT link_id );
EXTERN void rAT_PlusCGEREP           ( T_CGEREP_EVENT event, T_CGEREP_EVENT_REP_PARAM *param );
EXTERN void rAT_PlusCGREG            ( T_CGREG_STAT stat, USHORT lac, USHORT ci );
EXTERN void rAT_changedQOS           ( SHORT cid, T_QOS *qos );
EXTERN void rAT_PercentSNCNT         ( UBYTE c_id,
                                       ULONG octets_uplink,
                                       ULONG octets_downlink,
                                       ULONG packets_uplink,
                                       ULONG packets_downlink );
EXTERN void rAT_PercentCGREG         ( T_P_CGREG_STAT stat, USHORT lac, USHORT ci, BOOL bActiveContext );
EXTERN void rAT_PercentCGEV           ( T_CGEREP_EVENT event, T_CGEREP_EVENT_REP_PARAM *param );
#endif

/*--------------- call-backs for AT CI ----------------------------*/

#ifdef CMH_F_C
/*lint -save -e18 */ /* Turn off Lint errors for this "construct" */
EXTERN void rCI_PlusCGACT            ( void );
EXTERN void rCI_PlusCGDATA           ( void );
EXTERN void rCI_PlusCGANS            ( void );
EXTERN void rCI_PlusCGEREP           ( void );
EXTERN void rCI_PlusCGREG            ( void );
EXTERN void rCI_changedQOS           ( void );
EXTERN void rCI_PercentSNCNT         ( void );
EXTERN void rCI_PercentCGREG         ( void );
EXTERN void rCI_PercentCGEV           ( void );
/*lint -restore */
#else
EXTERN void rCI_PlusCGACT            ( SHORT link_id );
EXTERN void rCI_PlusCGDATA           ( SHORT link_id );
EXTERN void rCI_PlusCGANS            ( SHORT link_id );
EXTERN void rCI_PlusCGEREP           ( T_CGEREP_EVENT event, T_CGEREP_EVENT_REP_PARAM *param );
EXTERN void rCI_PlusCGREG            ( T_CGREG_STAT stat, USHORT lac, USHORT ci );
EXTERN void rCI_changedQOS           ( SHORT cid, T_QOS *qos );
EXTERN void rCI_PercentSNCNT         ( UBYTE c_id,
                                       ULONG octets_uplink,
                                       ULONG octets_downlink,
                                       ULONG packets_uplink,
                                       ULONG packets_downlink );
EXTERN void rCI_PercentCGREG         ( T_P_CGREG_STAT stat, USHORT lac, USHORT ci, BOOL bActiveContext );
EXTERN void rCI_PercentCGEV           ( T_CGEREP_EVENT event, T_CGEREP_EVENT_REP_PARAM *param );
#endif

#endif
/*==== EOF ========================================================*/