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