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