xref: /csrg-svn/sys/netiso/tp_param.h (revision 39920)
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 $
32*39920Ssklower  *	@(#)tp_param.h	7.5 (Berkeley) 01/16/90 *
3336407Ssklower  *
3436407Ssklower  */
3536407Ssklower 
3636407Ssklower #ifndef __TP_PARAM__
3736407Ssklower #define __TP_PARAM__
3836407Ssklower 
3936407Ssklower 
4036407Ssklower /******************************************************
4136407Ssklower  * compile time parameters that can be changed
4236407Ssklower  *****************************************************/
4336407Ssklower 
4436407Ssklower #define 	TP_CLASSES_IMPLEMENTED 0x11 /* zero and 4 */
4536407Ssklower 
4636407Ssklower #define		TP_DECBIT_CLEAR_COUNT	3
4736407Ssklower 
4836407Ssklower #define 	N_TPREF				100
4936407Ssklower 
5037469Ssklower #define 	TP_SOCKBUFSIZE		((u_long)4096)
5137469Ssklower #define 	TP0_SOCKBUFSIZE		((u_long)512)
5236407Ssklower #define		MAX_TSAP_SEL_LEN	64
5336407Ssklower 
5436407Ssklower /* maximum tpdu size we'll accept: */
5536407Ssklower #define 	TP_TPDUSIZE			0xc		/* 4096 octets for classes 1-4*/
5636407Ssklower #define 	TP0_TPDUSIZE		0xb		/* 2048 octets for class 0 */
5736407Ssklower #define 	TP_DFL_TPDUSIZE		0x7		/* 128 octets default */
5836407Ssklower 	/* NOTE: don't ever negotiate 8192 because could get
5936407Ssklower 	 * wraparound in checksumming
6036407Ssklower 	 * (No mtu is likely to be larger than 4K anyway...)
6136407Ssklower 	 */
6236407Ssklower #define		TP_NRETRANS			1
6336407Ssklower #define		TP_MAXPORT			0xefff
6436407Ssklower 
6536407Ssklower #define		TP_RTT_NUM			0x7
6636407Ssklower /* ALPHA: to be used in the context: gain= 1/(2**alpha), or
6736407Ssklower  * put another way, gaintimes(x) (x)>>alpha (forgetting the case alpha==0)
6836407Ssklower  */
6936407Ssklower #define 	TP_RTT_ALPHA		3
7036407Ssklower #define 	TP_RTV_ALPHA		2
7136407Ssklower 
7236407Ssklower /*
7336407Ssklower  * not sure how to treat data on disconnect
7436407Ssklower  */
7536407Ssklower #define 	T_CONN_DATA			0x1
7636407Ssklower #define 	T_DISCONNECT		0x2
7736407Ssklower #define 	T_DISC_DATA			0x4
7836407Ssklower #define 	T_XDATA				0x8
7936407Ssklower 
8036407Ssklower #define ISO_CLNS	 0
8136407Ssklower #define IN_CLNS	 	 1
8236407Ssklower #define ISO_CONS	 2
8336407Ssklower #define ISO_COSNS	 3
8436407Ssklower #define TP_MAX_NETSERVICES 3
8536407Ssklower 
8636407Ssklower /* Indices into tp stats ackreason[i] */
8736407Ssklower #define _ACK_DONT_ 0
8836407Ssklower #define _ACK_STRAT_EACH_ 0x1
8936407Ssklower #define _ACK_STRAT_FULLWIN_ 0x2
9036407Ssklower #define _ACK_DUP_ 0x3
9136407Ssklower #define _ACK_EOT_ 0x4
9236407Ssklower #define _ACK_REORDER_ 0x5
9336407Ssklower #define _ACK_USRRCV_ 0x6
9436407Ssklower #define _ACK_FCC_ 0x7
9536407Ssklower #define _ACK_NUM_REASONS_ 0x8
9636407Ssklower 
9736407Ssklower /* masks for use in tp_stash() */
9836407Ssklower #define ACK_DONT 			0
9936407Ssklower #define ACK_STRAT_EACH		(1<< _ACK_STRAT_EACH_)
10036407Ssklower #define ACK_STRAT_FULLWIN	(1<< _ACK_STRAT_FULLWIN_)
10136407Ssklower #define ACK_DUP 			(1<< _ACK_DUP_)
10236407Ssklower #define ACK_EOT				(1<< _ACK_EOT_)
10336407Ssklower #define ACK_REORDER			(1<< _ACK_REORDER_)
10436407Ssklower 
10536407Ssklower /******************************************************
10636407Ssklower  * constants used in the protocol
10736407Ssklower  *****************************************************/
10836407Ssklower 
10936407Ssklower #define		TP_VERSION 			0x1
11036407Ssklower 
11136407Ssklower #define 	TP_MAX_HEADER_LEN	256
11236407Ssklower 
11336407Ssklower #define 	TP_MIN_TPDUSIZE		0x7		/* 128 octets */
11436407Ssklower #define 	TP_MAX_TPDUSIZE		0xd		/* 8192 octets */
11536407Ssklower 
11636407Ssklower #define		TP_MAX_XPD_DATA		0x10	/* 16 octets */
11736407Ssklower #define		TP_MAX_CC_DATA		0x20	/* 32 octets */
11836407Ssklower #define		TP_MAX_CR_DATA		TP_MAX_CC_DATA
11936407Ssklower #define		TP_MAX_DR_DATA		0x40	/* 64 octets */
12036407Ssklower 
12136407Ssklower #define		TP_XTD_FMT_BIT 	0x80000000
12236407Ssklower #define		TP_XTD_FMT_MASK	0x7fffffff
12336407Ssklower #define		TP_NML_FMT_BIT 	0x80
12436407Ssklower #define		TP_NML_FMT_MASK	0x7f
12536407Ssklower 
12636407Ssklower /*
12736407Ssklower  * values for the tpdu_type field, 2nd byte in a tpdu
12836407Ssklower  */
12936407Ssklower 
13036407Ssklower #define TP_MIN_TPDUTYPE 0x1
13136407Ssklower 
13236407Ssklower #define XPD_TPDU_type	0x1
13336407Ssklower #define XAK_TPDU_type	0x2
13436407Ssklower #define GR_TPDU_type	0x3
13536407Ssklower #define AK_TPDU_type	0x6
13636407Ssklower #define ER_TPDU_type	0x7
13736407Ssklower #define DR_TPDU_type	0x8
13836407Ssklower #define DC_TPDU_type	0xc
13936407Ssklower #define CC_TPDU_type	0xd
14036407Ssklower #define CR_TPDU_type	0xe
14136407Ssklower #define DT_TPDU_type	0xf
14236407Ssklower 
14336407Ssklower #define TP_MAX_TPDUTYPE 0xf
14436407Ssklower 
14536407Ssklower /*
14636407Ssklower  * identifiers for the variable-length options in tpdus
14736407Ssklower  */
14836407Ssklower 
14936407Ssklower #define		TPP_acktime			0x85
15036407Ssklower #define		TPP_residER			0x86
15136407Ssklower #define		TPP_priority		0x87
15236407Ssklower #define		TPP_transdelay		0x88
15336407Ssklower #define		TPP_throughput		0x89
15436407Ssklower #define		TPP_subseq			0x8a
15536407Ssklower #define		TPP_flow_cntl_conf	0x8c	/* not implemented */
15636407Ssklower #define		TPP_addl_info		0xe0
15736407Ssklower #define		TPP_tpdu_size		0xc0
15836407Ssklower #define		TPP_calling_sufx	0xc1
15936407Ssklower #define		TPP_invalid_tpdu	0xc1	/* the bozos used a value twice */
16036407Ssklower #define		TPP_called_sufx		0xc2
16136407Ssklower #define		TPP_checksum		0xc3
16236407Ssklower #define		TPP_vers			0xc4
16336407Ssklower #define		TPP_security		0xc5
16436407Ssklower #define		TPP_addl_opt		0xc6
16536407Ssklower #define		TPP_alt_class		0xc7
16636407Ssklower #define		TPP_perf_meas		0xc8	/* local item : perf meas on, svp */
16736407Ssklower 
16836407Ssklower /******************************************************
16936407Ssklower  * Some fundamental data types
17036407Ssklower  *****************************************************/
17136407Ssklower #ifndef		TRUE
17236407Ssklower #define		TRUE				1
17336407Ssklower #endif		TRUE
17436407Ssklower 
17536407Ssklower #ifndef		FALSE
17636407Ssklower #define		FALSE				0
17736407Ssklower #endif		FALSE
17836407Ssklower 
17936407Ssklower #define		TP_LOCAL				22
18036407Ssklower #define		TP_FOREIGN				33
18136407Ssklower 
18236407Ssklower #ifndef 	EOK
18336407Ssklower #define 	EOK 	0
18436407Ssklower #endif  	EOK
18536407Ssklower 
18636407Ssklower #define 	TP_CLASS_0 	(1<<0)
18736407Ssklower #define 	TP_CLASS_1 	(1<<1)
18836407Ssklower #define 	TP_CLASS_2 	(1<<2)
18936407Ssklower #define 	TP_CLASS_3 	(1<<3)
19036407Ssklower #define 	TP_CLASS_4 	(1<<4)
19136407Ssklower 
19236407Ssklower #define 	TP_FORCE 	0x1
19336407Ssklower #define 	TP_STRICT 	0x2
19436407Ssklower 
19536407Ssklower #ifndef 	MNULL
19636407Ssklower #define 	MNULL				(struct mbuf *)0
19736407Ssklower #endif 	MNULL
19837536Smckusick 	/* if ../sys/mbuf.h gets MT_types up to 0x40, these will
19936407Ssklower 	 * have to be changed:
20036407Ssklower 	 */
20136407Ssklower #define 	MT_XPD 				0x44
20236407Ssklower #define 	MT_EOT 				0x40
20336407Ssklower 
20436407Ssklower #define		TP_ENOREF			0x80000000
20536407Ssklower 
20636407Ssklower typedef 	unsigned int	SeqNum;
20736407Ssklower typedef		unsigned short	RefNum;
20836407Ssklower typedef		int				ProtoHook;
20936407Ssklower 
21036407Ssklower 
21136407Ssklower /******************************************************
21236407Ssklower  * Some fundamental constants
21336407Ssklower  *****************************************************/
21436407Ssklower 
21536407Ssklower #define TP_MIN_WIN	2048
21636407Ssklower #define TP_MAX_WIN 16384
21736407Ssklower #define TP_MAX_WIN_UNPRIV 8192
21836407Ssklower 
21936407Ssklower /******************************************************
22036407Ssklower  * Macro used all over, for driver
22136407Ssklower  *****************************************************/
22236407Ssklower 
22336407Ssklower #define  DoEvent(x) \
22436407Ssklower   ((E.ev_number=(x)),(tp_driver(tpcb,&E)))
22536407Ssklower 
22636407Ssklower /******************************************************
22736407Ssklower  * Some macros used all over, for timestamping
22836407Ssklower  *****************************************************/
22936407Ssklower 
23036407Ssklower #define GET_CUR_TIME(tvalp) ((*tvalp) = time)
23136407Ssklower 
23236407Ssklower #define GET_TIME_SINCE(oldtvalp, diffp) {\
23336407Ssklower 	(diffp)->tv_sec = time.tv_sec - (oldtvalp)->tv_sec;\
23436407Ssklower 	(diffp)->tv_usec = time.tv_usec - (oldtvalp)->tv_usec;\
23536407Ssklower 	if( (diffp)->tv_usec <0 ) {\
23636407Ssklower 		(diffp)->tv_sec --;\
23736407Ssklower 		(diffp)->tv_usec = 1000000 - (diffp)->tv_usec;\
23836407Ssklower 	}\
23936407Ssklower }
24036407Ssklower 
24136407Ssklower /******************************************************
24236407Ssklower  * Some macros used for address families
24336407Ssklower  *****************************************************/
24436407Ssklower 
24536407Ssklower #define satosiso(ADDR) ((struct sockaddr_iso *)(ADDR))
24636407Ssklower #define satosin(ADDR) ((struct sockaddr_in *)(ADDR))
24736407Ssklower 
24836407Ssklower /******************************************************
24936407Ssklower  * Macro used for changing types of mbufs
25036407Ssklower  *****************************************************/
25136407Ssklower 
25236407Ssklower #define CHANGE_MTYPE(m, TYPE)\
25336407Ssklower 	if((m)->m_type != TYPE) { \
25436407Ssklower 		mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[TYPE]++; \
25536407Ssklower 		(m)->m_type = TYPE; \
25636407Ssklower 	}
25736407Ssklower 
25836407Ssklower /******************************************************
25936407Ssklower  * Macros used for adding options to a tpdu header and for
26036407Ssklower  * parsing the headers.
26136407Ssklower  * Options are variable-length and must be bcopy-d because on the
26236407Ssklower  * RT your assignments must be N-word aligned for objects of length
26336407Ssklower  * N.  Such a drag.
26436407Ssklower  *****************************************************/
26536407Ssklower 
26636407Ssklower struct tp_vbp {
26736407Ssklower 	u_char	tpv_code;
26836407Ssklower 	char 	tpv_len;
26936407Ssklower 	char	tpv_val;
27036407Ssklower };
27136407Ssklower #define vbptr(x) ((struct tp_vbp *)(x))
27236407Ssklower #define vbval(x,type) (*((type *)&(((struct tp_vbp *)(x))->tpv_val)))
27336407Ssklower #define vbcode(x) (vbptr(x)->tpv_code)
27436407Ssklower #define vblen(x) (vbptr(x)->tpv_len)
27536407Ssklower 
27636407Ssklower #define vb_putval(dst,type,src)\
27736407Ssklower 	bcopy((caddr_t)&(src),(caddr_t)&(((struct tp_vbp *)(dst))->tpv_val),\
27836407Ssklower 	sizeof(type))
27936407Ssklower 
28036407Ssklower #define vb_getval(src,type,dst)\
28136407Ssklower bcopy((caddr_t)&(((struct tp_vbp *)(src))->tpv_val),(caddr_t)&(dst),sizeof(type))
28236407Ssklower 
28336407Ssklower #define ADDOPTION(type, DU, len, src)\
28436407Ssklower {	register caddr_t P;\
28536407Ssklower 	P = (caddr_t)(DU) + (int)((DU)->tpdu_li);\
28636407Ssklower 	vbptr(P)->tpv_code = type;\
28736407Ssklower 	vbptr(P)->tpv_len = len;\
28837469Ssklower 	bcopy((caddr_t)&src, (caddr_t)&(vbptr(P)->tpv_val), (unsigned)len);\
28936407Ssklower 	DU->tpdu_li += len+2;/* 1 for code, 1 for length */\
29036407Ssklower }
29136407Ssklower /******************************************************
29236407Ssklower  * Macro for the local credit:
29336407Ssklower  * uses max transmission unit for the ll
29436407Ssklower  * (as modified by the max TPDU size negotiated)
29536407Ssklower  *****************************************************/
29636407Ssklower 
29736407Ssklower #if defined(ARGO_DEBUG)&&!defined(LOCAL_CREDIT_EXPAND)
29836407Ssklower #define LOCAL_CREDIT(tpcb) tp_local_credit(tpcb)
29936407Ssklower #else
30036407Ssklower #define LOCAL_CREDIT( tpcb ) {\
301*39920Ssklower     register struct sockbuf *xxsb = &((tpcb)->tp_sock->so_rcv);\
302*39920Ssklower     register int xxi = ((xxsb)->sb_hiwat-(xxsb)->sb_cc);\
303*39920Ssklower     register int maxcredit = ((tpcb)->tp_xtd_format?0xffff:0xf);\
304*39920Ssklower     xxi = (xxi<0) ? 0 : ((xxi)>>(tpcb)->tp_tpdusize);\
305*39920Ssklower     xxi = MIN(xxi, maxcredit); \
306*39920Ssklower     if (!(tpcb->tp_cebit_off)) { \
307*39920Ssklower         (tpcb)->tp_lcredit = ROUND((tpcb)->tp_win_recv); \
308*39920Ssklower         if (xxi < (tpcb)->tp_lcredit) { \
309*39920Ssklower             (tpcb)->tp_lcredit = xxi; \
310*39920Ssklower         } \
311*39920Ssklower     } \
312*39920Ssklower     else { \
313*39920Ssklower         (tpcb)->tp_lcredit = xxi; \
314*39920Ssklower     } \
31536407Ssklower }
31636407Ssklower #endif ARGO_DEBUG
31736407Ssklower 
31836407Ssklower #ifdef KERNEL
31936407Ssklower 
32036407Ssklower #ifndef  tp_NSTATES
32136407Ssklower 
32236407Ssklower #include "tp_states.h"
32336407Ssklower #include "tp_events.h"
32436407Ssklower 
32536407Ssklower #endif  tp_NSTATES
32636407Ssklower #endif KERNEL
32736407Ssklower 
32836407Ssklower #endif __TP_PARAM__
329