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