#ifndef TP4API_INCLUDED
#define TP4API_INCLUDED
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/*   (c) Copyright Systems Integration Specialists Company, Inc.,       */
/*   1996-2005 All Rights Reserved					*/
/*                                                                      */
/* MODULE NAME : tp4api.h                                             	*/
/* PRODUCT(S)  : TP4 API user include file                          	*/
/*                                                                      */
/* MODULE DESCRIPTION : 						*/
/*                                                                      */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE :                            */
/*                                                                      */
/* MODIFICATION LOG :                                                   */
/*  Date     Who   Rev                  Comments                        */
/* --------  ---  ------   -------------------------------------------  */
/* 07/27/05  JRB    23     Del obsolete DS_INFO, tp4_ds_*, odbc_ds_*.	*/
/* 05/05/05  EJV    22	   TP0_CFG: added rfc1006_listen_port		*/
/*			   TP4_ADDR added port.				*/
/* 04/06/05  EJV    21	   MMSEASE_MOSI: use 32 for MAX_TSEL_LEN	*/
/* 09/17/04  JRB    20     Chg tp?_connect to ret ST_LONG (i.e. conn_id)*/
/* 01/14/04  EJV    19	   TP0_CFG: added max_spdu_outst.		*/
/* 08/25/03  EJV    18     Added encrypt_ctrl arg to tp0_connect().	*/
/*			   Added param to tp4_connect macro.		*/
/* 06/20/02  JRB    17     Replace net_addr with union in TP4_ADDR.	*/
/*			   Chg addr args to tp4_connect_ind.		*/
/*			   Add tp0_convert_ip proto.			*/
/* 05/08/02  JRB    16     Add tp0_connect_outstanding_count proto.	*/
/* 01/22/02  JRB    15     Add max_conns arg to tp*_initialize.		*/
/* 05/10/01  JRB    14     Chg TSEL_LEN from 32 to 4.			*/
/* 03/14/01  JRB    13     Add global session_cfg w/ disconnect_timeout.*/
/* 08/05/99  JRB    12     Add hTcp... extern.				*/
/* 06/08/99  JRB    11     Change max_num_conns to ST_UINT16 to allow	*/
/*			   many more connections.			*/
/* 01/28/99  JRB    10     Addec cltp_decode_nsdu_fun funct ptr.	*/
/* 08/13/98  JRB    09     Lint cleanup.				*/
/* 06/18/98  JRB    08     Add TP_TYPE_TPX.				*/
/* 03/11/98  JRB    07     Del max_spdu_len from TP0_CFG & TP_CFG.	*/
/*			   Add keepalive to TP0_CFG.			*/
/* 09/04/07  JRB    06     Add max_spdu_len arg to tp4_initialize.	*/
/* 08/14/97  JRB    05     RFC1006 changes:				*/
/*			   - Add "tp0_*" protos.			*/
/*			   - Add "tp_type" to TP4_ADDR.			*/
/*			   - Add "tp0_cfg" config struct for RFC1006.	*/
/*			   - Chg "tp4_data" arg "data_len" to ST_UINT.	*/
/*			   - Replace tp4_reldata proto with dummy macro.*/
/*			   - Chg MAX_TP4_SEL to MAX_TSEL_LEN (ACSE uses)*/
/*			   - Chg MAX_NET_ADDR to MAX_IP_ADDR_LEN and	*/
/*			     increase to allow IP hostname.		*/ 
/* 08/04/97  JRB    04     Add max_tpdu_len_enc to TP_CFG (use instead	*/
/*			   of global max_tpdu_len_enc).			*/
/* 05/27/97  JRB   7.00    MMSEASE 7.0 release.				*/
/* 05/07/97  JRB    03     Added Error codes.				*/
/* 02/20/97  EJV    02     Added MOSI support: tp4_session_timer and	*/
/*			   tp4_session_timer_expired.			*/
/* 11/14/96  JRB    01     Created for LEAN_T only.			*/
/************************************************************************/

#ifdef __cplusplus
extern "C" {
#endif

#include "ssec.h"		/* for S_SEC_ENCRYPT_CTRL		*/
#include "clnp_usr.h"		/* Need CLNP_MAX_LEN_NSAP define.	*/

/* Defines for Transport type. Used to set "tp_type" in TP4_ADDR.	*/
#define TP_TYPE_TCP	0
#define TP_TYPE_TP4	1
#define TP_TYPE_TPX	2	/* allow TP4 and TCP at same time.	*/

/****************************************************************/
/*	Structure definitions					*/
/****************************************************************/

#if defined(MMSEASE_MOSI)
#define MAX_TSEL_LEN	32
#else
#define MAX_TSEL_LEN	4	/* GOSIP Ver2 recommends len of 2	*/ 
#endif
#define MAX_IP_ADDR_LEN	80	/* Big enough for IP hostname	*/

typedef struct tagTP4_ADDR
  {
#if !defined(REDUCED_STACK)
  ST_INT tp_type;	/* Type of transport: TP_TYPE_TP4 or TP_TYPE_TCP.*/
  ST_UINT tp4_sel_len;
  char tp4_sel[MAX_TSEL_LEN];
  ST_UINT net_addr_len;
  union
    {	/* If TP_TYPE_TP4, use "nsap". If TP_TYPE_TCP, use "ip".	*/
    ST_UCHAR nsap [CLNP_MAX_LEN_NSAP];	/* NSAP OR			*/
    ST_ULONG ip;			/* IP Addr (network byte order)	*/
    }netAddr;
  ST_UINT16 port;			/* remote port, optional param,	*/
  					/* defaults to 102 if not config*/
#else
  ST_UINT16 adlcAddr;
#endif
  } TP4_ADDR;

/****************************************************************/
/*	API prototypes						*/
/****************************************************************/

ST_RET tp4_initialize (ST_UINT max_conns, ST_UINT max_spdu_len);
ST_RET tp4_terminate (ST_VOID);

ST_BOOLEAN tp4_event (ST_VOID);

ST_RET tp4_bind (ST_LONG user_bind_id, TP4_ADDR *tp4_addr, 
		  ST_INT sharable, ST_INT max_conns);
ST_RET tp4_unbind (ST_LONG tp4_bind_id);

ST_LONG tp4_connect (ST_LONG tp4_bind_id, ST_LONG user_conn_id,
		     TP4_ADDR *rem_tp4_addr,
		     ST_INT conndata_len,
		     char *conndata,
                     S_SEC_ENCRYPT_CTRL *encrypt_ctrl);	/* connection encryption info	*/ 

ST_RET tp4_accept (ST_LONG tp4_conn_id, ST_LONG user_conn_id,
		    ST_INT conndata_len,
		    char *conndata);
ST_RET tp4_disconnect (ST_LONG tp4_conn_id,
		        ST_INT conndata_len,
		        char *conndata);
ST_RET tp4_data (ST_LONG tp4_conn_id,
		  ST_INT eot,
		  ST_UINT data_len,
		  char *data);
ST_RET tp4_expdata (ST_LONG tp4_conn_id,
		     ST_UINT data_len,
		     char *data);

/* The "tp4_reldata" function is not needed in this TP4 implementation,	*/
/* so define "tp4_reldata" macro which does nothing.			*/
#define tp4_reldata(databuf)

/* Function for MOSI implementation:	*/
ST_RET tp4_session_timer (ST_LONG tp_conn_id, ST_BOOLEAN start);

ST_RET tp0_initialize (ST_UINT max_conns, ST_UINT max_spdu_len);
ST_RET tp0_terminate (ST_VOID);

ST_BOOLEAN tp0_event (ST_VOID);

ST_RET tp0_bind (ST_LONG user_bind_id, TP4_ADDR *tp4_addr, 
		  ST_INT sharable, ST_INT max_conns);
ST_RET tp0_unbind (ST_LONG tp4_bind_id);

ST_LONG tp0_connect (ST_LONG tp4_bind_id, ST_LONG user_conn_id,
		     TP4_ADDR *rem_tp4_addr,
		     ST_INT conndata_len,
		     char *conndata,
                     S_SEC_ENCRYPT_CTRL *encrypt_ctrl);
ST_INT tp0_connect_outstanding_count (TP4_ADDR *tp4Addr);
ST_RET tp0_accept (ST_LONG tp4_conn_id, ST_LONG user_conn_id,
		    ST_INT conndata_len,
		    char *conndata);
ST_RET tp0_disconnect (ST_LONG tp4_conn_id,
		        ST_INT conndata_len,
		        char *conndata);
ST_RET tp0_data (ST_LONG tp4_conn_id,
		  ST_INT eot,
		  ST_UINT data_len,
		  char *data);

/* Function for MOSI implementation:	*/
ST_RET tp0_session_timer (ST_LONG tp_conn_id, ST_BOOLEAN start);

/****************************************************************/
/* Event callback function prototypes				*/
/****************************************************************/

ST_VOID tp4_bind_cnf (ST_LONG user_bind_id, ST_LONG tp4_bind_id, ST_RET result);
ST_VOID tp4_unbind_cnf (ST_LONG user_bind_id);

ST_VOID tp4_connect_ind (ST_LONG user_bind_id, ST_LONG tp4_conn_id, 
                      ST_UCHAR *loc_tsap, ST_UCHAR *rem_tsap,
                      ST_UCHAR *rem_nsap, ST_ULONG rem_ip,
                      ST_INT conndata_len, char *conndata);
ST_VOID tp4_connect_cnf (ST_LONG user_conn_id, ST_LONG tp4_conn_id, 
                      ST_INT conndata_len, char *conndata);
ST_VOID tp4_disconnect_ind (ST_LONG user_conn_id, ST_INT reason,
                         ST_INT conndata_len, char *conndata);
ST_VOID tp4_data_ind (ST_LONG user_conn_id, ST_INT eot, 
		   ST_UINT data_len, char *data);
ST_VOID tp4_expdata_ind (ST_LONG user_conn_id,
		      ST_UINT data_len, char *data);

/* Function for MOSI implementation:	*/
ST_VOID tp4_session_timer_expired (ST_LONG user_conn_id);

			 
/****************************************************************/
/* Log Control							*/
/****************************************************************/

#define TP4_LOG_ERR		0x00000001
#define TP4_LOG_FLOWUP		0x00000002
#define TP4_LOG_FLOWDOWN	0x00000004

extern ST_UINT tp4_debug_sel;

/****************************************************************/
/* Error Codes							*/
/****************************************************************/

#define TP4E_SHMALLOC		0x1201
#define TP4E_BADCONN		0x1202
#define TP4E_QUEUE_FULL		0x1203
#define TP4E_CONN_STATE		0x1204
#define TP4E_INVAL_TPDU_LEN	0x1205
#define TP4E_INVAL_REM_CDT	0x1206
#define TP4E_INVAL_LOC_CDT	0x1207
#define TP4E_INVAL_SPDU_OUTST	0x1208
#define TP4E_INVAL_NUM_CONNS	0x1209
#define TP4E_INVAL_SPDU_LEN	0x120A
#define TP4E_INVAL_WINDOW_TIME	0x120B
#define TP4E_INVAL_INACT_TIME	0x120C
#define TP4E_INVAL_RETRANS_TIME	0x120D
#define TP4E_INVAL_MAX_TRANS	0x120E
#define TP4E_MALLOC		0x120F
#define TP4E_INVAL_TSEL		0x1210
#define TP4E_TOO_MANY_BINDS	0x1211


/************************************************************************/
/* Global Configuration Structure Typedef.				*/
/************************************************************************/
typedef struct
  {
  ST_UINT16 max_tpdu_len;	/* max len of TPDU.  Base on SNPDU size.*/
			/* Use to allocate TPDU buffers.	*/
  ST_UCHAR max_tpdu_len_enc;	/* Binary encoded MAX TPDU len. Computed*/
				/* from max_tpdu_len by tp4_initialize.	*/
  ST_UCHAR max_rem_cdt;	/* Max credits we can handle.		*/
			/* Will allocate this many TPDU_DT	*/
			/* structs.				*/
			/* CRITICAL: MUST BE POWER OF 2.	*/
  ST_UCHAR loc_cdt;	/* CDT value we will ALWAYS send in ACK	*/
			/* We only accept in-sequence TPDUs so	*/
			/* only purpose of this is to		*/
			/* allow peer to send ahead.		*/
  ST_UCHAR max_spdu_outst;	/* Max # of SPDUs outstanding per conn.	*/
			/* Will allocate this many SPDU_INFO	*/
			/* structs for transmit queue.		*/
			/* CRITICAL: MUST BE POWER OF 2.	*/
  ST_UINT16 max_num_conns;	/* Max # Connections			*/
  ST_UINT16 window_time;	/* Window Time				*/
  ST_UINT16 inact_time;	/* Inactivity Time			*/
  ST_UINT16 retrans_time;	/* Retransmission Time			*/
  ST_UCHAR max_trans;	/* Max # of transmissions of a TPDU	*/
  ST_UCHAR ak_delay;	/* # of loops to delay sending AK.	*/
  } TP_CFG;

typedef struct
  {
  ST_UINT16 max_tpdu_len;	/* max len of TPDU.  Base on SNPDU size.*/
			/* Use to allocate TPDU buffers.	*/
  ST_UCHAR max_tpdu_len_enc;	/* Binary encoded MAX TPDU len. Computed*/
				/* from max_tpdu_len by tp0_initialize.	*/
  ST_UINT  max_spdu_outst;	/* Max # of SPDUs outstanding per conn.	*/
				/* that can be queued on the gensock2	*/
  ST_UINT16 max_num_conns;	/* Max # Connections			*/
  ST_BOOLEAN keepalive;		/* Use KEEPALIVE option on Sockets?	*/
  ST_UINT16 rfc1006_listen_port;/* RFC1006 listen port, optional param,	*/
  				/* will default to 102 if not configured*/
  } TP0_CFG;			/* For TP0/RFC1006 only.		*/

typedef struct
  {
  ST_UINT16 disconnect_timeout;	/* time to wait for T-disconnect.	*/
  } SESSION_CFG;

/************************************************************************/
/* Global Configuration Structure					*/
/* This structure must be filled in by user BEFORE tp4_initialize ().	*/
/* It MUST NOT change after tp4_initialize ().				*/
/************************************************************************/
extern TP_CFG tp_cfg;
extern TP0_CFG tp0_cfg;		/* For TP0/RFC1006 only.		*/
extern SESSION_CFG session_cfg;
  
/************************************************************************/
/* Global Variables							*/
/************************************************************************/
/* CLTP decode function pointer.	*/
extern ST_VOID (*cltp_decode_nsdu_fun) (N_UNITDATA *n_unitdata);

/************************************************************************/
/* Additional Prototypes for LEAN_T only.				*/
/************************************************************************/

ST_VOID tp4_except (ST_CHAR *filename, ST_INT line);
ST_VOID tp4_timer_tick (ST_VOID);
ST_RET tp4_config (ST_VOID);
ST_VOID tp4_init_timer (ST_VOID);
ST_VOID tp4_check_timer (ST_VOID);
ST_INT tp4_buffers_avail (ST_LONG tp4_conn_id);

ST_VOID tp0_timer_tick (ST_VOID);
ST_INT tp0_buffers_avail (ST_LONG tp4_conn_id);
ST_ULONG tp0_convert_ip (ST_CHAR *hostname);

/************************************************************************/
/* Event semaphore to indicate TCP events.				*/
/************************************************************************/
extern ST_EVENT_SEM hTcpEvent;

/************************************************************************/
/* Replacement function macros. If no TP4, call TP0 functions.		*/
/************************************************************************/
#if !defined (TP4_ENABLED)
#define tp4_initialize(a,b)	tp0_initialize(a,b)
#define tp4_terminate()		tp0_terminate()
#define tp4_event()		tp0_event()
#define tp4_bind(a,b,c,d)	tp0_bind(a,b,c,d)
#define tp4_unbind(a)		tp0_unbind(a)
#define tp4_connect(a,b,c,d,e,f) tp0_connect(a,b,c,d,e,f)
#define tp4_accept(a,b,c,d)	tp0_accept(a,b,c,d)
#define tp4_disconnect(a,b,c)	tp0_disconnect(a,b,c)
#define tp4_data(a,b,c,d)	tp0_data(a,b,c,d)
#define tp4_session_timer(a,b)	tp0_session_timer(a,b)
#define tp4_timer_tick()	tp0_timer_tick()
#define tp4_buffers_avail(a)	tp0_buffers_avail(a)
#endif	/* !defined (TP4_ENABLED)	*/

#ifdef __cplusplus
}
#endif
#endif	/* !TP4API_INCLUDED	*/
