1820df7a2d
Host ATM Research Platform (HARP), Network Computing Services, Inc. This software was developed with the support of the Defense Advanced Research Projects Agency (DARPA).
514 lines
15 KiB
Plaintext
514 lines
15 KiB
Plaintext
%/*
|
|
% *
|
|
% * ===================================
|
|
% * HARP | Host ATM Research Platform
|
|
% * ===================================
|
|
% *
|
|
% *
|
|
% * This Host ATM Research Platform ("HARP") file (the "Software") is
|
|
% * made available by Network Computing Services, Inc. ("NetworkCS")
|
|
% * "AS IS". NetworkCS does not provide maintenance, improvements or
|
|
% * support of any kind.
|
|
% *
|
|
% * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
|
|
% * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
% * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
|
|
% * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
|
|
% * In no event shall NetworkCS be responsible for any damages, including
|
|
% * but not limited to consequential damages, arising from or relating to
|
|
% * any use of the Software or related support.
|
|
% *
|
|
% * Copyright 1994-1998 Network Computing Services, Inc.
|
|
% *
|
|
% * Copies of this Software may be made, however, the above copyright
|
|
% * notice must be reproduced on all copies.
|
|
% *
|
|
% * @(#) $Id: spans_xdr.x,v 1.4 1997/05/06 22:17:36 mks Exp $
|
|
% *
|
|
% */
|
|
%
|
|
/*
|
|
* SPANS Signalling Manager
|
|
* ---------------------------
|
|
*
|
|
* SPANS Protocol Message XDR Specification
|
|
*
|
|
*/
|
|
|
|
#ifdef RPC_HDR
|
|
%/*
|
|
% * SPANS Signalling Manager
|
|
% * ---------------------------
|
|
% *
|
|
% * SPANS Protocol Message Definitions
|
|
% *
|
|
% */
|
|
%
|
|
%#ifndef _SPANS_SPANS_XDR_H
|
|
%#define _SPANS_SPANS_XDR_H
|
|
%
|
|
%#include <rpc/types.h>
|
|
%
|
|
#endif
|
|
|
|
#ifdef RPC_XDR
|
|
%/*
|
|
% * SPANS Signalling Manager
|
|
% * ---------------------------
|
|
% *
|
|
% * SPANS Protocol Message XDR Routines
|
|
% *
|
|
% */
|
|
%
|
|
%#ifndef lint
|
|
%static char *RCSid = "@(#) $Id: spans_xdr.x,v 1.4 1997/05/06 22:17:36 mks Exp $";
|
|
%#endif
|
|
%
|
|
#endif
|
|
|
|
|
|
/*
|
|
* SPANS Signalling
|
|
*/
|
|
const SPANS_SIG_VPI = 0; /* Signalling VPI */
|
|
const SPANS_SIG_VCI = 15; /* Signalling VCI */
|
|
const SPANS_CLS_VPI = 0; /* Connectionless VPI */
|
|
const SPANS_CLS_VCI = 14; /* Connectionless VCI */
|
|
|
|
const SPANS_MIN_VCI = 32; /* Lowest VCI to allocate */
|
|
const SPANS_MAX_VCI = 1023; /* Highest VCI to allocate */
|
|
const SPANS_VPI = 0; /* Only VPI to allocate */
|
|
|
|
/*
|
|
* SPANS Protocol Version
|
|
*
|
|
* Major_version * 256 + Minor_version
|
|
*/
|
|
typedef u_int spans_version;
|
|
|
|
const SPANS_VERS_1_0 = 0x0100; /* Version 1.0 */
|
|
|
|
|
|
/*
|
|
* VPI/VCI
|
|
*
|
|
* Format:
|
|
* 4 bits - unused
|
|
* 12 bits - VPI value
|
|
* 16 bits - VCI value
|
|
*/
|
|
typedef u_int spans_vpvc; /* VPI/VCI value */
|
|
|
|
#ifdef RPC_HDR
|
|
%#define SPANS_EXTRACT_VPI(p) (((p) >> 16) & 0x0FFF)
|
|
%#define SPANS_EXTRACT_VCI(p) ((p) & 0x0FFFF)
|
|
%#define SPANS_PACK_VPIVCI(p, c) ((((p) & 0x0FFF) << 16) | ((c) & 0x0FFFF))
|
|
#endif
|
|
|
|
|
|
/*
|
|
* VPI/VCI Preference
|
|
*/
|
|
struct spans_vpvc_pref {
|
|
bool vpf_valid; /* VPI/VCI values valid */
|
|
spans_vpvc vpf_vpvc; /* VPI/VCI value */
|
|
};
|
|
|
|
|
|
/*
|
|
* SPANS ATM Address
|
|
*/
|
|
struct spans_addr {
|
|
opaque addr[8]; /* SPANS ATM address */
|
|
};
|
|
|
|
|
|
/*
|
|
* Service Access Point (SAP)
|
|
*/
|
|
typedef u_int spans_sap; /* SAP value */
|
|
|
|
const SPANS_SAP_IP = 1025; /* TCP/IP */
|
|
const SPANS_SAP_EPHEMERAL = 2048; /* Start of ephemeral SAPs*/
|
|
|
|
|
|
/*
|
|
* ATM Connection Identifier
|
|
*/
|
|
struct spans_atm_conn {
|
|
spans_addr con_dst; /* Destination ATM address */
|
|
spans_addr con_src; /* Source ATM address */
|
|
spans_sap con_dsap; /* Destination SAP */
|
|
spans_sap con_ssap; /* Source SAP */
|
|
};
|
|
|
|
|
|
/*
|
|
* Connection Resources
|
|
*/
|
|
struct spans_resrc {
|
|
u_int rsc_peak; /* Peak bandwidth (Kbps) */
|
|
u_int rsc_mean; /* Mean bandwidth (Kbps) */
|
|
u_int rsc_burst; /* Mean burst (Kb) */
|
|
};
|
|
|
|
|
|
/*
|
|
* ATM Adaptation Layer (AAL) Types
|
|
*/
|
|
enum spans_aal {
|
|
SPANS_AAL0 = 0, /* NULL AAL */
|
|
SPANS_AAL1 = 1, /* AAL 1 */
|
|
SPANS_AAL2 = 2, /* AAL 2 */
|
|
SPANS_AAL3 = 3, /* AAL 3 */
|
|
SPANS_AAL4 = 4, /* AAL 4 */
|
|
SPANS_AAL5 = 5 /* AAL 5 */
|
|
};
|
|
|
|
|
|
/*
|
|
* Result Codes
|
|
*/
|
|
enum spans_result {
|
|
SPANS_OK = 0, /* Success */
|
|
SPANS_FAIL = 1, /* Failure */
|
|
SPANS_NOVPVC = 2, /* No VP/VC */
|
|
SPANS_NORSC = 3, /* No resources */
|
|
SPANS_BADDEST = 4 /* Bad destination */
|
|
};
|
|
|
|
|
|
/*
|
|
* Message Types
|
|
*/
|
|
enum spans_msgtype {
|
|
/*
|
|
* SPANS UNI message types
|
|
*/
|
|
SPANS_STAT_REQ = 0, /* Status request */
|
|
SPANS_STAT_IND = 1, /* Status indication */
|
|
SPANS_STAT_RSP = 2, /* Status response */
|
|
SPANS_OPEN_REQ = 3, /* Open request */
|
|
SPANS_OPEN_IND = 4, /* Open indication */
|
|
SPANS_OPEN_RSP = 5, /* Open response */
|
|
SPANS_OPEN_CNF = 6, /* Open confirmation */
|
|
SPANS_CLOSE_REQ = 7, /* Close request */
|
|
SPANS_CLOSE_IND = 8, /* Close indication */
|
|
SPANS_CLOSE_RSP = 9, /* Close response */
|
|
SPANS_CLOSE_CNF = 10, /* Close confirmation */
|
|
SPANS_RCLOSE_REQ = 11, /* Reverse close request */
|
|
SPANS_RCLOSE_IND = 12, /* Reverse close indication */
|
|
SPANS_RCLOSE_RSP = 13, /* Reverse close response */
|
|
SPANS_RCLOSE_CNF = 14, /* Reverse close confirmation */
|
|
SPANS_MULTI_REQ = 15, /* Multicast request */
|
|
SPANS_MULTI_IND = 16, /* Multicast indication */
|
|
SPANS_MULTI_RSP = 17, /* Multicast response */
|
|
SPANS_MULTI_CNF = 18, /* Multicast confirmation */
|
|
SPANS_ADD_REQ = 19, /* Add request */
|
|
SPANS_ADD_IND = 20, /* Add indication */
|
|
SPANS_ADD_RSP = 21, /* Add response */
|
|
SPANS_ADD_CNF = 22, /* Add confirmation */
|
|
SPANS_JOIN_REQ = 23, /* Join request */
|
|
SPANS_JOIN_CNF = 24, /* Join confirmation */
|
|
SPANS_LEAVE_REQ = 25, /* Leave request */
|
|
SPANS_LEAVE_CNF = 26, /* Leave confirmation */
|
|
|
|
/*
|
|
* SPANS NNI message types
|
|
*/
|
|
SPANS_NSAP_IND = 99, /* NSAP routing message */
|
|
SPANS_MAP_IND = 100, /* Topology message */
|
|
SPANS_SETUP_REQ = 101, /* Setup request */
|
|
SPANS_SETUP_RSP = 102, /* Setup response */
|
|
SPANS_CHANGE_REQ = 103, /* Change request */
|
|
SPANS_CHANGE_RSP = 104, /* Change response */
|
|
SPANS_RELOC_REQ = 105, /* Relocation request */
|
|
SPANS_RELOC_RSP = 106, /* Relocation response */
|
|
SPANS_HELLO_IND = 107, /* Hello message */
|
|
|
|
SPANS_VCIR_IND = 108, /* VCI range indication */
|
|
SPANS_QUERY_REQ = 110, /* Conn. state query request */
|
|
SPANS_QUERY_RSP = 111 /* Conn. state query response */
|
|
};
|
|
|
|
|
|
/*
|
|
* Query types
|
|
*/
|
|
enum spans_query_type {
|
|
SPANS_QUERY_NORMAL, /* Normal--respond */
|
|
SPANS_QUERY_DEBUG, /* Debug--respond with state */
|
|
SPANS_QUERY_END_TO_END /* Not implemented */
|
|
};
|
|
|
|
|
|
/*
|
|
* SPANS connection states
|
|
*/
|
|
enum spans_conn_state {
|
|
SPANS_CONN_OPEN, /* Connection is open */
|
|
SPANS_CONN_OPEN_PEND, /* Connection is being opened */
|
|
SPANS_CONN_CLOSE_PEND, /* Connection is being closed */
|
|
SPANS_CONN_CLOSED /* Connection does not exist */
|
|
};
|
|
|
|
|
|
/*
|
|
* Message Parameters
|
|
*
|
|
* There is a separate message parameter structure for each
|
|
* message type.
|
|
*/
|
|
struct spans_parm_stat_req {
|
|
u_long streq_es_epoch; /* End system epoch */
|
|
};
|
|
|
|
struct spans_parm_stat_ind {
|
|
u_long stind_sw_epoch; /* Switch epoch */
|
|
spans_addr stind_es_addr; /* End system ATM address */
|
|
spans_addr stind_sw_addr; /* Switch ATM address */
|
|
};
|
|
|
|
struct spans_parm_stat_rsp {
|
|
u_long strsp_es_epoch; /* End system epoch */
|
|
spans_addr strsp_es_addr; /* End system ATM address */
|
|
};
|
|
|
|
struct spans_parm_open_req {
|
|
spans_atm_conn opreq_conn; /* Connection identity */
|
|
spans_aal opreq_aal; /* AAL type */
|
|
spans_resrc opreq_desrsrc; /* Desired resources */
|
|
spans_resrc opreq_minrsrc; /* Minimum resources */
|
|
spans_vpvc_pref opreq_vpvc; /* VPI/VCI preference */
|
|
};
|
|
|
|
struct spans_parm_open_ind {
|
|
spans_atm_conn opind_conn; /* Connection identity */
|
|
spans_aal opind_aal; /* AAL type */
|
|
spans_resrc opind_desrsrc; /* Desired resources */
|
|
spans_resrc opind_minrsrc; /* Minimum resources */
|
|
spans_vpvc_pref opind_vpvc; /* VPI/VCI preference */
|
|
};
|
|
|
|
struct spans_parm_open_rsp {
|
|
spans_atm_conn oprsp_conn; /* Connection identity */
|
|
spans_result oprsp_result; /* Open result */
|
|
spans_resrc oprsp_rsrc; /* Allocated resources */
|
|
spans_vpvc oprsp_vpvc; /* Allocated VPI/VCI */
|
|
};
|
|
|
|
struct spans_parm_open_cnf {
|
|
spans_atm_conn opcnf_conn; /* Connection identity */
|
|
spans_result opcnf_result; /* Open result */
|
|
spans_resrc opcnf_rsrc; /* Allocated resources */
|
|
spans_vpvc opcnf_vpvc; /* Allocated VPI/VCI */
|
|
};
|
|
|
|
struct spans_parm_close_req {
|
|
spans_atm_conn clreq_conn; /* Connection identity */
|
|
};
|
|
|
|
struct spans_parm_close_ind {
|
|
spans_atm_conn clind_conn; /* Connection identity */
|
|
};
|
|
|
|
struct spans_parm_close_rsp {
|
|
spans_atm_conn clrsp_conn; /* Connection identity */
|
|
spans_result clrsp_result; /* Close result */
|
|
};
|
|
|
|
struct spans_parm_close_cnf {
|
|
spans_atm_conn clcnf_conn; /* Connection identity */
|
|
spans_result clcnf_result; /* Close result */
|
|
};
|
|
|
|
struct spans_parm_rclose_req {
|
|
spans_atm_conn rcreq_conn; /* Connection identity */
|
|
};
|
|
|
|
struct spans_parm_rclose_ind {
|
|
spans_atm_conn rcind_conn; /* Connection identity */
|
|
};
|
|
|
|
struct spans_parm_rclose_rsp {
|
|
spans_atm_conn rcrsp_conn; /* Connection identity */
|
|
spans_result rcrsp_result; /* Rclose result */
|
|
};
|
|
|
|
struct spans_parm_rclose_cnf {
|
|
spans_atm_conn rccnf_conn; /* Connection identity */
|
|
spans_result rccnf_result; /* Rclose result */
|
|
};
|
|
|
|
struct spans_parm_multi_req {
|
|
spans_atm_conn mureq_conn; /* Connection identity */
|
|
spans_aal mureq_aal; /* AAL type */
|
|
spans_resrc mureq_desrsrc; /* Desired resources */
|
|
spans_resrc mureq_minrsrc; /* Minimum resources */
|
|
spans_vpvc mureq_vpvc; /* VPI/VCI preference */
|
|
};
|
|
|
|
struct spans_parm_multi_ind {
|
|
spans_atm_conn muind_conn; /* Connection identity */
|
|
spans_aal muind_aal; /* AAL type */
|
|
spans_resrc muind_desrsrc; /* Desired resources */
|
|
spans_resrc muind_minrsrc; /* Minimum resources */
|
|
spans_vpvc muind_vpvc; /* VPI/VCI preference */
|
|
};
|
|
|
|
struct spans_parm_multi_rsp {
|
|
spans_atm_conn mursp_conn; /* Connection identity */
|
|
spans_result mursp_result; /* Multi result */
|
|
spans_resrc mursp_rsrc; /* Allocated resources */
|
|
spans_vpvc mursp_vpvc; /* Allocated VPI/VCI */
|
|
};
|
|
|
|
struct spans_parm_multi_cnf {
|
|
spans_atm_conn mucnf_conn; /* Connection identity */
|
|
spans_result mucnf_result; /* Multi result */
|
|
spans_resrc mucnf_rsrc; /* Allocated resources */
|
|
spans_vpvc mucnf_vpvc; /* Allocated VPI/VCI */
|
|
};
|
|
|
|
struct spans_parm_add_req {
|
|
spans_atm_conn adreq_desconn; /* Desired connection identity */
|
|
spans_atm_conn adreq_xstconn; /* Existing connection identity */
|
|
};
|
|
|
|
struct spans_parm_add_ind {
|
|
spans_atm_conn adind_desconn; /* Desired connection identity */
|
|
spans_atm_conn adind_xstconn; /* Existing connection identity */
|
|
};
|
|
|
|
struct spans_parm_add_rsp {
|
|
spans_atm_conn adrsp_conn; /* Connection identity */
|
|
spans_result adrsp_result; /* Add result */
|
|
spans_resrc adrsp_rsrc; /* Allocated resources */
|
|
};
|
|
|
|
struct spans_parm_add_cnf {
|
|
spans_atm_conn adcnf_conn; /* Connection identity */
|
|
spans_result adcnf_result; /* Add result */
|
|
spans_resrc adcnf_rsrc; /* Allocated resources */
|
|
};
|
|
|
|
struct spans_parm_join_req {
|
|
spans_addr jnreq_addr; /* Group address */
|
|
};
|
|
|
|
struct spans_parm_join_cnf {
|
|
spans_addr jncnf_addr; /* Group address */
|
|
spans_result jncnf_result; /* Join result */
|
|
};
|
|
|
|
struct spans_parm_leave_req {
|
|
spans_addr lvreq_addr; /* Group address */
|
|
};
|
|
|
|
struct spans_parm_leave_cnf {
|
|
spans_addr lvcnf_addr; /* Group address */
|
|
spans_result lvcnf_result; /* Leave result */
|
|
};
|
|
|
|
struct spans_parm_vcir_ind {
|
|
u_int vrind_min; /* Lowest VCI available */
|
|
u_int vrind_max; /* Highest VCI available */
|
|
};
|
|
|
|
struct spans_parm_query_req {
|
|
spans_atm_conn qyreq_conn; /* Conn. being queried */
|
|
spans_query_type qyreq_type; /* Query type */
|
|
};
|
|
|
|
struct spans_parm_query_rsp {
|
|
spans_atm_conn qyrsp_conn; /* Conn. being queried */
|
|
spans_query_type qyrsp_type; /* Query type */
|
|
spans_conn_state qyrsp_state; /* Conn. state */
|
|
u_int qyrsp_data; /* Extra state data */
|
|
};
|
|
|
|
|
|
/*
|
|
* Message Body
|
|
*/
|
|
union spans_msgbody switch (spans_msgtype mb_type) {
|
|
|
|
case SPANS_STAT_REQ: spans_parm_stat_req mb_stat_req;
|
|
case SPANS_STAT_IND: spans_parm_stat_ind mb_stat_ind;
|
|
case SPANS_STAT_RSP: spans_parm_stat_rsp mb_stat_rsp;
|
|
case SPANS_OPEN_REQ: spans_parm_open_req mb_open_req;
|
|
case SPANS_OPEN_IND: spans_parm_open_ind mb_open_ind;
|
|
case SPANS_OPEN_RSP: spans_parm_open_rsp mb_open_rsp;
|
|
case SPANS_OPEN_CNF: spans_parm_open_cnf mb_open_cnf;
|
|
case SPANS_CLOSE_REQ: spans_parm_close_req mb_close_req;
|
|
case SPANS_CLOSE_IND: spans_parm_close_ind mb_close_ind;
|
|
case SPANS_CLOSE_RSP: spans_parm_close_rsp mb_close_rsp;
|
|
case SPANS_CLOSE_CNF: spans_parm_close_cnf mb_close_cnf;
|
|
case SPANS_RCLOSE_REQ: spans_parm_rclose_req mb_rclose_req;
|
|
case SPANS_RCLOSE_IND: spans_parm_rclose_ind mb_rclose_ind;
|
|
case SPANS_RCLOSE_RSP: spans_parm_rclose_rsp mb_rclose_rsp;
|
|
case SPANS_RCLOSE_CNF: spans_parm_rclose_cnf mb_rclose_cnf;
|
|
case SPANS_MULTI_REQ: spans_parm_multi_req mb_multi_req;
|
|
case SPANS_MULTI_IND: spans_parm_multi_ind mb_multi_ind;
|
|
case SPANS_MULTI_RSP: spans_parm_multi_rsp mb_multi_rsp;
|
|
case SPANS_MULTI_CNF: spans_parm_multi_cnf mb_multi_cnf;
|
|
case SPANS_ADD_REQ: spans_parm_add_req mb_add_req;
|
|
case SPANS_ADD_IND: spans_parm_add_ind mb_add_ind;
|
|
case SPANS_ADD_RSP: spans_parm_add_rsp mb_add_rsp;
|
|
case SPANS_ADD_CNF: spans_parm_add_cnf mb_add_cnf;
|
|
case SPANS_JOIN_REQ: spans_parm_join_req mb_join_req;
|
|
case SPANS_JOIN_CNF: spans_parm_join_cnf mb_join_cnf;
|
|
case SPANS_LEAVE_REQ: spans_parm_leave_req mb_leave_req;
|
|
case SPANS_LEAVE_CNF: spans_parm_leave_cnf mb_leave_cnf;
|
|
case SPANS_VCIR_IND: spans_parm_vcir_ind mb_vcir_ind;
|
|
case SPANS_QUERY_REQ: spans_parm_query_req mb_query_req;
|
|
case SPANS_QUERY_RSP: spans_parm_query_rsp mb_query_rsp;
|
|
};
|
|
|
|
|
|
/*
|
|
* Message Format
|
|
*/
|
|
struct spans_msg {
|
|
spans_version sm_vers;
|
|
spans_msgbody sm_body;
|
|
};
|
|
|
|
#ifdef RPC_HDR
|
|
%#define sm_type sm_body.mb_type
|
|
%#define sm_stat_req sm_body.spans_msgbody_u.mb_stat_req
|
|
%#define sm_stat_ind sm_body.spans_msgbody_u.mb_stat_ind
|
|
%#define sm_stat_rsp sm_body.spans_msgbody_u.mb_stat_rsp
|
|
%#define sm_open_req sm_body.spans_msgbody_u.mb_open_req
|
|
%#define sm_open_ind sm_body.spans_msgbody_u.mb_open_ind
|
|
%#define sm_open_rsp sm_body.spans_msgbody_u.mb_open_rsp
|
|
%#define sm_open_cnf sm_body.spans_msgbody_u.mb_open_cnf
|
|
%#define sm_close_req sm_body.spans_msgbody_u.mb_close_req
|
|
%#define sm_close_ind sm_body.spans_msgbody_u.mb_close_ind
|
|
%#define sm_close_rsp sm_body.spans_msgbody_u.mb_close_rsp
|
|
%#define sm_close_cnf sm_body.spans_msgbody_u.mb_close_cnf
|
|
%#define sm_rclose_req sm_body.spans_msgbody_u.mb_rclose_req
|
|
%#define sm_rclose_ind sm_body.spans_msgbody_u.mb_rclose_ind
|
|
%#define sm_rclose_rsp sm_body.spans_msgbody_u.mb_rclose_rsp
|
|
%#define sm_rclose_cnf sm_body.spans_msgbody_u.mb_rclose_cnf
|
|
%#define sm_multi_req sm_body.spans_msgbody_u.mb_multi_req
|
|
%#define sm_multi_ind sm_body.spans_msgbody_u.mb_multi_ind
|
|
%#define sm_multi_rsp sm_body.spans_msgbody_u.mb_multi_rsp
|
|
%#define sm_multi_cnf sm_body.spans_msgbody_u.mb_multi_cnf
|
|
%#define sm_add_req sm_body.spans_msgbody_u.mb_add_req
|
|
%#define sm_add_ind sm_body.spans_msgbody_u.mb_add_ind
|
|
%#define sm_add_rsp sm_body.spans_msgbody_u.mb_add_rsp
|
|
%#define sm_add_cnf sm_body.spans_msgbody_u.mb_add_cnf
|
|
%#define sm_join_req sm_body.spans_msgbody_u.mb_join_req
|
|
%#define sm_join_cnf sm_body.spans_msgbody_u.mb_join_cnf
|
|
%#define sm_leave_req sm_body.spans_msgbody_u.mb_leave_req
|
|
%#define sm_leave_cnf sm_body.spans_msgbody_u.mb_leave_cnf
|
|
%#define sm_vcir_ind sm_body.spans_msgbody_u.mb_vcir_ind
|
|
%#define sm_query_req sm_body.spans_msgbody_u.mb_query_req
|
|
%#define sm_query_rsp sm_body.spans_msgbody_u.mb_query_rsp
|
|
#endif
|
|
|
|
#ifdef RPC_HDR
|
|
%#endif /* _SPANS_SPANS_XDR_H */
|
|
#endif
|