/* $Id: socksys.h,v 1.2 1998/03/26 08:46:07 jj Exp $
 * socksys.h: Definitions for STREAMS modules emulation code.
 *
 * Copyright (C) 1998 Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)
 */

#define MSG_HIPRI	0x01
#define MSG_ANY		0x02
#define MSG_BAND	0x04

#define MORECTL		1
#define MOREDATA	2

#define	TBADADDR		1
#define	TBADOPT			2
#define	TACCES			3
#define TBADF			4
#define TNOADDR			5
#define TOUTSTATE	        6
#define TBADSEQ		        7
#define TSYSERR			8
#define TLOOK		        9
#define TBADDATA	       10
#define TBUFOVFLW	       11
#define TFLOW		       12
#define	TNODATA		       13
#define TNODIS		       14
#define TNOUDERR	       15
#define TBADFLAG	       16
#define TNOREL		       17
#define TNOTSUPPORT	       18
#define TSTATECHNG	       19

#define T_CONN_REQ      0
#define T_CONN_RES      1
#define T_DISCON_REQ    2
#define T_DATA_REQ      3
#define T_EXDATA_REQ    4
#define T_INFO_REQ      5
#define T_BIND_REQ      6
#define T_UNBIND_REQ    7
#define T_UNITDATA_REQ  8
#define T_OPTMGMT_REQ   9
#define T_ORDREL_REQ    10

#define T_CONN_IND      11
#define T_CONN_CON      12
#define T_DISCON_IND    13
#define T_DATA_IND      14
#define T_EXDATA_IND    15
#define T_INFO_ACK      16
#define T_BIND_ACK      17
#define T_ERROR_ACK     18
#define T_OK_ACK        19
#define T_UNITDATA_IND  20
#define T_UDERROR_IND   21
#define T_OPTMGMT_ACK   22
#define T_ORDREL_IND    23

#define T_NEGOTIATE	0x0004
#define T_FAILURE	0x0040

#define TS_UNBND	0	/* unbound */
#define	TS_WACK_BREQ	1	/* waiting for T_BIND_REQ ack  */
#define TS_WACK_UREQ	2	/* waiting for T_UNBIND_REQ ack */
#define TS_IDLE		3	/* idle */
#define TS_WACK_OPTREQ	4	/* waiting for T_OPTMGMT_REQ ack */
#define TS_WACK_CREQ	5	/* waiting for T_CONN_REQ ack */
#define TS_WCON_CREQ	6	/* waiting for T_CONN_REQ confirmation */
#define	TS_WRES_CIND	7	/* waiting for T_CONN_IND */
#define TS_WACK_CRES	8	/* waiting for T_CONN_RES ack */
#define TS_DATA_XFER	9	/* data transfer */
#define TS_WIND_ORDREL	10	/* releasing read but not write */
#define TS_WREQ_ORDREL	11      /* wait to release write but not read */
#define TS_WACK_DREQ6	12	/* waiting for T_DISCON_REQ ack */
#define TS_WACK_DREQ7	13	/* waiting for T_DISCON_REQ ack */
#define TS_WACK_DREQ9	14	/* waiting for T_DISCON_REQ ack */
#define TS_WACK_DREQ10	15	/* waiting for T_DISCON_REQ ack */
#define TS_WACK_DREQ11	16	/* waiting for T_DISCON_REQ ack */
#define TS_NOSTATES	17

struct T_conn_req {
	s32 PRIM_type; 
	s32 DEST_length;
	s32 DEST_offset;
	s32 OPT_length;
	s32 OPT_offset;
};

struct T_bind_req {
	s32 PRIM_type;
	s32 ADDR_length;
	s32 ADDR_offset;
	u32 CONIND_number;
};

struct T_unitdata_req {
	s32 PRIM_type; 
	s32 DEST_length;
	s32 DEST_offset;
	s32 OPT_length;
	s32 OPT_offset;
};

struct T_optmgmt_req {
	s32 PRIM_type; 
	s32 OPT_length;
	s32 OPT_offset;
	s32 MGMT_flags;
};

struct T_bind_ack {
	s32 PRIM_type;
	s32 ADDR_length;
	s32 ADDR_offset;
	u32 CONIND_number;
};

struct T_error_ack {
	s32 PRIM_type;
	s32 ERROR_prim;
	s32 TLI_error;
	s32 UNIX_error;
};

struct T_ok_ack {
	s32 PRIM_type;
	s32 CORRECT_prim;
};

struct T_conn_ind {
	s32 PRIM_type;
	s32 SRC_length;
	s32 SRC_offset;
	s32 OPT_length;
	s32 OPT_offset;
	s32 SEQ_number;
};

struct T_conn_con {
	s32 PRIM_type;
	s32 RES_length;
	s32 RES_offset;
	s32 OPT_length;
	s32 OPT_offset;
};

struct T_discon_ind {
	s32 PRIM_type;
	s32 DISCON_reason;
	s32 SEQ_number;
};

struct T_unitdata_ind {
	s32 PRIM_type;
	s32 SRC_length;
	s32 SRC_offset;
	s32 OPT_length;
	s32 OPT_offset;
};

struct T_optmgmt_ack {
	s32 PRIM_type; 
	s32 OPT_length;
	s32 OPT_offset;
	s32 MGMT_flags;
};

struct opthdr {
	s32 level;
	s32 name;
	s32 len;
	char value[0];	
};

struct T_primsg {
	struct T_primsg *next;
	unsigned char pri;
	unsigned char band;
	int length;
	s32 type;
};

struct strbuf {
	s32 maxlen;
	s32 len;
	u32 buf;
} ;

/* Constants used by STREAMS modules emulation code */

typedef char sol_module;

#define MAX_NR_STREAM_MODULES   16

/* Private data structure assigned to sockets. */

struct sol_socket_struct {
        int magic;
        int modcount;
        sol_module module[MAX_NR_STREAM_MODULES];
        long state;
        int offset;
        struct T_primsg *pfirst, *plast;
};

#define SOLARIS_SOCKET_MAGIC    0xADDED