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