1*36407Ssklower /*********************************************************** 2*36407Ssklower Copyright IBM Corporation 1987 3*36407Ssklower 4*36407Ssklower All Rights Reserved 5*36407Ssklower 6*36407Ssklower Permission to use, copy, modify, and distribute this software and its 7*36407Ssklower documentation for any purpose and without fee is hereby granted, 8*36407Ssklower provided that the above copyright notice appear in all copies and that 9*36407Ssklower both that copyright notice and this permission notice appear in 10*36407Ssklower supporting documentation, and that the name of IBM not be 11*36407Ssklower used in advertising or publicity pertaining to distribution of the 12*36407Ssklower software without specific, written prior permission. 13*36407Ssklower 14*36407Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 15*36407Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 16*36407Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 17*36407Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 18*36407Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 19*36407Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 20*36407Ssklower SOFTWARE. 21*36407Ssklower 22*36407Ssklower ******************************************************************/ 23*36407Ssklower 24*36407Ssklower /* 25*36407Ssklower * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison 26*36407Ssklower */ 27*36407Ssklower /* 28*36407Ssklower * ARGO TP 29*36407Ssklower * 30*36407Ssklower * $Header: tp_param.h,v 5.3 88/11/18 17:28:18 nhall Exp $ 31*36407Ssklower * $Source: /usr/argo/sys/netiso/RCS/tp_param.h,v $ 32*36407Ssklower * 33*36407Ssklower */ 34*36407Ssklower 35*36407Ssklower #ifndef __TP_PARAM__ 36*36407Ssklower #define __TP_PARAM__ 37*36407Ssklower 38*36407Ssklower 39*36407Ssklower /****************************************************** 40*36407Ssklower * compile time parameters that can be changed 41*36407Ssklower *****************************************************/ 42*36407Ssklower 43*36407Ssklower #define TP_CLASSES_IMPLEMENTED 0x11 /* zero and 4 */ 44*36407Ssklower 45*36407Ssklower #define TP_DECBIT_CLEAR_COUNT 3 46*36407Ssklower 47*36407Ssklower #define N_TPREF 100 48*36407Ssklower 49*36407Ssklower #define TP_SOCKBUFSIZE 4096 50*36407Ssklower #define TP0_SOCKBUFSIZE 512 51*36407Ssklower #define MAX_TSAP_SEL_LEN 64 52*36407Ssklower 53*36407Ssklower /* maximum tpdu size we'll accept: */ 54*36407Ssklower #define TP_TPDUSIZE 0xc /* 4096 octets for classes 1-4*/ 55*36407Ssklower #define TP0_TPDUSIZE 0xb /* 2048 octets for class 0 */ 56*36407Ssklower #define TP_DFL_TPDUSIZE 0x7 /* 128 octets default */ 57*36407Ssklower /* NOTE: don't ever negotiate 8192 because could get 58*36407Ssklower * wraparound in checksumming 59*36407Ssklower * (No mtu is likely to be larger than 4K anyway...) 60*36407Ssklower */ 61*36407Ssklower #define TP_NRETRANS 1 62*36407Ssklower #define TP_MAXPORT 0xefff 63*36407Ssklower 64*36407Ssklower #define TP_RTT_NUM 0x7 65*36407Ssklower /* ALPHA: to be used in the context: gain= 1/(2**alpha), or 66*36407Ssklower * put another way, gaintimes(x) (x)>>alpha (forgetting the case alpha==0) 67*36407Ssklower */ 68*36407Ssklower #define TP_RTT_ALPHA 3 69*36407Ssklower #define TP_RTV_ALPHA 2 70*36407Ssklower 71*36407Ssklower /* 72*36407Ssklower * not sure how to treat data on disconnect 73*36407Ssklower */ 74*36407Ssklower #define T_CONN_DATA 0x1 75*36407Ssklower #define T_DISCONNECT 0x2 76*36407Ssklower #define T_DISC_DATA 0x4 77*36407Ssklower #define T_XDATA 0x8 78*36407Ssklower 79*36407Ssklower #define ISO_CLNS 0 80*36407Ssklower #define IN_CLNS 1 81*36407Ssklower #define ISO_CONS 2 82*36407Ssklower #define ISO_COSNS 3 83*36407Ssklower #define TP_MAX_NETSERVICES 3 84*36407Ssklower 85*36407Ssklower /* Indices into tp stats ackreason[i] */ 86*36407Ssklower #define _ACK_DONT_ 0 87*36407Ssklower #define _ACK_STRAT_EACH_ 0x1 88*36407Ssklower #define _ACK_STRAT_FULLWIN_ 0x2 89*36407Ssklower #define _ACK_DUP_ 0x3 90*36407Ssklower #define _ACK_EOT_ 0x4 91*36407Ssklower #define _ACK_REORDER_ 0x5 92*36407Ssklower #define _ACK_USRRCV_ 0x6 93*36407Ssklower #define _ACK_FCC_ 0x7 94*36407Ssklower #define _ACK_NUM_REASONS_ 0x8 95*36407Ssklower 96*36407Ssklower /* masks for use in tp_stash() */ 97*36407Ssklower #define ACK_DONT 0 98*36407Ssklower #define ACK_STRAT_EACH (1<< _ACK_STRAT_EACH_) 99*36407Ssklower #define ACK_STRAT_FULLWIN (1<< _ACK_STRAT_FULLWIN_) 100*36407Ssklower #define ACK_DUP (1<< _ACK_DUP_) 101*36407Ssklower #define ACK_EOT (1<< _ACK_EOT_) 102*36407Ssklower #define ACK_REORDER (1<< _ACK_REORDER_) 103*36407Ssklower 104*36407Ssklower /****************************************************** 105*36407Ssklower * constants used in the protocol 106*36407Ssklower *****************************************************/ 107*36407Ssklower 108*36407Ssklower #define TP_VERSION 0x1 109*36407Ssklower 110*36407Ssklower #define TP_MAX_HEADER_LEN 256 111*36407Ssklower 112*36407Ssklower #define TP_MIN_TPDUSIZE 0x7 /* 128 octets */ 113*36407Ssklower #define TP_MAX_TPDUSIZE 0xd /* 8192 octets */ 114*36407Ssklower 115*36407Ssklower #define TP_MAX_XPD_DATA 0x10 /* 16 octets */ 116*36407Ssklower #define TP_MAX_CC_DATA 0x20 /* 32 octets */ 117*36407Ssklower #define TP_MAX_CR_DATA TP_MAX_CC_DATA 118*36407Ssklower #define TP_MAX_DR_DATA 0x40 /* 64 octets */ 119*36407Ssklower 120*36407Ssklower #define TP_XTD_FMT_BIT 0x80000000 121*36407Ssklower #define TP_XTD_FMT_MASK 0x7fffffff 122*36407Ssklower #define TP_NML_FMT_BIT 0x80 123*36407Ssklower #define TP_NML_FMT_MASK 0x7f 124*36407Ssklower 125*36407Ssklower /* 126*36407Ssklower * values for the tpdu_type field, 2nd byte in a tpdu 127*36407Ssklower */ 128*36407Ssklower 129*36407Ssklower #define TP_MIN_TPDUTYPE 0x1 130*36407Ssklower 131*36407Ssklower #define XPD_TPDU_type 0x1 132*36407Ssklower #define XAK_TPDU_type 0x2 133*36407Ssklower #define GR_TPDU_type 0x3 134*36407Ssklower #define AK_TPDU_type 0x6 135*36407Ssklower #define ER_TPDU_type 0x7 136*36407Ssklower #define DR_TPDU_type 0x8 137*36407Ssklower #define DC_TPDU_type 0xc 138*36407Ssklower #define CC_TPDU_type 0xd 139*36407Ssklower #define CR_TPDU_type 0xe 140*36407Ssklower #define DT_TPDU_type 0xf 141*36407Ssklower 142*36407Ssklower #define TP_MAX_TPDUTYPE 0xf 143*36407Ssklower 144*36407Ssklower /* 145*36407Ssklower * identifiers for the variable-length options in tpdus 146*36407Ssklower */ 147*36407Ssklower 148*36407Ssklower #define TPP_acktime 0x85 149*36407Ssklower #define TPP_residER 0x86 150*36407Ssklower #define TPP_priority 0x87 151*36407Ssklower #define TPP_transdelay 0x88 152*36407Ssklower #define TPP_throughput 0x89 153*36407Ssklower #define TPP_subseq 0x8a 154*36407Ssklower #define TPP_flow_cntl_conf 0x8c /* not implemented */ 155*36407Ssklower #define TPP_addl_info 0xe0 156*36407Ssklower #define TPP_tpdu_size 0xc0 157*36407Ssklower #define TPP_calling_sufx 0xc1 158*36407Ssklower #define TPP_invalid_tpdu 0xc1 /* the bozos used a value twice */ 159*36407Ssklower #define TPP_called_sufx 0xc2 160*36407Ssklower #define TPP_checksum 0xc3 161*36407Ssklower #define TPP_vers 0xc4 162*36407Ssklower #define TPP_security 0xc5 163*36407Ssklower #define TPP_addl_opt 0xc6 164*36407Ssklower #define TPP_alt_class 0xc7 165*36407Ssklower #define TPP_perf_meas 0xc8 /* local item : perf meas on, svp */ 166*36407Ssklower 167*36407Ssklower /****************************************************** 168*36407Ssklower * Some fundamental data types 169*36407Ssklower *****************************************************/ 170*36407Ssklower #ifndef TRUE 171*36407Ssklower #define TRUE 1 172*36407Ssklower #endif TRUE 173*36407Ssklower 174*36407Ssklower #ifndef FALSE 175*36407Ssklower #define FALSE 0 176*36407Ssklower #endif FALSE 177*36407Ssklower 178*36407Ssklower #define TP_LOCAL 22 179*36407Ssklower #define TP_FOREIGN 33 180*36407Ssklower 181*36407Ssklower #ifndef EOK 182*36407Ssklower #define EOK 0 183*36407Ssklower #endif EOK 184*36407Ssklower 185*36407Ssklower #define TP_CLASS_0 (1<<0) 186*36407Ssklower #define TP_CLASS_1 (1<<1) 187*36407Ssklower #define TP_CLASS_2 (1<<2) 188*36407Ssklower #define TP_CLASS_3 (1<<3) 189*36407Ssklower #define TP_CLASS_4 (1<<4) 190*36407Ssklower 191*36407Ssklower #define TP_FORCE 0x1 192*36407Ssklower #define TP_STRICT 0x2 193*36407Ssklower 194*36407Ssklower #ifndef MNULL 195*36407Ssklower #define MNULL (struct mbuf *)0 196*36407Ssklower #endif MNULL 197*36407Ssklower /* if ../h/mbuf.h gets MT_types up to 0x40, these will 198*36407Ssklower * have to be changed: 199*36407Ssklower */ 200*36407Ssklower #define MT_XPD 0x44 201*36407Ssklower #define MT_EOT 0x40 202*36407Ssklower 203*36407Ssklower #define TP_ENOREF 0x80000000 204*36407Ssklower 205*36407Ssklower typedef unsigned int SeqNum; 206*36407Ssklower typedef unsigned short RefNum; 207*36407Ssklower typedef int ProtoHook; 208*36407Ssklower 209*36407Ssklower 210*36407Ssklower /****************************************************** 211*36407Ssklower * Some fundamental constants 212*36407Ssklower *****************************************************/ 213*36407Ssklower 214*36407Ssklower #define TP_MIN_WIN 2048 215*36407Ssklower #define TP_MAX_WIN 16384 216*36407Ssklower #define TP_MAX_WIN_UNPRIV 8192 217*36407Ssklower 218*36407Ssklower /****************************************************** 219*36407Ssklower * Macro used all over, for driver 220*36407Ssklower *****************************************************/ 221*36407Ssklower 222*36407Ssklower #define DoEvent(x) \ 223*36407Ssklower ((E.ev_number=(x)),(tp_driver(tpcb,&E))) 224*36407Ssklower 225*36407Ssklower /****************************************************** 226*36407Ssklower * Some macros used all over, for timestamping 227*36407Ssklower *****************************************************/ 228*36407Ssklower 229*36407Ssklower #define GET_CUR_TIME(tvalp) ((*tvalp) = time) 230*36407Ssklower 231*36407Ssklower #define GET_TIME_SINCE(oldtvalp, diffp) {\ 232*36407Ssklower (diffp)->tv_sec = time.tv_sec - (oldtvalp)->tv_sec;\ 233*36407Ssklower (diffp)->tv_usec = time.tv_usec - (oldtvalp)->tv_usec;\ 234*36407Ssklower if( (diffp)->tv_usec <0 ) {\ 235*36407Ssklower (diffp)->tv_sec --;\ 236*36407Ssklower (diffp)->tv_usec = 1000000 - (diffp)->tv_usec;\ 237*36407Ssklower }\ 238*36407Ssklower } 239*36407Ssklower 240*36407Ssklower /****************************************************** 241*36407Ssklower * Some macros used for address families 242*36407Ssklower *****************************************************/ 243*36407Ssklower 244*36407Ssklower #define satosiso(ADDR) ((struct sockaddr_iso *)(ADDR)) 245*36407Ssklower #define satosin(ADDR) ((struct sockaddr_in *)(ADDR)) 246*36407Ssklower 247*36407Ssklower /****************************************************** 248*36407Ssklower * Macro used for changing types of mbufs 249*36407Ssklower *****************************************************/ 250*36407Ssklower 251*36407Ssklower #define CHANGE_MTYPE(m, TYPE)\ 252*36407Ssklower if((m)->m_type != TYPE) { \ 253*36407Ssklower mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[TYPE]++; \ 254*36407Ssklower (m)->m_type = TYPE; \ 255*36407Ssklower } 256*36407Ssklower 257*36407Ssklower /****************************************************** 258*36407Ssklower * Macros used for adding options to a tpdu header and for 259*36407Ssklower * parsing the headers. 260*36407Ssklower * Options are variable-length and must be bcopy-d because on the 261*36407Ssklower * RT your assignments must be N-word aligned for objects of length 262*36407Ssklower * N. Such a drag. 263*36407Ssklower *****************************************************/ 264*36407Ssklower 265*36407Ssklower struct tp_vbp { 266*36407Ssklower u_char tpv_code; 267*36407Ssklower char tpv_len; 268*36407Ssklower char tpv_val; 269*36407Ssklower }; 270*36407Ssklower #define vbptr(x) ((struct tp_vbp *)(x)) 271*36407Ssklower #define vbval(x,type) (*((type *)&(((struct tp_vbp *)(x))->tpv_val))) 272*36407Ssklower #define vbcode(x) (vbptr(x)->tpv_code) 273*36407Ssklower #define vblen(x) (vbptr(x)->tpv_len) 274*36407Ssklower 275*36407Ssklower #define vb_putval(dst,type,src)\ 276*36407Ssklower bcopy((caddr_t)&(src),(caddr_t)&(((struct tp_vbp *)(dst))->tpv_val),\ 277*36407Ssklower sizeof(type)) 278*36407Ssklower 279*36407Ssklower #define vb_getval(src,type,dst)\ 280*36407Ssklower bcopy((caddr_t)&(((struct tp_vbp *)(src))->tpv_val),(caddr_t)&(dst),sizeof(type)) 281*36407Ssklower 282*36407Ssklower #define ADDOPTION(type, DU, len, src)\ 283*36407Ssklower { register caddr_t P;\ 284*36407Ssklower P = (caddr_t)(DU) + (int)((DU)->tpdu_li);\ 285*36407Ssklower vbptr(P)->tpv_code = type;\ 286*36407Ssklower vbptr(P)->tpv_len = len;\ 287*36407Ssklower bcopy((caddr_t)&src, (caddr_t)&(vbptr(P)->tpv_val), (int)len);\ 288*36407Ssklower DU->tpdu_li += len+2;/* 1 for code, 1 for length */\ 289*36407Ssklower } 290*36407Ssklower /****************************************************** 291*36407Ssklower * Macro for the local credit: 292*36407Ssklower * uses max transmission unit for the ll 293*36407Ssklower * (as modified by the max TPDU size negotiated) 294*36407Ssklower *****************************************************/ 295*36407Ssklower 296*36407Ssklower #if defined(ARGO_DEBUG)&&!defined(LOCAL_CREDIT_EXPAND) 297*36407Ssklower #define LOCAL_CREDIT(tpcb) tp_local_credit(tpcb) 298*36407Ssklower #else 299*36407Ssklower #define LOCAL_CREDIT( tpcb ) {\ 300*36407Ssklower register struct sockbuf *xxsb = &((tpcb)->tp_sock->so_rcv);\ 301*36407Ssklower register int xxi = ((xxsb)->sb_hiwat-(xxsb)->sb_cc);\ 302*36407Ssklower register int maxcredit = ((tpcb)->tp_xtd_format?0xffff:0xf);\ 303*36407Ssklower maxcredit = ((tpcb)->tp_decbit?1:maxcredit);\ 304*36407Ssklower xxi = (xxi<0) ? 0 : ((xxi)>>(tpcb)->tp_tpdusize);\ 305*36407Ssklower (tpcb)->tp_lcredit = MIN( xxi ,maxcredit );\ 306*36407Ssklower } 307*36407Ssklower #endif ARGO_DEBUG 308*36407Ssklower 309*36407Ssklower #ifdef KERNEL 310*36407Ssklower 311*36407Ssklower #ifndef tp_NSTATES 312*36407Ssklower 313*36407Ssklower #include "tp_states.h" 314*36407Ssklower #include "tp_events.h" 315*36407Ssklower 316*36407Ssklower #endif tp_NSTATES 317*36407Ssklower #endif KERNEL 318*36407Ssklower 319*36407Ssklower #endif __TP_PARAM__ 320