xref: /csrg-svn/sys/netiso/tp_param.h (revision 36407)
1*36407Ssklower /***********************************************************
2*36407Ssklower 		Copyright IBM Corporation 1987
3*36407Ssklower 
4*36407Ssklower                       All Rights Reserved
5*36407Ssklower 
6*36407Ssklower Permission to use, copy, modify, and distribute this software and its
7*36407Ssklower documentation for any purpose and without fee is hereby granted,
8*36407Ssklower provided that the above copyright notice appear in all copies and that
9*36407Ssklower both that copyright notice and this permission notice appear in
10*36407Ssklower supporting documentation, and that the name of IBM not be
11*36407Ssklower used in advertising or publicity pertaining to distribution of the
12*36407Ssklower software without specific, written prior permission.
13*36407Ssklower 
14*36407Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15*36407Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16*36407Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17*36407Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18*36407Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19*36407Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20*36407Ssklower SOFTWARE.
21*36407Ssklower 
22*36407Ssklower ******************************************************************/
23*36407Ssklower 
24*36407Ssklower /*
25*36407Ssklower  * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
26*36407Ssklower  */
27*36407Ssklower /*
28*36407Ssklower  * ARGO TP
29*36407Ssklower  *
30*36407Ssklower  * $Header: tp_param.h,v 5.3 88/11/18 17:28:18 nhall Exp $
31*36407Ssklower  * $Source: /usr/argo/sys/netiso/RCS/tp_param.h,v $
32*36407Ssklower  *
33*36407Ssklower  */
34*36407Ssklower 
35*36407Ssklower #ifndef __TP_PARAM__
36*36407Ssklower #define __TP_PARAM__
37*36407Ssklower 
38*36407Ssklower 
39*36407Ssklower /******************************************************
40*36407Ssklower  * compile time parameters that can be changed
41*36407Ssklower  *****************************************************/
42*36407Ssklower 
43*36407Ssklower #define 	TP_CLASSES_IMPLEMENTED 0x11 /* zero and 4 */
44*36407Ssklower 
45*36407Ssklower #define		TP_DECBIT_CLEAR_COUNT	3
46*36407Ssklower 
47*36407Ssklower #define 	N_TPREF				100
48*36407Ssklower 
49*36407Ssklower #define 	TP_SOCKBUFSIZE		4096
50*36407Ssklower #define 	TP0_SOCKBUFSIZE		512
51*36407Ssklower #define		MAX_TSAP_SEL_LEN	64
52*36407Ssklower 
53*36407Ssklower /* maximum tpdu size we'll accept: */
54*36407Ssklower #define 	TP_TPDUSIZE			0xc		/* 4096 octets for classes 1-4*/
55*36407Ssklower #define 	TP0_TPDUSIZE		0xb		/* 2048 octets for class 0 */
56*36407Ssklower #define 	TP_DFL_TPDUSIZE		0x7		/* 128 octets default */
57*36407Ssklower 	/* NOTE: don't ever negotiate 8192 because could get
58*36407Ssklower 	 * wraparound in checksumming
59*36407Ssklower 	 * (No mtu is likely to be larger than 4K anyway...)
60*36407Ssklower 	 */
61*36407Ssklower #define		TP_NRETRANS			1
62*36407Ssklower #define		TP_MAXPORT			0xefff
63*36407Ssklower 
64*36407Ssklower #define		TP_RTT_NUM			0x7
65*36407Ssklower /* ALPHA: to be used in the context: gain= 1/(2**alpha), or
66*36407Ssklower  * put another way, gaintimes(x) (x)>>alpha (forgetting the case alpha==0)
67*36407Ssklower  */
68*36407Ssklower #define 	TP_RTT_ALPHA		3
69*36407Ssklower #define 	TP_RTV_ALPHA		2
70*36407Ssklower 
71*36407Ssklower /*
72*36407Ssklower  * not sure how to treat data on disconnect
73*36407Ssklower  */
74*36407Ssklower #define 	T_CONN_DATA			0x1
75*36407Ssklower #define 	T_DISCONNECT		0x2
76*36407Ssklower #define 	T_DISC_DATA			0x4
77*36407Ssklower #define 	T_XDATA				0x8
78*36407Ssklower 
79*36407Ssklower #define ISO_CLNS	 0
80*36407Ssklower #define IN_CLNS	 	 1
81*36407Ssklower #define ISO_CONS	 2
82*36407Ssklower #define ISO_COSNS	 3
83*36407Ssklower #define TP_MAX_NETSERVICES 3
84*36407Ssklower 
85*36407Ssklower /* Indices into tp stats ackreason[i] */
86*36407Ssklower #define _ACK_DONT_ 0
87*36407Ssklower #define _ACK_STRAT_EACH_ 0x1
88*36407Ssklower #define _ACK_STRAT_FULLWIN_ 0x2
89*36407Ssklower #define _ACK_DUP_ 0x3
90*36407Ssklower #define _ACK_EOT_ 0x4
91*36407Ssklower #define _ACK_REORDER_ 0x5
92*36407Ssklower #define _ACK_USRRCV_ 0x6
93*36407Ssklower #define _ACK_FCC_ 0x7
94*36407Ssklower #define _ACK_NUM_REASONS_ 0x8
95*36407Ssklower 
96*36407Ssklower /* masks for use in tp_stash() */
97*36407Ssklower #define ACK_DONT 			0
98*36407Ssklower #define ACK_STRAT_EACH		(1<< _ACK_STRAT_EACH_)
99*36407Ssklower #define ACK_STRAT_FULLWIN	(1<< _ACK_STRAT_FULLWIN_)
100*36407Ssklower #define ACK_DUP 			(1<< _ACK_DUP_)
101*36407Ssklower #define ACK_EOT				(1<< _ACK_EOT_)
102*36407Ssklower #define ACK_REORDER			(1<< _ACK_REORDER_)
103*36407Ssklower 
104*36407Ssklower /******************************************************
105*36407Ssklower  * constants used in the protocol
106*36407Ssklower  *****************************************************/
107*36407Ssklower 
108*36407Ssklower #define		TP_VERSION 			0x1
109*36407Ssklower 
110*36407Ssklower #define 	TP_MAX_HEADER_LEN	256
111*36407Ssklower 
112*36407Ssklower #define 	TP_MIN_TPDUSIZE		0x7		/* 128 octets */
113*36407Ssklower #define 	TP_MAX_TPDUSIZE		0xd		/* 8192 octets */
114*36407Ssklower 
115*36407Ssklower #define		TP_MAX_XPD_DATA		0x10	/* 16 octets */
116*36407Ssklower #define		TP_MAX_CC_DATA		0x20	/* 32 octets */
117*36407Ssklower #define		TP_MAX_CR_DATA		TP_MAX_CC_DATA
118*36407Ssklower #define		TP_MAX_DR_DATA		0x40	/* 64 octets */
119*36407Ssklower 
120*36407Ssklower #define		TP_XTD_FMT_BIT 	0x80000000
121*36407Ssklower #define		TP_XTD_FMT_MASK	0x7fffffff
122*36407Ssklower #define		TP_NML_FMT_BIT 	0x80
123*36407Ssklower #define		TP_NML_FMT_MASK	0x7f
124*36407Ssklower 
125*36407Ssklower /*
126*36407Ssklower  * values for the tpdu_type field, 2nd byte in a tpdu
127*36407Ssklower  */
128*36407Ssklower 
129*36407Ssklower #define TP_MIN_TPDUTYPE 0x1
130*36407Ssklower 
131*36407Ssklower #define XPD_TPDU_type	0x1
132*36407Ssklower #define XAK_TPDU_type	0x2
133*36407Ssklower #define GR_TPDU_type	0x3
134*36407Ssklower #define AK_TPDU_type	0x6
135*36407Ssklower #define ER_TPDU_type	0x7
136*36407Ssklower #define DR_TPDU_type	0x8
137*36407Ssklower #define DC_TPDU_type	0xc
138*36407Ssklower #define CC_TPDU_type	0xd
139*36407Ssklower #define CR_TPDU_type	0xe
140*36407Ssklower #define DT_TPDU_type	0xf
141*36407Ssklower 
142*36407Ssklower #define TP_MAX_TPDUTYPE 0xf
143*36407Ssklower 
144*36407Ssklower /*
145*36407Ssklower  * identifiers for the variable-length options in tpdus
146*36407Ssklower  */
147*36407Ssklower 
148*36407Ssklower #define		TPP_acktime			0x85
149*36407Ssklower #define		TPP_residER			0x86
150*36407Ssklower #define		TPP_priority		0x87
151*36407Ssklower #define		TPP_transdelay		0x88
152*36407Ssklower #define		TPP_throughput		0x89
153*36407Ssklower #define		TPP_subseq			0x8a
154*36407Ssklower #define		TPP_flow_cntl_conf	0x8c	/* not implemented */
155*36407Ssklower #define		TPP_addl_info		0xe0
156*36407Ssklower #define		TPP_tpdu_size		0xc0
157*36407Ssklower #define		TPP_calling_sufx	0xc1
158*36407Ssklower #define		TPP_invalid_tpdu	0xc1	/* the bozos used a value twice */
159*36407Ssklower #define		TPP_called_sufx		0xc2
160*36407Ssklower #define		TPP_checksum		0xc3
161*36407Ssklower #define		TPP_vers			0xc4
162*36407Ssklower #define		TPP_security		0xc5
163*36407Ssklower #define		TPP_addl_opt		0xc6
164*36407Ssklower #define		TPP_alt_class		0xc7
165*36407Ssklower #define		TPP_perf_meas		0xc8	/* local item : perf meas on, svp */
166*36407Ssklower 
167*36407Ssklower /******************************************************
168*36407Ssklower  * Some fundamental data types
169*36407Ssklower  *****************************************************/
170*36407Ssklower #ifndef		TRUE
171*36407Ssklower #define		TRUE				1
172*36407Ssklower #endif		TRUE
173*36407Ssklower 
174*36407Ssklower #ifndef		FALSE
175*36407Ssklower #define		FALSE				0
176*36407Ssklower #endif		FALSE
177*36407Ssklower 
178*36407Ssklower #define		TP_LOCAL				22
179*36407Ssklower #define		TP_FOREIGN				33
180*36407Ssklower 
181*36407Ssklower #ifndef 	EOK
182*36407Ssklower #define 	EOK 	0
183*36407Ssklower #endif  	EOK
184*36407Ssklower 
185*36407Ssklower #define 	TP_CLASS_0 	(1<<0)
186*36407Ssklower #define 	TP_CLASS_1 	(1<<1)
187*36407Ssklower #define 	TP_CLASS_2 	(1<<2)
188*36407Ssklower #define 	TP_CLASS_3 	(1<<3)
189*36407Ssklower #define 	TP_CLASS_4 	(1<<4)
190*36407Ssklower 
191*36407Ssklower #define 	TP_FORCE 	0x1
192*36407Ssklower #define 	TP_STRICT 	0x2
193*36407Ssklower 
194*36407Ssklower #ifndef 	MNULL
195*36407Ssklower #define 	MNULL				(struct mbuf *)0
196*36407Ssklower #endif 	MNULL
197*36407Ssklower 	/* if ../h/mbuf.h gets MT_types up to 0x40, these will
198*36407Ssklower 	 * have to be changed:
199*36407Ssklower 	 */
200*36407Ssklower #define 	MT_XPD 				0x44
201*36407Ssklower #define 	MT_EOT 				0x40
202*36407Ssklower 
203*36407Ssklower #define		TP_ENOREF			0x80000000
204*36407Ssklower 
205*36407Ssklower typedef 	unsigned int	SeqNum;
206*36407Ssklower typedef		unsigned short	RefNum;
207*36407Ssklower typedef		int				ProtoHook;
208*36407Ssklower 
209*36407Ssklower 
210*36407Ssklower /******************************************************
211*36407Ssklower  * Some fundamental constants
212*36407Ssklower  *****************************************************/
213*36407Ssklower 
214*36407Ssklower #define TP_MIN_WIN	2048
215*36407Ssklower #define TP_MAX_WIN 16384
216*36407Ssklower #define TP_MAX_WIN_UNPRIV 8192
217*36407Ssklower 
218*36407Ssklower /******************************************************
219*36407Ssklower  * Macro used all over, for driver
220*36407Ssklower  *****************************************************/
221*36407Ssklower 
222*36407Ssklower #define  DoEvent(x) \
223*36407Ssklower   ((E.ev_number=(x)),(tp_driver(tpcb,&E)))
224*36407Ssklower 
225*36407Ssklower /******************************************************
226*36407Ssklower  * Some macros used all over, for timestamping
227*36407Ssklower  *****************************************************/
228*36407Ssklower 
229*36407Ssklower #define GET_CUR_TIME(tvalp) ((*tvalp) = time)
230*36407Ssklower 
231*36407Ssklower #define GET_TIME_SINCE(oldtvalp, diffp) {\
232*36407Ssklower 	(diffp)->tv_sec = time.tv_sec - (oldtvalp)->tv_sec;\
233*36407Ssklower 	(diffp)->tv_usec = time.tv_usec - (oldtvalp)->tv_usec;\
234*36407Ssklower 	if( (diffp)->tv_usec <0 ) {\
235*36407Ssklower 		(diffp)->tv_sec --;\
236*36407Ssklower 		(diffp)->tv_usec = 1000000 - (diffp)->tv_usec;\
237*36407Ssklower 	}\
238*36407Ssklower }
239*36407Ssklower 
240*36407Ssklower /******************************************************
241*36407Ssklower  * Some macros used for address families
242*36407Ssklower  *****************************************************/
243*36407Ssklower 
244*36407Ssklower #define satosiso(ADDR) ((struct sockaddr_iso *)(ADDR))
245*36407Ssklower #define satosin(ADDR) ((struct sockaddr_in *)(ADDR))
246*36407Ssklower 
247*36407Ssklower /******************************************************
248*36407Ssklower  * Macro used for changing types of mbufs
249*36407Ssklower  *****************************************************/
250*36407Ssklower 
251*36407Ssklower #define CHANGE_MTYPE(m, TYPE)\
252*36407Ssklower 	if((m)->m_type != TYPE) { \
253*36407Ssklower 		mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[TYPE]++; \
254*36407Ssklower 		(m)->m_type = TYPE; \
255*36407Ssklower 	}
256*36407Ssklower 
257*36407Ssklower /******************************************************
258*36407Ssklower  * Macros used for adding options to a tpdu header and for
259*36407Ssklower  * parsing the headers.
260*36407Ssklower  * Options are variable-length and must be bcopy-d because on the
261*36407Ssklower  * RT your assignments must be N-word aligned for objects of length
262*36407Ssklower  * N.  Such a drag.
263*36407Ssklower  *****************************************************/
264*36407Ssklower 
265*36407Ssklower struct tp_vbp {
266*36407Ssklower 	u_char	tpv_code;
267*36407Ssklower 	char 	tpv_len;
268*36407Ssklower 	char	tpv_val;
269*36407Ssklower };
270*36407Ssklower #define vbptr(x) ((struct tp_vbp *)(x))
271*36407Ssklower #define vbval(x,type) (*((type *)&(((struct tp_vbp *)(x))->tpv_val)))
272*36407Ssklower #define vbcode(x) (vbptr(x)->tpv_code)
273*36407Ssklower #define vblen(x) (vbptr(x)->tpv_len)
274*36407Ssklower 
275*36407Ssklower #define vb_putval(dst,type,src)\
276*36407Ssklower 	bcopy((caddr_t)&(src),(caddr_t)&(((struct tp_vbp *)(dst))->tpv_val),\
277*36407Ssklower 	sizeof(type))
278*36407Ssklower 
279*36407Ssklower #define vb_getval(src,type,dst)\
280*36407Ssklower bcopy((caddr_t)&(((struct tp_vbp *)(src))->tpv_val),(caddr_t)&(dst),sizeof(type))
281*36407Ssklower 
282*36407Ssklower #define ADDOPTION(type, DU, len, src)\
283*36407Ssklower {	register caddr_t P;\
284*36407Ssklower 	P = (caddr_t)(DU) + (int)((DU)->tpdu_li);\
285*36407Ssklower 	vbptr(P)->tpv_code = type;\
286*36407Ssklower 	vbptr(P)->tpv_len = len;\
287*36407Ssklower 	bcopy((caddr_t)&src, (caddr_t)&(vbptr(P)->tpv_val), (int)len);\
288*36407Ssklower 	DU->tpdu_li += len+2;/* 1 for code, 1 for length */\
289*36407Ssklower }
290*36407Ssklower /******************************************************
291*36407Ssklower  * Macro for the local credit:
292*36407Ssklower  * uses max transmission unit for the ll
293*36407Ssklower  * (as modified by the max TPDU size negotiated)
294*36407Ssklower  *****************************************************/
295*36407Ssklower 
296*36407Ssklower #if defined(ARGO_DEBUG)&&!defined(LOCAL_CREDIT_EXPAND)
297*36407Ssklower #define LOCAL_CREDIT(tpcb) tp_local_credit(tpcb)
298*36407Ssklower #else
299*36407Ssklower #define LOCAL_CREDIT( tpcb ) {\
300*36407Ssklower 	register struct sockbuf *xxsb = &((tpcb)->tp_sock->so_rcv);\
301*36407Ssklower 	register int xxi = ((xxsb)->sb_hiwat-(xxsb)->sb_cc);\
302*36407Ssklower 	register int maxcredit = ((tpcb)->tp_xtd_format?0xffff:0xf);\
303*36407Ssklower 	maxcredit = ((tpcb)->tp_decbit?1:maxcredit);\
304*36407Ssklower 	xxi = (xxi<0) ? 0 : ((xxi)>>(tpcb)->tp_tpdusize);\
305*36407Ssklower 	(tpcb)->tp_lcredit = MIN( xxi ,maxcredit );\
306*36407Ssklower }
307*36407Ssklower #endif ARGO_DEBUG
308*36407Ssklower 
309*36407Ssklower #ifdef KERNEL
310*36407Ssklower 
311*36407Ssklower #ifndef  tp_NSTATES
312*36407Ssklower 
313*36407Ssklower #include "tp_states.h"
314*36407Ssklower #include "tp_events.h"
315*36407Ssklower 
316*36407Ssklower #endif  tp_NSTATES
317*36407Ssklower #endif KERNEL
318*36407Ssklower 
319*36407Ssklower #endif __TP_PARAM__
320