xref: /csrg-svn/sys/netiso/tp_tpdu.h (revision 63222)
149268Sbostic /*-
2*63222Sbostic  * Copyright (c) 1991, 1993
3*63222Sbostic  *	The Regents of the University of California.  All rights reserved.
449268Sbostic  *
549268Sbostic  * %sccs.include.redist.c%
649268Sbostic  *
7*63222Sbostic  *	@(#)tp_tpdu.h	8.1 (Berkeley) 06/10/93
849268Sbostic  */
949268Sbostic 
1036417Ssklower /***********************************************************
1136417Ssklower 		Copyright IBM Corporation 1987
1236417Ssklower 
1336417Ssklower                       All Rights Reserved
1436417Ssklower 
1536417Ssklower Permission to use, copy, modify, and distribute this software and its
1636417Ssklower documentation for any purpose and without fee is hereby granted,
1736417Ssklower provided that the above copyright notice appear in all copies and that
1836417Ssklower both that copyright notice and this permission notice appear in
1936417Ssklower supporting documentation, and that the name of IBM not be
2036417Ssklower used in advertising or publicity pertaining to distribution of the
2136417Ssklower software without specific, written prior permission.
2236417Ssklower 
2336417Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
2436417Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
2536417Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
2636417Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
2736417Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
2836417Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
2936417Ssklower SOFTWARE.
3036417Ssklower 
3136417Ssklower ******************************************************************/
3236417Ssklower 
3336417Ssklower /*
3436417Ssklower  * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
3536417Ssklower  */
3636417Ssklower /*
3736417Ssklower  * ARGO TP
3836417Ssklower  *
3936417Ssklower  * $Header: tp_tpdu.h,v 4.4 88/07/26 16:45:40 nhall Exp $
4036417Ssklower  * $Source: /usr/argo/sys/netiso/RCS/tp_tpdu.h,v $
4136417Ssklower  *
4236417Ssklower  * This ghastly set of macros makes it possible to
4336417Ssklower  * refer to tpdu structures without going mad.
4436417Ssklower  */
4536417Ssklower 
4636417Ssklower #ifndef __TP_TPDU__
4736417Ssklower #define __TP_TPDU__
4836417Ssklower 
4936417Ssklower #ifndef BYTE_ORDER
5036417Ssklower /*
5136417Ssklower  * Definitions for byte order,
5236417Ssklower  * according to byte significance from low address to high.
5336417Ssklower  */
5436417Ssklower #define	LITTLE_ENDIAN	1234	/* least-significant byte first (vax) */
5536417Ssklower #define	BIG_ENDIAN	4321	/* most-significant byte first (IBM, net) */
5636417Ssklower #define	PDP_ENDIAN	3412	/* LSB first in word, MSW first in long (pdp) */
5736417Ssklower 
5836417Ssklower #ifdef vax
5936417Ssklower #define	BYTE_ORDER	LITTLE_ENDIAN
6036417Ssklower #else
6136417Ssklower #define	BYTE_ORDER	BIG_ENDIAN	/* mc68000, tahoe, most others */
6236417Ssklower #endif
6360359Sbostic #endif /* BYTE_ORDER */
6436417Ssklower 
6536417Ssklower /* This much of a tpdu is the same for all types of tpdus  (except
6636417Ssklower  * DT tpdus in class 0; their exceptions are handled by the data
6736417Ssklower  * structure below
6836417Ssklower  */
6936417Ssklower struct tpdu_fixed {
7037469Ssklower 	u_char			_tpduf_li:8,		/* length indicator */
7136417Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
7236417Ssklower 				_tpduf_cdt: 4,		/* credit */
7337469Ssklower 				_tpduf_type: 4;		/* type of tpdu (DT, CR, etc.) */
7436417Ssklower #endif
7536417Ssklower #if BYTE_ORDER == BIG_ENDIAN
7636417Ssklower 				_tpduf_type: 4,		/* type of tpdu (DT, CR, etc.) */
7737469Ssklower 				_tpduf_cdt: 4;		/* credit */
7836417Ssklower #endif
7937469Ssklower 	u_short			_tpduf_dref;		/* destination ref; not in DT in class 0 */
8036417Ssklower };
8136417Ssklower 
8236417Ssklower #define tpdu_li _tpduf._tpduf_li
8336417Ssklower #define tpdu_type _tpduf._tpduf_type
8436417Ssklower #define tpdu_cdt _tpduf._tpduf_cdt
8536417Ssklower #define tpdu_dref _tpduf._tpduf_dref
8636417Ssklower 
8736417Ssklower struct tp0du {
8837469Ssklower 	u_char		_tp0_li,
8937469Ssklower 				_tp0_cdt_type,		/* same as in tpdu_fixed */
9036417Ssklower #if BYTE_ORDER == BIG_ENDIAN
9136417Ssklower 				_tp0_eot: 1,		/* eot */
9236417Ssklower 				_tp0_mbz: 7,		/* must be zero */
9336417Ssklower #endif
9436417Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
9536417Ssklower 				_tp0_mbz: 7,		/* must be zero */
9636417Ssklower 				_tp0_eot: 1,		/* eot */
9736417Ssklower #endif
9836417Ssklower 				_tp0_notused: 8;	/* data begins on this octet */
9936417Ssklower };
10036417Ssklower 
10136417Ssklower #define tp0du_eot _tp0_eot
10236417Ssklower #define tp0du_mbz _tp0_mbz
10336417Ssklower 
10436417Ssklower /*
10536417Ssklower  * This is used when the extended format seqence numbers are
10636417Ssklower  * being sent and received.
10736417Ssklower  */
10836417Ssklower 				/*
10936417Ssklower 				 * the seqeot field is an int that overlays the seq
11036417Ssklower 				 * and eot fields, this allows the htonl operation
11136417Ssklower 				 * to be applied to the entire 32 bit quantity, and
11236417Ssklower 				 * simplifies the structure definitions.
11336417Ssklower 				 */
11436417Ssklower union seq_type {
11536417Ssklower 	struct {
11636417Ssklower #if BYTE_ORDER == BIG_ENDIAN
11736417Ssklower 		unsigned int	st_eot:1,		/* end-of-tsdu */
11836417Ssklower 				 		st_seq:31;		/* 31 bit sequence number */
11936417Ssklower #endif
12036417Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
12136417Ssklower 		unsigned int	st_seq:31,		/* 31 bit sequence number */
12236417Ssklower 						st_eot:1;		/* end-of-tsdu */
12336417Ssklower #endif
12436417Ssklower 	} st;
12536417Ssklower 	unsigned int s_seqeot;
12636417Ssklower #define s_eot	st.st_eot
12736417Ssklower #define s_seq	st.st_seq
12836417Ssklower };
12936417Ssklower 
13036417Ssklower /* Then most tpdu types have a portion that is always present but
13136417Ssklower  * differs among the tpdu types :
13236417Ssklower  */
13336417Ssklower union  tpdu_fixed_rest {
13436417Ssklower 
13536417Ssklower 		struct {
13637469Ssklower 			u_short		_tpdufr_sref, 		/* source reference */
13736417Ssklower #if BYTE_ORDER == BIG_ENDIAN
13836417Ssklower 						_tpdufr_class: 4,	/* class [ ISO 8073 13.3.3.e ] */
13936417Ssklower 						_tpdufr_opt: 4,		/* options [ ISO 8073 13.3.3.e ] */
14036417Ssklower #endif
14136417Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
14236417Ssklower 						_tpdufr_opt: 4,		/* options [ ISO 8073 13.3.3.e ] */
14336417Ssklower 						_tpdufr_class: 4,	/* class [ ISO 8073 13.3.3.e ] */
14436417Ssklower #endif
14536417Ssklower 						_tpdufr_xx: 8;		/* unused */
14636417Ssklower 		} CRCC;
14736417Ssklower 
14836417Ssklower #define tpdu_CRli _tpduf._tpduf_li
14936417Ssklower #define tpdu_CRtype _tpduf._tpduf_type
15036417Ssklower #define tpdu_CRcdt _tpduf._tpduf_cdt
15136417Ssklower #define tpdu_CRdref_0 _tpduf._tpduf_dref
15236417Ssklower #define tpdu_CRsref _tpdufr.CRCC._tpdufr_sref
15336417Ssklower #define tpdu_sref _tpdufr.CRCC._tpdufr_sref
15436417Ssklower #define tpdu_CRclass _tpdufr.CRCC._tpdufr_class
15536417Ssklower #define tpdu_CRoptions _tpdufr.CRCC._tpdufr_opt
15636417Ssklower 
15736417Ssklower #define tpdu_CCli _tpduf._tpduf_li
15836417Ssklower #define tpdu_CCtype _tpduf._tpduf_type
15936417Ssklower #define tpdu_CCcdt _tpduf._tpduf_cdt
16036417Ssklower #define tpdu_CCdref _tpduf._tpduf_dref
16136417Ssklower #define tpdu_CCsref _tpdufr.CRCC._tpdufr_sref
16236417Ssklower #define tpdu_CCclass _tpdufr.CRCC._tpdufr_class
16336417Ssklower #define tpdu_CCoptions _tpdufr.CRCC._tpdufr_opt
16436417Ssklower 
16536417Ssklower /* OPTIONS and ADDL OPTIONS bits */
16636417Ssklower #define TPO_USE_EFC	 			0x1
16736417Ssklower #define TPO_XTD_FMT	 			0x2
16836417Ssklower #define TPAO_USE_TXPD 			0x1
16936417Ssklower #define TPAO_NO_CSUM 			0x2
17036417Ssklower #define TPAO_USE_RCC 			0x4
17136417Ssklower #define TPAO_USE_NXPD 			0x8
17236417Ssklower 
17336417Ssklower 		struct {
17436417Ssklower 			unsigned short _tpdufr_sref;	/* source reference */
17536417Ssklower 			unsigned char  _tpdufr_reason;	/* [ ISO 8073 13.5.3.d ] */
17636417Ssklower 		} DR;
17736417Ssklower #define tpdu_DRli _tpduf._tpduf_li
17836417Ssklower #define tpdu_DRtype _tpduf._tpduf_type
17936417Ssklower #define tpdu_DRdref _tpduf._tpduf_dref
18036417Ssklower #define tpdu_DRsref _tpdufr.DR._tpdufr_sref
18136417Ssklower #define tpdu_DRreason _tpdufr.DR._tpdufr_reason
18236417Ssklower 
18336417Ssklower 		unsigned short _tpdufr_sref;	/* source reference */
18436417Ssklower 
18536417Ssklower #define tpdu_DCli _tpduf._tpduf_li
18636417Ssklower #define tpdu_DCtype _tpduf._tpduf_type
18736417Ssklower #define tpdu_DCdref _tpduf._tpduf_dref
18836417Ssklower #define tpdu_DCsref _tpdufr._tpdufr_sref
18936417Ssklower 
19036417Ssklower 		struct {
19136417Ssklower #if BYTE_ORDER == BIG_ENDIAN
19236417Ssklower 			unsigned char _tpdufr_eot:1,	/* end-of-tsdu */
19336417Ssklower 						  _tpdufr_seq:7; 	/* 7 bit sequence number */
19436417Ssklower #endif
19536417Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
19636417Ssklower 			unsigned char	_tpdufr_seq:7, 	/* 7 bit sequence number */
19736417Ssklower 							_tpdufr_eot:1;	/* end-of-tsdu */
19836417Ssklower #endif
19936417Ssklower 		}SEQEOT;
20036417Ssklower 		struct {
20136417Ssklower #if BYTE_ORDER == BIG_ENDIAN
20236417Ssklower 			unsigned int	_tpdufr_Xeot:1,		/* end-of-tsdu */
20336417Ssklower 					 		_tpdufr_Xseq:31;	/* 31 bit sequence number */
20436417Ssklower #endif
20536417Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
20636417Ssklower 			unsigned int	_tpdufr_Xseq:31,	/* 31 bit sequence number */
20736417Ssklower 							_tpdufr_Xeot:1;		/* end-of-tsdu */
20836417Ssklower #endif
20936417Ssklower 		}SEQEOT31;
21036417Ssklower 		unsigned int _tpdufr_Xseqeot;
21136417Ssklower #define tpdu_seqeotX _tpdufr._tpdufr_Xseqeot
21236417Ssklower 
21336417Ssklower #define tpdu_DTli _tpduf._tpduf_li
21436417Ssklower #define tpdu_DTtype _tpduf._tpduf_type
21536417Ssklower #define tpdu_DTdref _tpduf._tpduf_dref
21636417Ssklower #define tpdu_DTseq _tpdufr.SEQEOT._tpdufr_seq
21736417Ssklower #define tpdu_DTeot _tpdufr.SEQEOT._tpdufr_eot
21836417Ssklower #define tpdu_DTseqX _tpdufr.SEQEOT31._tpdufr_Xseq
21936417Ssklower #define tpdu_DTeotX _tpdufr.SEQEOT31._tpdufr_Xeot
22036417Ssklower 
22136417Ssklower #define tpdu_XPDli _tpduf._tpduf_li
22236417Ssklower #define tpdu_XPDtype _tpduf._tpduf_type
22336417Ssklower #define tpdu_XPDdref _tpduf._tpduf_dref
22436417Ssklower #define tpdu_XPDseq _tpdufr.SEQEOT._tpdufr_seq
22536417Ssklower #define tpdu_XPDeot _tpdufr.SEQEOT._tpdufr_eot
22636417Ssklower #define tpdu_XPDseqX _tpdufr.SEQEOT31._tpdufr_Xseq
22736417Ssklower #define tpdu_XPDeotX _tpdufr.SEQEOT31._tpdufr_Xeot
22836417Ssklower 
22936417Ssklower 		struct {
23036417Ssklower #if BYTE_ORDER == BIG_ENDIAN
23136417Ssklower 			unsigned	_tpdufr_yrseq0:1,	/* always zero */
23236417Ssklower 						_tpdufr_yrseq:31; 	/* [ ISO 8073 13.9.3.d ] */
23336417Ssklower #endif
23436417Ssklower #if BYTE_ORDER == LITTLE_ENDIAN
23536417Ssklower 			unsigned	_tpdufr_yrseq:31, 	/* [ ISO 8073 13.9.3.d ] */
23636417Ssklower 						_tpdufr_yrseq0:1;	/* always zero */
23736417Ssklower #endif
23836417Ssklower 			unsigned short _tpdufr_cdt; /* [ ISO 8073 13.9.3.b ] */
23936417Ssklower 		} AK31;
24036417Ssklower 
24136417Ssklower #define tpdu_AKli _tpduf._tpduf_li
24236417Ssklower #define tpdu_AKtype _tpduf._tpduf_type
24336417Ssklower #define tpdu_AKdref _tpduf._tpduf_dref
24436417Ssklower #define tpdu_AKseq _tpdufr.SEQEOT._tpdufr_seq
24536417Ssklower #define tpdu_AKseqX _tpdufr.AK31._tpdufr_yrseq
24636417Ssklower /* location of cdt depends on size of seq. numbers */
24736417Ssklower #define tpdu_AKcdt _tpduf._tpduf_cdt
24836417Ssklower #define tpdu_AKcdtX _tpdufr.AK31._tpdufr_cdt
24936417Ssklower 
25036417Ssklower #define tpdu_XAKli _tpduf._tpduf_li
25136417Ssklower #define tpdu_XAKtype _tpduf._tpduf_type
25236417Ssklower #define tpdu_XAKdref _tpduf._tpduf_dref
25336417Ssklower #define tpdu_XAKseq _tpdufr.SEQEOT._tpdufr_seq
25436417Ssklower #define tpdu_XAKseqX _tpdufr.SEQEOT31._tpdufr_Xseq
25536417Ssklower 
25636417Ssklower 		unsigned char _tpdu_ERreason;  	/* [ ISO 8073 13.12.3.c ] */
25736417Ssklower 
25836417Ssklower #define tpdu_ERli _tpduf._tpduf_li
25936417Ssklower #define tpdu_ERtype _tpduf._tpduf_type
26036417Ssklower #define tpdu_ERdref _tpduf._tpduf_dref
26136417Ssklower #define tpdu_ERreason _tpdufr._tpdu_ERreason
26236417Ssklower 
26336417Ssklower };
26436417Ssklower 
26536417Ssklower struct tpdu {
26636417Ssklower 	struct	tpdu_fixed 		_tpduf;
26736417Ssklower 	union 	tpdu_fixed_rest _tpdufr;
26836417Ssklower };
26936417Ssklower 
27060359Sbostic #endif /* __TP_TPDU__ */
271