/* Definitions for the C interface to the DECnet LAT protocol */
/* Part of DEC PathWorks 2.0 for OS/2 */

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define def_num_sessions	4		/* default number of sessions */
#define max_num_sessions	10		/* maximum number of sessions */
#define min_num_sessions	4		/* minimum number of sessions */

#define def_num_buffers		4		/* default number of buffers */
#define max_num_buffers		8		/* maximum number of buffers */
#define min_num_buffers		2		/* minimun number of buffers */

#define def_num_services	50		/* default number of services */
#define max_num_services	2048		/* maximum number of services */
#define min_num_services	10		/* minimum number of services */

#define def_num_retx		8		/* default number of retransmit */
#define max_num_retx		255		/* maximum number of retransmit */
#define min_num_retx		4		/* minimum number of retransmit */

#define SEND_CHAR	1		/* send a character */
#define GET_CHAR	2		/* read a character */
#define GET_CHAR_BLK	3		/* read a block of characters */
#define GET_STATUS	4		/* slot status */
#define START_SESSION	5		/* start a session */
#define	START_SESS_PSW	6		/* start a session with specified password */
#define STOP_SESSION	7		/* stop a session */
#define SEND_BREAK	8		/* send a break signal */
#define ADD_PREFER_NODE	9		/* add preferred node */
#define DEL_PREFER_NODE 10		/* delete preferred node */
#define RESET_COUNTERS	11		/* reset lat counter */
#define READ_COUNTERS	12		/* read lat internal counters */
#define RESET_SERVICES	13		/* reset service index */
#define READ_SERVICES	14		/* read a service entry */
#define READ_SCB	15		/* read all of the scbs */
#define READ_VCB	16		/* read all of the vcbs */
#define READ_LMCB	17		/* read the lmcb */
#define READ_LATINFO	18		/* read lat info */
#define READ_SERVICE_ENTRY 19		/* read service entry info */
#define SET_RETX_LIMIT	20		/* set retransmit limit in lmcb */
#define SET_MULTI_STATE	21		/* set the state of the multicast receiver */
#define SET_GROUP_CODE	22		/* enable a specific group code	 */
#define CLEAR_GROUP_CODE 23		/* clear a specific group code	*/

/* Bit defination of LatStatus in LAT_CB */
#define LS_NoError		0x0000		/* No error for this function */
#define LS_NoChar		0x8000		/* No character read */
#define LS_CharNotSent		0x8000		/* Character not sent */
#define LS_BrkNotSent		0x8000		/* Break not sent */
#define LS_NotInRun		0x4000		/* Slot session not in run state */
#define LS_TxBufEmpty		0x2000		/* Transmit buffer empty */
#define LS_InvalidSize		0x1000		/* Bad size specified */
#define LS_SesStart		0x0800		/* Session in starting state */
#define LS_InvalidHdl		0x0400		/* Invalid session handle */
#define LS_NoMoreSession 	0x0400		/* No more slot session available */
#define LS_TxBufBusy		0x0200		/* Unable to queue transmit data */
#define LS_NoCircuit		0x0200		/* No more virtual circuit */
#define LS_RxData		0x0100		/* Receive data available */
#define LS_NoService		0x0100		/* Service name not found */
#define LS_NoMoreService	0x0080		/* no more new service */
#define LS_NoDLL		0x0040		/* No DLL handle	*/
#define LS_OtherError		0x0020		/* another error has happened */
#define LS_IllegalFnc		0xFFFF		/* illegal function */

/* LAT_CB Session Status Word */
#define SS_TxBufBusy		0x00		/* Slot session tx buffer busy */
#define SS_Stopped		0x08		/* Slot session stopped! */
#define SS_HostStop		0x10		/* Host sent stop slot */

#define IS_InitOK		0x0001		/* LAT driver init'ed */
#define IS_SessionErr		0x0002		/* Session specifier error */
#define IS_BufferErr		0x0004		/* Buffer specifier error */
#define IS_ServiceErr		0x0008		/* Service specifier error */
#define IS_ReTxErr		0x0010		/* Retransmit specifier error */
#define IS_GetMemErr		0x0800		/* Allocate memory error */
#define IS_LatPortailFailed	0x2000		/* Unable to open LAT portal */
#define IS_NeedDll		0x4000		/* DLL driver needed */
#define IS_AlreadyInit		0x8000		/* LAT driver already init'ed */

struct  lat_init {
    uint	MaxSessions;		/* Maximum number of slot sessions */
    uint	MaxBuffers;		/* Maximum number of buffers per session */
    uint	MaxServices;		/* Maximum number of services */
    uint	ReTxLimit;		/* Retransmit limit */
    uint	InitStatus;		/* Initialization status */
};

struct  lat_info {
    uchar	vermjr;
    uchar	vermir;
    uint	NSessions;
    uint	NBuffers;
    uint	NServices;
    uint	scbsize;
};

struct service_info {
    uchar	node_leng;		/* node name length */
    uchar	node_name[16];		/* node name string */
    uchar	node_addr[6];		/* node address */
    uchar	node_status;		/* node status */
    uchar	serv_rate;		/* service rating */
    uchar	serv_leng;		/* service length */
    uchar	serv_name[16];		/* service string */
    uchar	serv_status;		/* service status */
};

struct	scb_info {
    uint	scb_inuse;		/* scb inuse flag */
    uint	reserved1;		/* reserved */
    uint	reserved2;		/* reserved */
};

struct	lat_cb	{
    uchar	LatFunction;		/* function code */
    uint	SessionHandle;		/* lat handle */
    uint	SessionStatus;		/* Session status */
    uint	StopReason;		/* Stop reason */
    uint	BufferSize;		/* size of buffer */
    ulong	*BufferPtr;		/* pointer to buffer */
    ulong	WaitTime;		/* waiting time */
    uchar	CharByte;		/* I/O character */
    uint	LatStatus;		/* function returned status */
};

struct lat_count {
    uint	n_count;	/* number of counters */
    uint	ids[12];
    ulong	c1;
    ulong	c2;
    ulong	c3;
    ulong	c4;
    ulong	c5;
    ulong	c6;
    ulong	c7;
    ulong	c8;
    ulong	c9;
    ulong	c10;
    ulong	c11;
    ulong	c12;
    ulong	c13;
    ulong	c14;
};


struct	lat_counter
{
    ulong	second_since_zeroed;
    ulong	messages_transmitted;
    ulong	messages_received;
    ulong	messages_retransmitted;
    ulong	out_of_seq_mess_received;
    ulong	illegal_messages_received;
    ulong	illegal_slots_received;
    ulong	buf_que_entry_unavailable;
    ulong	transmit_buffer_unavailable;
    ulong	invalid_messages_received;
    ulong	invalid_slot_received;
    ulong	invalid_multicast_received;
};

struct	lmcb_struct {
    uchar	lat_mess_retrans_limit;		/* retransmit limit */
    uchar	group_enable[32];		/* group code */
    uchar	num_active_circuit;		/* number of active circuits */
    uchar	num_active_session;		/* number of active sessions */
    uint	lat_min_rcv_datagram_size;	/* minimun datagram size */
    uchar	protocol_version;		/* protocol version */
    uchar	protocol_eco;
    uchar	max_sim_slots;			/* maximum slots on this circuit */
    uchar	nbr_dl_bufs;			/* number of datalink buffers minus 1 */
    uchar	server_circuit_timer;		/* data transfer timer */
    uchar	lat_keep_alive_timer;		/* keep alive timer (sec)*/
    uint	facility_number;		/* Not used */
    uint	product_code;			/* PC LAT server assigned code */
    uchar	server_retransmit_timer;	/* unacked retransmit timer(sec) */
    uchar	lat_min_rcv_slot_size;		/* minimum slot size */
    uchar	lat_min_rcv_att_slot_size;	/* minimum attention slot size */
    uchar	server_name_len;		/* lat server name length */
    uchar	server_name[16];		/* lat server name */
 };

struct	service_entry {
    uint	node_pointer;
    uchar	service_rating;
    uchar	service_name_len;
    uchar	service_name[16];
    uchar	service_status_flags;
};

struct	node_entry {
    uchar	node_name_len;
    uchar	node_name[16];
    uchar	node_address[6];
    uchar	status_flag;
    uchar	msg_incarnation;
    uchar	node_change_flags;
};

struct	vcb_struct {
    uint	vc_state;			/* VC state 		*/
    uchar	circuit_name[18];		/* circuit name 	*/
    uchar	vc_type;			/* DCB type		*/
    uchar	vc_format;			/* FORMAT of portal	*/
    uchar	rem_address[6];			/* Remote adapter address */
    uchar	loc_address[6];			/* local adapter address  */
    uint	cp_typ;				/* Protocol type	  */
    uint	cpad;				/* padding		  */
    uchar	cctl;				/* mo' paddin'		  */
    uchar	cp_ident[5];			/* even mo' paddin'	  */
    uint	cportal_id;			/* portal number	  */
    ulong	unacked_xmtb;			/* unacked message */
    uint	unacked_xmtb_len;
    uchar	param_len[5];			/* even mo' paddin'	  */
    uchar	msg_typ;			/* message type */
    uint	loc_cir_id;			/* local circuit ID */
    uint	rem_cir_id;			/* remote circuit ID */
    uchar	nxmt;				/* next message number to tx */
    uchar	ack;				/* most recent message acked */
    uchar	rrf;				/* response request flag */
    uchar	dwf;				/* data waiting flag */
    uchar	vc_status;			/* number of sessions */
    uint	slot_index;			/* index to first slot session on this circ */
    uint	last_xmit;			/* index to last slot tx'ed on this circuit */
    uchar	retransmit_counter;		/* retransmits on this message */
    uchar	uxmt;				/* unack'ed message # */
    uchar	retransmit_timer_on;		/* re-transmit timer turned on */
    uchar	retransmit_timer;		/* count down for retransmit */
    uchar	balanced_mode_on;		/* balance mode active flag */
    uint	balanced_mode_timer;		/* tick counts for lat_keep_alive */
    uint	max_buf_size;			/* max tx buffer size */
    uchar	max_circuit_sessions;		/* max circuits */
    uint	disconnect_reason;		/* disconnect reason */
};

struct	scb_struct {
    uchar	service[18];			/* service name */
    uchar	node[18];
    uchar	port[18];
    ulong	scb_sem;			/**/
    uint	session_status;			/* session status word */
    uint	stop_reason;			/* session stop reason */
    uint	slot_state;			/* slot state 0=halted */
    uchar	local_credits;			/* available credits to tx slots */
    uint	vcb_offset;
    uint	vcb_segment;
    uint	back_slot;			/* index to back slot on this circ */
    uint	forward_slot;			/* index to forward slot */
    uchar	rem_slot_id;			/* remote slot connect ID */
    uchar	loc_slot_id;			/* local slot ID */
    uchar	slot_byte_count;		/* number of bytes in tx_slot_data */
    uchar	remote_credits;			/* credits from remote node */
    uchar 	tx_slot_data[255];		/* data to be tx'ed */
    uchar	num_slots;			/* number of slots in this buffer */
    uchar	num_occupied;			/* number of slots in use */
    uchar	next_rx_slot;			/* index to next slot to be used */
    uchar	cur_buf_slot;			/* index to current slot in use */
    uint	rx_slot_pntr;			/* offset to next char to be taken */
    uint	slot_ptr_table[2];		/* pointers to the slots */
};

struct flagbits {
    unsigned SW_duplicate : 1;
    unsigned SW_invalid_value : 1;
    unsigned SW_found : 1;
};

struct SIB {
    char schar;		/* switch character */
    int value;		/* switch value */
    int defv;		/* default value */
    int minv;		/* min value */
    int maxv;		/* max value */
    struct flagbits flags;		/* switch status flags */
};

struct decnode {
	unsigned char decnode_flags;
	unsigned int decnode_address;
	char decnode_name[7];
	long decnode_pointer;
	};


