xref: /csrg-svn/sys/netiso/tp_param.h (revision 37469)
136407Ssklower /***********************************************************
236407Ssklower 		Copyright IBM Corporation 1987
336407Ssklower 
436407Ssklower                       All Rights Reserved
536407Ssklower 
636407Ssklower Permission to use, copy, modify, and distribute this software and its
736407Ssklower documentation for any purpose and without fee is hereby granted,
836407Ssklower provided that the above copyright notice appear in all copies and that
936407Ssklower both that copyright notice and this permission notice appear in
1036407Ssklower supporting documentation, and that the name of IBM not be
1136407Ssklower used in advertising or publicity pertaining to distribution of the
1236407Ssklower software without specific, written prior permission.
1336407Ssklower 
1436407Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
1536407Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
1636407Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
1736407Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
1836407Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
1936407Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
2036407Ssklower SOFTWARE.
2136407Ssklower 
2236407Ssklower ******************************************************************/
2336407Ssklower 
2436407Ssklower /*
2536407Ssklower  * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
2636407Ssklower  */
2736407Ssklower /*
2836407Ssklower  * ARGO TP
2936407Ssklower  *
3036407Ssklower  * $Header: tp_param.h,v 5.3 88/11/18 17:28:18 nhall Exp $
3136407Ssklower  * $Source: /usr/argo/sys/netiso/RCS/tp_param.h,v $
3236407Ssklower  *
3336407Ssklower  */
3436407Ssklower 
3536407Ssklower #ifndef __TP_PARAM__
3636407Ssklower #define __TP_PARAM__
3736407Ssklower 
3836407Ssklower 
3936407Ssklower /******************************************************
4036407Ssklower  * compile time parameters that can be changed
4136407Ssklower  *****************************************************/
4236407Ssklower 
4336407Ssklower #define 	TP_CLASSES_IMPLEMENTED 0x11 /* zero and 4 */
4436407Ssklower 
4536407Ssklower #define		TP_DECBIT_CLEAR_COUNT	3
4636407Ssklower 
4736407Ssklower #define 	N_TPREF				100
4836407Ssklower 
49*37469Ssklower #define 	TP_SOCKBUFSIZE		((u_long)4096)
50*37469Ssklower #define 	TP0_SOCKBUFSIZE		((u_long)512)
5136407Ssklower #define		MAX_TSAP_SEL_LEN	64
5236407Ssklower 
5336407Ssklower /* maximum tpdu size we'll accept: */
5436407Ssklower #define 	TP_TPDUSIZE			0xc		/* 4096 octets for classes 1-4*/
5536407Ssklower #define 	TP0_TPDUSIZE		0xb		/* 2048 octets for class 0 */
5636407Ssklower #define 	TP_DFL_TPDUSIZE		0x7		/* 128 octets default */
5736407Ssklower 	/* NOTE: don't ever negotiate 8192 because could get
5836407Ssklower 	 * wraparound in checksumming
5936407Ssklower 	 * (No mtu is likely to be larger than 4K anyway...)
6036407Ssklower 	 */
6136407Ssklower #define		TP_NRETRANS			1
6236407Ssklower #define		TP_MAXPORT			0xefff
6336407Ssklower 
6436407Ssklower #define		TP_RTT_NUM			0x7
6536407Ssklower /* ALPHA: to be used in the context: gain= 1/(2**alpha), or
6636407Ssklower  * put another way, gaintimes(x) (x)>>alpha (forgetting the case alpha==0)
6736407Ssklower  */
6836407Ssklower #define 	TP_RTT_ALPHA		3
6936407Ssklower #define 	TP_RTV_ALPHA		2
7036407Ssklower 
7136407Ssklower /*
7236407Ssklower  * not sure how to treat data on disconnect
7336407Ssklower  */
7436407Ssklower #define 	T_CONN_DATA			0x1
7536407Ssklower #define 	T_DISCONNECT		0x2
7636407Ssklower #define 	T_DISC_DATA			0x4
7736407Ssklower #define 	T_XDATA				0x8
7836407Ssklower 
7936407Ssklower #define ISO_CLNS	 0
8036407Ssklower #define IN_CLNS	 	 1
8136407Ssklower #define ISO_CONS	 2
8236407Ssklower #define ISO_COSNS	 3
8336407Ssklower #define TP_MAX_NETSERVICES 3
8436407Ssklower 
8536407Ssklower /* Indices into tp stats ackreason[i] */
8636407Ssklower #define _ACK_DONT_ 0
8736407Ssklower #define _ACK_STRAT_EACH_ 0x1
8836407Ssklower #define _ACK_STRAT_FULLWIN_ 0x2
8936407Ssklower #define _ACK_DUP_ 0x3
9036407Ssklower #define _ACK_EOT_ 0x4
9136407Ssklower #define _ACK_REORDER_ 0x5
9236407Ssklower #define _ACK_USRRCV_ 0x6
9336407Ssklower #define _ACK_FCC_ 0x7
9436407Ssklower #define _ACK_NUM_REASONS_ 0x8
9536407Ssklower 
9636407Ssklower /* masks for use in tp_stash() */
9736407Ssklower #define ACK_DONT 			0
9836407Ssklower #define ACK_STRAT_EACH		(1<< _ACK_STRAT_EACH_)
9936407Ssklower #define ACK_STRAT_FULLWIN	(1<< _ACK_STRAT_FULLWIN_)
10036407Ssklower #define ACK_DUP 			(1<< _ACK_DUP_)
10136407Ssklower #define ACK_EOT				(1<< _ACK_EOT_)
10236407Ssklower #define ACK_REORDER			(1<< _ACK_REORDER_)
10336407Ssklower 
10436407Ssklower /******************************************************
10536407Ssklower  * constants used in the protocol
10636407Ssklower  *****************************************************/
10736407Ssklower 
10836407Ssklower #define		TP_VERSION 			0x1
10936407Ssklower 
11036407Ssklower #define 	TP_MAX_HEADER_LEN	256
11136407Ssklower 
11236407Ssklower #define 	TP_MIN_TPDUSIZE		0x7		/* 128 octets */
11336407Ssklower #define 	TP_MAX_TPDUSIZE		0xd		/* 8192 octets */
11436407Ssklower 
11536407Ssklower #define		TP_MAX_XPD_DATA		0x10	/* 16 octets */
11636407Ssklower #define		TP_MAX_CC_DATA		0x20	/* 32 octets */
11736407Ssklower #define		TP_MAX_CR_DATA		TP_MAX_CC_DATA
11836407Ssklower #define		TP_MAX_DR_DATA		0x40	/* 64 octets */
11936407Ssklower 
12036407Ssklower #define		TP_XTD_FMT_BIT 	0x80000000
12136407Ssklower #define		TP_XTD_FMT_MASK	0x7fffffff
12236407Ssklower #define		TP_NML_FMT_BIT 	0x80
12336407Ssklower #define		TP_NML_FMT_MASK	0x7f
12436407Ssklower 
12536407Ssklower /*
12636407Ssklower  * values for the tpdu_type field, 2nd byte in a tpdu
12736407Ssklower  */
12836407Ssklower 
12936407Ssklower #define TP_MIN_TPDUTYPE 0x1
13036407Ssklower 
13136407Ssklower #define XPD_TPDU_type	0x1
13236407Ssklower #define XAK_TPDU_type	0x2
13336407Ssklower #define GR_TPDU_type	0x3
13436407Ssklower #define AK_TPDU_type	0x6
13536407Ssklower #define ER_TPDU_type	0x7
13636407Ssklower #define DR_TPDU_type	0x8
13736407Ssklower #define DC_TPDU_type	0xc
13836407Ssklower #define CC_TPDU_type	0xd
13936407Ssklower #define CR_TPDU_type	0xe
14036407Ssklower #define DT_TPDU_type	0xf
14136407Ssklower 
14236407Ssklower #define TP_MAX_TPDUTYPE 0xf
14336407Ssklower 
14436407Ssklower /*
14536407Ssklower  * identifiers for the variable-length options in tpdus
14636407Ssklower  */
14736407Ssklower 
14836407Ssklower #define		TPP_acktime			0x85
14936407Ssklower #define		TPP_residER			0x86
15036407Ssklower #define		TPP_priority		0x87
15136407Ssklower #define		TPP_transdelay		0x88
15236407Ssklower #define		TPP_throughput		0x89
15336407Ssklower #define		TPP_subseq			0x8a
15436407Ssklower #define		TPP_flow_cntl_conf	0x8c	/* not implemented */
15536407Ssklower #define		TPP_addl_info		0xe0
15636407Ssklower #define		TPP_tpdu_size		0xc0
15736407Ssklower #define		TPP_calling_sufx	0xc1
15836407Ssklower #define		TPP_invalid_tpdu	0xc1	/* the bozos used a value twice */
15936407Ssklower #define		TPP_called_sufx		0xc2
16036407Ssklower #define		TPP_checksum		0xc3
16136407Ssklower #define		TPP_vers			0xc4
16236407Ssklower #define		TPP_security		0xc5
16336407Ssklower #define		TPP_addl_opt		0xc6
16436407Ssklower #define		TPP_alt_class		0xc7
16536407Ssklower #define		TPP_perf_meas		0xc8	/* local item : perf meas on, svp */
16636407Ssklower 
16736407Ssklower /******************************************************
16836407Ssklower  * Some fundamental data types
16936407Ssklower  *****************************************************/
17036407Ssklower #ifndef		TRUE
17136407Ssklower #define		TRUE				1
17236407Ssklower #endif		TRUE
17336407Ssklower 
17436407Ssklower #ifndef		FALSE
17536407Ssklower #define		FALSE				0
17636407Ssklower #endif		FALSE
17736407Ssklower 
17836407Ssklower #define		TP_LOCAL				22
17936407Ssklower #define		TP_FOREIGN				33
18036407Ssklower 
18136407Ssklower #ifndef 	EOK
18236407Ssklower #define 	EOK 	0
18336407Ssklower #endif  	EOK
18436407Ssklower 
18536407Ssklower #define 	TP_CLASS_0 	(1<<0)
18636407Ssklower #define 	TP_CLASS_1 	(1<<1)
18736407Ssklower #define 	TP_CLASS_2 	(1<<2)
18836407Ssklower #define 	TP_CLASS_3 	(1<<3)
18936407Ssklower #define 	TP_CLASS_4 	(1<<4)
19036407Ssklower 
19136407Ssklower #define 	TP_FORCE 	0x1
19236407Ssklower #define 	TP_STRICT 	0x2
19336407Ssklower 
19436407Ssklower #ifndef 	MNULL
19536407Ssklower #define 	MNULL				(struct mbuf *)0
19636407Ssklower #endif 	MNULL
19736407Ssklower 	/* if ../h/mbuf.h gets MT_types up to 0x40, these will
19836407Ssklower 	 * have to be changed:
19936407Ssklower 	 */
20036407Ssklower #define 	MT_XPD 				0x44
20136407Ssklower #define 	MT_EOT 				0x40
20236407Ssklower 
20336407Ssklower #define		TP_ENOREF			0x80000000
20436407Ssklower 
20536407Ssklower typedef 	unsigned int	SeqNum;
20636407Ssklower typedef		unsigned short	RefNum;
20736407Ssklower typedef		int				ProtoHook;
20836407Ssklower 
20936407Ssklower 
21036407Ssklower /******************************************************
21136407Ssklower  * Some fundamental constants
21236407Ssklower  *****************************************************/
21336407Ssklower 
21436407Ssklower #define TP_MIN_WIN	2048
21536407Ssklower #define TP_MAX_WIN 16384
21636407Ssklower #define TP_MAX_WIN_UNPRIV 8192
21736407Ssklower 
21836407Ssklower /******************************************************
21936407Ssklower  * Macro used all over, for driver
22036407Ssklower  *****************************************************/
22136407Ssklower 
22236407Ssklower #define  DoEvent(x) \
22336407Ssklower   ((E.ev_number=(x)),(tp_driver(tpcb,&E)))
22436407Ssklower 
22536407Ssklower /******************************************************
22636407Ssklower  * Some macros used all over, for timestamping
22736407Ssklower  *****************************************************/
22836407Ssklower 
22936407Ssklower #define GET_CUR_TIME(tvalp) ((*tvalp) = time)
23036407Ssklower 
23136407Ssklower #define GET_TIME_SINCE(oldtvalp, diffp) {\
23236407Ssklower 	(diffp)->tv_sec = time.tv_sec - (oldtvalp)->tv_sec;\
23336407Ssklower 	(diffp)->tv_usec = time.tv_usec - (oldtvalp)->tv_usec;\
23436407Ssklower 	if( (diffp)->tv_usec <0 ) {\
23536407Ssklower 		(diffp)->tv_sec --;\
23636407Ssklower 		(diffp)->tv_usec = 1000000 - (diffp)->tv_usec;\
23736407Ssklower 	}\
23836407Ssklower }
23936407Ssklower 
24036407Ssklower /******************************************************
24136407Ssklower  * Some macros used for address families
24236407Ssklower  *****************************************************/
24336407Ssklower 
24436407Ssklower #define satosiso(ADDR) ((struct sockaddr_iso *)(ADDR))
24536407Ssklower #define satosin(ADDR) ((struct sockaddr_in *)(ADDR))
24636407Ssklower 
24736407Ssklower /******************************************************
24836407Ssklower  * Macro used for changing types of mbufs
24936407Ssklower  *****************************************************/
25036407Ssklower 
25136407Ssklower #define CHANGE_MTYPE(m, TYPE)\
25236407Ssklower 	if((m)->m_type != TYPE) { \
25336407Ssklower 		mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[TYPE]++; \
25436407Ssklower 		(m)->m_type = TYPE; \
25536407Ssklower 	}
25636407Ssklower 
25736407Ssklower /******************************************************
25836407Ssklower  * Macros used for adding options to a tpdu header and for
25936407Ssklower  * parsing the headers.
26036407Ssklower  * Options are variable-length and must be bcopy-d because on the
26136407Ssklower  * RT your assignments must be N-word aligned for objects of length
26236407Ssklower  * N.  Such a drag.
26336407Ssklower  *****************************************************/
26436407Ssklower 
26536407Ssklower struct tp_vbp {
26636407Ssklower 	u_char	tpv_code;
26736407Ssklower 	char 	tpv_len;
26836407Ssklower 	char	tpv_val;
26936407Ssklower };
27036407Ssklower #define vbptr(x) ((struct tp_vbp *)(x))
27136407Ssklower #define vbval(x,type) (*((type *)&(((struct tp_vbp *)(x))->tpv_val)))
27236407Ssklower #define vbcode(x) (vbptr(x)->tpv_code)
27336407Ssklower #define vblen(x) (vbptr(x)->tpv_len)
27436407Ssklower 
27536407Ssklower #define vb_putval(dst,type,src)\
27636407Ssklower 	bcopy((caddr_t)&(src),(caddr_t)&(((struct tp_vbp *)(dst))->tpv_val),\
27736407Ssklower 	sizeof(type))
27836407Ssklower 
27936407Ssklower #define vb_getval(src,type,dst)\
28036407Ssklower bcopy((caddr_t)&(((struct tp_vbp *)(src))->tpv_val),(caddr_t)&(dst),sizeof(type))
28136407Ssklower 
28236407Ssklower #define ADDOPTION(type, DU, len, src)\
28336407Ssklower {	register caddr_t P;\
28436407Ssklower 	P = (caddr_t)(DU) + (int)((DU)->tpdu_li);\
28536407Ssklower 	vbptr(P)->tpv_code = type;\
28636407Ssklower 	vbptr(P)->tpv_len = len;\
287*37469Ssklower 	bcopy((caddr_t)&src, (caddr_t)&(vbptr(P)->tpv_val), (unsigned)len);\
28836407Ssklower 	DU->tpdu_li += len+2;/* 1 for code, 1 for length */\
28936407Ssklower }
29036407Ssklower /******************************************************
29136407Ssklower  * Macro for the local credit:
29236407Ssklower  * uses max transmission unit for the ll
29336407Ssklower  * (as modified by the max TPDU size negotiated)
29436407Ssklower  *****************************************************/
29536407Ssklower 
29636407Ssklower #if defined(ARGO_DEBUG)&&!defined(LOCAL_CREDIT_EXPAND)
29736407Ssklower #define LOCAL_CREDIT(tpcb) tp_local_credit(tpcb)
29836407Ssklower #else
29936407Ssklower #define LOCAL_CREDIT( tpcb ) {\
30036407Ssklower 	register struct sockbuf *xxsb = &((tpcb)->tp_sock->so_rcv);\
30136407Ssklower 	register int xxi = ((xxsb)->sb_hiwat-(xxsb)->sb_cc);\
30236407Ssklower 	register int maxcredit = ((tpcb)->tp_xtd_format?0xffff:0xf);\
30336407Ssklower 	maxcredit = ((tpcb)->tp_decbit?1:maxcredit);\
30436407Ssklower 	xxi = (xxi<0) ? 0 : ((xxi)>>(tpcb)->tp_tpdusize);\
30536407Ssklower 	(tpcb)->tp_lcredit = MIN( xxi ,maxcredit );\
30636407Ssklower }
30736407Ssklower #endif ARGO_DEBUG
30836407Ssklower 
30936407Ssklower #ifdef KERNEL
31036407Ssklower 
31136407Ssklower #ifndef  tp_NSTATES
31236407Ssklower 
31336407Ssklower #include "tp_states.h"
31436407Ssklower #include "tp_events.h"
31536407Ssklower 
31636407Ssklower #endif  tp_NSTATES
31736407Ssklower #endif KERNEL
31836407Ssklower 
31936407Ssklower #endif __TP_PARAM__
320