/* @(#)60	1.5  src/bos/usr/include/netiso/tp_param.h, sockinc, bos411, 9428A410j 3/5/94 12:41:37 */

/*
 * 
 * COMPONENT_NAME: (SOCKET) Socket services
 * 
 * FUNCTIONS: 
 *
 * ORIGINS: 26 27 
 *
 * (C) COPYRIGHT International Business Machines Corp. 1988, 1989, 1991
 * All Rights Reserved
 * Licensed Materials - Property of IBM
 *
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 *****************************************************************/

/*
 * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
 */
/* 
 * ARGO TP
 *
 * $Header: tp_param.h,v 5.3 88/11/18 17:28:18 nhall Exp $
 * $Source: /usr/argo/sys/netiso/RCS/tp_param.h,v $
 *	(#)tp_param.h	7.5 (Berkeley) 1/16/90 *
 *
 */

#ifndef __TP_PARAM__
#define __TP_PARAM__


/******************************************************
 * compile time parameters that can be changed
 *****************************************************/

#define 	TP_CLASSES_IMPLEMENTED 0x11 /* zero and 4 */

#define		TP_DECBIT_CLEAR_COUNT	3

#define 	N_TPREF				100

#define 	TP_SOCKBUFSIZE		((u_long)4096)
#define 	TP0_SOCKBUFSIZE		((u_long)512)
#define		MAX_TSAP_SEL_LEN	64

/* maximum tpdu size we'll accept: */
#define 	TP_TPDUSIZE			0xc		/* 4096 octets for classes 1-4*/
#define 	TP0_TPDUSIZE		0xb		/* 2048 octets for class 0 */
#define 	TP_DFL_TPDUSIZE		0x7		/* 128 octets default */
	/* NOTE: don't ever negotiate 8192 because could get 
	 * wraparound in checksumming
	 * (No mtu is likely to be larger than 4K anyway...)
	 */
#define		TP_NRETRANS			1
#define		TP_MAXPORT			0xefff

#define		TP_RTT_NUM			0x7
/* ALPHA: to be used in the context: gain= 1/(2**alpha), or 
 * put another way, gaintimes(x) (x)>>alpha (forgetting the case alpha==0) 
 */
#define 	TP_RTT_ALPHA		3 
#define 	TP_RTV_ALPHA		2

/*
 * not sure how to treat data on disconnect 
 */
#define 	T_CONN_DATA			0x1
#define 	T_DISCONNECT		0x2
#define 	T_DISC_DATA			0x4
#define 	T_XDATA				0x8

#define ISO_CLNS	 0
#define IN_CLNS	 	 1
#define ISO_CONS	 2
#define ISO_COSNS	 3
#define TP_MAX_NETSERVICES 3

/* Indices into tp stats ackreason[i] */
#define _ACK_DONT_ 0
#define _ACK_STRAT_EACH_ 0x1
#define _ACK_STRAT_FULLWIN_ 0x2
#define _ACK_DUP_ 0x3
#define _ACK_EOT_ 0x4
#define _ACK_REORDER_ 0x5
#define _ACK_USRRCV_ 0x6
#define _ACK_FCC_ 0x7
#define _ACK_NUM_REASONS_ 0x8

/* masks for use in tp_stash() */
#define ACK_DONT 			0
#define ACK_STRAT_EACH		(1<< _ACK_STRAT_EACH_)
#define ACK_STRAT_FULLWIN	(1<< _ACK_STRAT_FULLWIN_)
#define ACK_DUP 			(1<< _ACK_DUP_)
#define ACK_EOT				(1<< _ACK_EOT_)
#define ACK_REORDER			(1<< _ACK_REORDER_)

/******************************************************
 * constants used in the protocol 
 *****************************************************/

#define		TP_VERSION 			0x1

#define 	TP_MAX_HEADER_LEN	256

#define 	TP_MIN_TPDUSIZE		0x7		/* 128 octets */
#define 	TP_MAX_TPDUSIZE		0xd		/* 8192 octets */

#define		TP_MAX_XPD_DATA		0x10	/* 16 octets */
#define		TP_MAX_CC_DATA		0x20	/* 32 octets */
#define		TP_MAX_CR_DATA		TP_MAX_CC_DATA
#define		TP_MAX_DR_DATA		0x40	/* 64 octets */

#define		TP_XTD_FMT_BIT 	0x80000000
#define		TP_XTD_FMT_MASK	0x7fffffff
#define		TP_NML_FMT_BIT 	0x80
#define		TP_NML_FMT_MASK	0x7f

/*  
 * values for the tpdu_type field, 2nd byte in a tpdu 
 */

#define TP_MIN_TPDUTYPE 0x1

#define XPD_TPDU_type	0x1
#define XAK_TPDU_type	0x2
#define GR_TPDU_type	0x3	
#define AK_TPDU_type	0x6
#define ER_TPDU_type	0x7
#define DR_TPDU_type	0x8
#define DC_TPDU_type	0xc
#define CC_TPDU_type	0xd
#define CR_TPDU_type	0xe
#define DT_TPDU_type	0xf

#define TP_MAX_TPDUTYPE 0xf

/*
 * identifiers for the variable-length options in tpdus 
 */

#define		TPP_acktime			0x85
#define		TPP_residER			0x86
#define		TPP_priority		0x87
#define		TPP_transdelay		0x88
#define		TPP_throughput		0x89
#define		TPP_subseq			0x8a
#define		TPP_flow_cntl_conf	0x8c	/* not implemented */
#define		TPP_addl_info		0xe0
#define		TPP_tpdu_size		0xc0
#define		TPP_calling_sufx	0xc1
#define		TPP_invalid_tpdu	0xc1	/* the bozos used a value twice */
#define		TPP_called_sufx		0xc2
#define		TPP_checksum		0xc3
#define		TPP_vers			0xc4
#define		TPP_security		0xc5
#define		TPP_addl_opt		0xc6
#define		TPP_alt_class		0xc7
#define		TPP_perf_meas		0xc8	/* local item : perf meas on, svp */

/******************************************************
 * Some fundamental data types
 *****************************************************/
#ifndef		TRUE
#define		TRUE				1
#endif		/* TRUE */

#ifndef		FALSE
#define		FALSE				0
#endif		/* FALSE */

#define		TP_LOCAL				22
#define		TP_FOREIGN				33

#ifndef 	EOK
#define 	EOK 	0
#endif  	/* EOK */

#define 	TP_CLASS_0 	(1<<0)
#define 	TP_CLASS_1 	(1<<1)
#define 	TP_CLASS_2 	(1<<2)
#define 	TP_CLASS_3 	(1<<3)
#define 	TP_CLASS_4 	(1<<4)

#define 	TP_FORCE 	0x1
#define 	TP_STRICT 	0x2

#ifndef 	MNULL
#define 	MNULL				(struct mbuf *)0
#endif 	/* MNULL */
	/* if ../sys/mbuf.h gets MT_types up to 0x40, these will 
	 * have to be changed:
	 */
#define 	MT_XPD 				0x44	
#define 	MT_EOT 				0x40

#define		TP_ENOREF			0x80000000

typedef 	unsigned int	SeqNum;
typedef		unsigned short	RefNum;
typedef		int				ProtoHook;


/******************************************************
 * Some fundamental constants
 *****************************************************/

#define TP_MIN_WIN	2048
#define TP_MAX_WIN 16384
#define TP_MAX_WIN_UNPRIV 8192

/******************************************************
 * Macro used all over, for driver
 *****************************************************/

#define  DoEvent(x) \
  ((E.ev_number=(x)),(tp_driver(tpcb,&E)))

/******************************************************
 * Some macros used all over, for timestamping
 *****************************************************/

#define GET_CUR_TIME(tvalp) ((*tvalp) = time)

#ifdef TIMEFIX
#define GET_TIME_SINCE(oldtvalp, diffp) {\
	(diffp)->tv_sec = time.tv_sec - (oldtvalp)->tv_sec;\
	(diffp)->tv_usec = time.tv_usec - (oldtvalp)->tv_usec;\
	if( (diffp)->tv_usec <0 ) {\
		(diffp)->tv_sec --;\
		(diffp)->tv_usec = 1000000 - (diffp)->tv_usec;\
	}\
}
#else
#define GET_TIME_SINCE(oldtvalp, diffp) 
#endif /* TIMEFIX */
			
/******************************************************
 * Some macros used for address families
 *****************************************************/

#define satosiso(ADDR) ((struct sockaddr_iso *)(ADDR))
#define satosin(ADDR) ((struct sockaddr_in *)(ADDR))

/******************************************************
 * Macro used for changing types of mbufs
 *****************************************************/

#define CHANGE_MTYPE(m, TYPE)\
	if((m)->m_type != TYPE) { \
		mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[TYPE]++; \
		(m)->m_type = TYPE; \
	}

/******************************************************
 * Macros used for adding options to a tpdu header and for
 * parsing the headers.
 * Options are variable-length and must be bcopy-d because on the
 * RT your assignments must be N-word aligned for objects of length
 * N.  Such a drag.
 *****************************************************/

struct tp_vbp {
	u_char	tpv_code;
	char 	tpv_len;
	char	tpv_val;
};
#define vbptr(x) ((struct tp_vbp *)(x))
#define vbval(x,type) (*((type *)&(((struct tp_vbp *)(x))->tpv_val)))
#define vbcode(x) (vbptr(x)->tpv_code)
#define vblen(x) (vbptr(x)->tpv_len)

#define vb_putval(dst,type,src)\
	bcopy((caddr_t)&(src),(caddr_t)&(((struct tp_vbp *)(dst))->tpv_val),\
	sizeof(type))

#define vb_getval(src,type,dst)\
bcopy((caddr_t)&(((struct tp_vbp *)(src))->tpv_val),(caddr_t)&(dst),sizeof(type))

#define ADDOPTION(type, DU, len, src)\
{	register caddr_t P;\
	P = (caddr_t)(DU) + (int)((DU)->tpdu_li);\
	vbptr(P)->tpv_code = type;\
	vbptr(P)->tpv_len = len;\
	bcopy((caddr_t)&src, (caddr_t)&(vbptr(P)->tpv_val), (unsigned)len);\
	DU->tpdu_li += len+2;/* 1 for code, 1 for length */\
}
/******************************************************
 * Macro for the local credit:
 * uses max transmission unit for the ll
 * (as modified by the max TPDU size negotiated) 
 *****************************************************/

#if defined(ARGO_DEBUG)&&!defined(LOCAL_CREDIT_EXPAND)
#define LOCAL_CREDIT(tpcb) tp_local_credit(tpcb)
#else
#define LOCAL_CREDIT( tpcb ) {\
    register struct sockbuf *xxsb = &((tpcb)->tp_sock->so_rcv);\
    register int xxi = ((xxsb)->sb_hiwat-(xxsb)->sb_cc);\
    register int maxcredit = ((tpcb)->tp_xtd_format?0xffff:0xf);\
    xxi = (xxi<0) ? 0 : ((xxi)>>(tpcb)->tp_tpdusize);\
    xxi = MIN(xxi, maxcredit); \
    if (!(tpcb->tp_cebit_off)) { \
        (tpcb)->tp_lcredit = ROUND((tpcb)->tp_win_recv); \
        if (xxi < (tpcb)->tp_lcredit) { \
            (tpcb)->tp_lcredit = xxi; \
        } \
    } \
    else { \
        (tpcb)->tp_lcredit = xxi; \
    } \
}
#endif /* ARGO_DEBUG */

#ifdef _KERNEL

#ifndef  tp_NSTATES 

#include "tp_states.h"
#include "tp_events.h"

#endif  /* tp_NSTATES */ 
#endif /* _KERNEL */

#endif /* __TP_PARAM__ */
