fis-gtm/sr_port/ddphdr.h

210 lines
8.8 KiB
C

/****************************************************************
* *
* Copyright 2001, 2003 Sanchez Computer Associates, Inc. *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#ifndef DDPHDR_H_INCLUDED
#define DDPHDR_H_INCLUDED
typedef int4 condition_code;
#define MAX_ETHER_DATA_SIZE 1500
#define ETHERNET_HEADER_SIZE 14 /* Is size of Destination address + source address + protocol # */
#define ETHERADDR_LENGTH 6
#define MIN_ETH_RECV_BUFCNT 1 /* from OpenVMS I/O User's Reference Manual, system default */
#define MAX_ETH_RECV_BUFCNT 255 /* from OpenVMS I/O User's Reference Manual */
#define ETH_RCV_BUFCNT 64 /* GT.CM DDP default */
#define DDP_ETH_PROTO_TYPE ((unsigned short)0x3980) /* will be seen as 8039 on the wire */
#define DDP_MIN_MSG_LEN 64
#define DDP_PROTO_VERSION 0x02 /* MSM, DSM-11 use version 2; DSM 6.0 & 6.1, DDP-DOS V1.00.8+ use version 4 */
#define DDP_MSG_TERMINATOR 0xff
#define DDP_CIRCUIT_NAME_LEN 3
#define DDP_VOLUME_NAME_LEN 3
#define DDP_UCI_NAME_LEN 3
/* Request codes */
#define DDPTR_USEREXIT 0x00 /* [00] */ /* Individual user sends message to agent to clean up for exit. Per DSM doc,
* this code is for an ERROR ON RRB (read request buffer) */
#define DDPTR_LOCK 0x02 /* [02] */ /* Not implemented */
#define DDPTR_UNLOCK 0x04 /* [04] */ /* Not implemented */
#define DDPTR_ZALLOC 0x06 /* [06] */
#define DDPTR_ZDEALLOC 0x08 /* [08] */
#define DDPTR_GET 0x0a /* [10] */
#define DDPTR_PUT 0x0c /* [12] */
#define DDPTR_KILL 0x0e /* [14] */
#define DDPTR_ORDER 0x10 /* [16] */
#define DDPTR_QUERY 0x12 /* [18] */
#define DDPTR_DEFINE 0x14 /* [20] */
#define DDPTR_PREVIOUS 0x16 /* [22] */
#define DDPTR_JOB 0x18 /* [24] */ /* Not implemented */
#define DDPTR_RESPONSE 0x1a /* [26] */
#define DDPTR_ERRESPONSE 0x1c /* [28] */
#define DDPTR_RDRQBUF 0x1e /* [30] */ /* READ REQUEST BUFFER, not implemented */
#define DDPTR_ANNOUNCE 0x20 /* [32] */
/* Response codes other than DDPTR_RESPONSE and DDPTR_ERRESPONSE */
#define DDPTRX_ANNOUNCE 0x80 /* [128] */ /* Announcement that we are connecting */
#define DDPTRX_NOCONNECT 0x81 /* [129] */ /* Named volume set not connected */
#define DDPTRX_CONGESTION 0x82 /* [130] */ /* Agent congestion */
#define DDPTRX_RUNDOWN 0x83 /* [131] */ /* Client wishes to disconnect */
#define DDPTRX_SHUTDOWN 0x84 /* [132] */ /* Shutdown the server */
#define DDPTRX_DUMP 0x85 /* [133] */ /* Start trace */
/* GT.M extended reference form is ^|"globaldirectory"|global, DSM is ^["UCI","VOL"]global */
#define GTM_EXTREF_PREFIX "^|\""
#define GTM_EXTREF_SUFFIX "\"|"
#define DSM_EXTREF_PREFIX "^[\""
#define DSM_UCI_VOL_SEPARATOR "\",\""
#define DSM_EXTREF_SUFFIX "\"]"
#define DSM_EXTREF_FORM_LEN (STR_LIT_LEN(DSM_EXTREF_PREFIX) + \
DDP_UCI_NAME_LEN + \
STR_LIT_LEN(DSM_UCI_VOL_SEPARATOR) + \
DDP_VOLUME_NAME_LEN + \
STR_LIT_LEN(DSM_EXTREF_SUFFIX))
#define DDP_VOLSET_CONF_LOGICAL_PREFIX "GTMDDP_VOLCONF_"
#define DDP_GROUP_LOGICAL_PREFIX "GTMDDP_GROUPS_"
#define DDP_ETHER_DEV_PREFIX "GTMDDP_CONTROLLER_"
#define DDP_MAXRECSIZE_PREFIX "GTMDDP_MAXRECSIZE_"
#define DDP_ETH_RCV_BUFCNT_PREFIX "GTMDDP_ETHRCVBUFCNT_"
#define DDP_MAXREQCREDITS_PREFIX "GTMDDP_MAXREQCREDITS_"
#define DDP_CLIENT_CKTNAM_LOGI "GTMDDP_CIRCUIT_NAME"
#define DDP_MAX_VOLSETS 16
#define DDP_TEXT_ID_LENGTH 3
#define DDP_ANNOUNCE_CODE_LEN 2 /* "WI" or "II" */
#define MAXIMUM_PROCESSES 256
#define DDP_MAX_GROUP 16
#define DDP_DEFAULT_GROUP_MASK 0x0001 /* member of group 0 */
#define DDP_MIN_RECSIZE 1024
#define DDP_LEAST_MAXREQCREDITS 1
#define DDP_LARGEST_MAXREQCREDITS 0xFF
/* some constants that were derived from DSM packets */
#define DDP_GROUP_MASK 0x0101
#define DDP_ADVERTISE_INTERVAL 0x00
#define DDP_MAX_REQUEST_CREDITS 0x04
#define DDP_CPU_TYPE 0x01
#define DDP_SOFTWARE_VERSION 0x00
#define DDP_CPU_LOAD_RATING 0x00
#define DDP_AUTOCONFIGURE_VERSION 0x02
#define DDP_ANNOUNCE_FILLER3_LITERAL 0x01ff00ff
#define DDP_GLOBAL_TYPE 0x02
/* DDP node status bit masks */
#define DDP_NODE_STATUS_READ 0x01 /* bit is 1 if read locked, 0 if read enabled */
#define DDP_NODE_STATUS_WRITE 0x02 /* bit is 1 if write locked, 0 if write enabled */
#define DDP_NODE_STATUS_STATE 0x04 /* bit is 1 if unreachable, 0 if reachable */
#define DDP_NODE_STATUS_CHANGE 0x10 /* bit is 1 if state change occurred on circuit */
#define DDP_NODE_STATUS_DISABLED 0x20 /* bit is 1 if disabled, 0 if enabled */
#define DDP_NODE_STATUS_ALL_CLEAR 0x00 /* read enabled + write enabled + reachable + no state change + circuit enabled */
#define DDP_LOG_ERROR(err_len, err_string) \
{ \
now_t now; /* for GET_CUR_TIME macro */ \
char time_str[CTIME_BEFORE_NL + 2]; /* for GET_CUR_TIME macro*/ \
char *time_ptr; /* for GET_CUR_TIME macro*/ \
bool save_dec_nofac; \
\
GET_CUR_TIME; \
save_dec_nofac = dec_nofac; /* save for later restore */ \
dec_nofac = TRUE; /* don't need error mnemonic prefix, just print the message contents */ \
dec_err(VARLSTCNT(6) ERR_DDPLOGERR, 4, CTIME_BEFORE_NL, time_ptr, (err_len), (err_string)); \
dec_nofac = save_dec_nofac; /* back to what it was */ \
}
/* All structures that are DDP messages should be packed; do not let the compiler pad for structure member alignment */
#if defined(__alpha)
# pragma member_alignment save
# pragma nomember_alignment
#endif
typedef struct
{
unsigned short uci;
unsigned short volset;
} ddp_info;
typedef struct
{
unsigned char trancode;
unsigned char proto;
unsigned short source_circuit_name; /* 5-bit format */
unsigned short source_job_number;
unsigned short remote_circuit_name; /* 5-bit format */
unsigned short remote_job_number; /* 0000 if this is a request */
unsigned char message_number;
unsigned char filler1; /* literal 00 */
unsigned short message_length;
unsigned char hdrlen;
unsigned char txt[1];
} ddp_hdr_t;
#define DDP_MSG_HDRLEN 0x0f /* excluding txt field of ddp_hdr_t */
struct frame_hdr
{
unsigned short frame_length;
unsigned char destination_address[ETHERADDR_LENGTH];
unsigned char source_address[ETHERADDR_LENGTH];
unsigned char protocol_type[2];
};
struct in_buffer_struct
{
struct frame_hdr fh;
ddp_hdr_t dh;
};
typedef struct
{ /* byte position in announce packet - 15 is the first position past the header, position starts from 0, header size is 15 bytes */
unsigned short filler0; /* position 15: literal 0x0000 */
unsigned char code[DDP_ANNOUNCE_CODE_LEN]; /* position 17: "WI", or "II" */
unsigned char ether_addr[ETHERADDR_LENGTH]; /* position 19: Ethernet physical address for this node */
unsigned short circuit_name; /* position 25: DDP Node (circuit) name */
unsigned short filler1; /* position 27: reserved for possible name extension */
unsigned short filler2; /* position 29: reserved for possible name extension */
unsigned short max_job_no; /* position 31: max job # */
unsigned short group_mask; /* position 33: DDP group number mask */
unsigned char advertise_interval; /* position 35: Advertise interval in seconds */
unsigned char max_request_credits; /* position 36: Maximum request credits */
unsigned char cpu_type; /* position 37: Remote CPU type */
unsigned char version; /* position 38: Version of software */
unsigned char cpu_load_rating; /* position 39: CPU load rating */
unsigned char proto_version; /* position 40: DDP protocol version in use */
unsigned char node_status; /* position 41: see comments re: DDP_NODE_STATUS_* */
unsigned char autoconfigure_version; /* position 42: DDP autoconfigure version */
unsigned short volset[DDP_MAX_VOLSETS]; /* position 43: 5 bit formal volset names */
/******************************************* begin unknown **************************************************/
unsigned char filler3[32 + 4 + 8]; /* position 75: at position 107 we write literal 0x01ff00ff */
/******************************************* end unknown **************************************************/
unsigned char terminator; /* position 119: DDP_MSG_TERMINATOR */
} ddp_announce_msg_t;
#define DDP_ANNOUNCE_MSG_LEN 105 /* from ddp_announce_msg_t */
typedef struct
{
unsigned char naked_size;
unsigned short uci;
unsigned short vol;
unsigned char global_type;
unsigned char global_len;
unsigned char global[1]; /* actually, global_len bytes of formatted global reference */
} ddp_global_request_t; /* immediately follows the message header (ddp_hdr) for global request. For SET, ASCII value follows */
#if defined(__alpha)
# pragma member_alignment restore
#endif
#endif /* DDPHDR_H_INCLUDED */