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