210 lines
8.8 KiB
C
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 */
|