You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

349 lines
15 KiB
C

#ifndef TP4_INCLUDED
#define TP4_INCLUDED
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1996-2005 All Rights Reserved */
/* */
/* MODULE NAME : tp4.h */
/* PRODUCT(S) : Lean-T Stack */
/* */
/* MODULE DESCRIPTION : */
/* TP4 main header file. */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 03/29/05 EJV 16 MMSEASE_MOSI: added tp0_check_... protos. */
/* 01/13/04 EJV 15 Changed tp0_send_... funcs to return value. */
/* 06/27/02 JRB 14 Add tp_dr_reason to TP_CONN. */
/* 10/25/01 JRB 13 Move replacement func macros to tp4api.h */
/* 05/07/01 JRB 12 Add loc_tsap, rem_tsap to TP_CONN, TP0_CONN. */
/* 07/19/99 RKR 11 Modified a macro so this file will install */
/* 06/08/99 JRB 10 Allow up to 1024 connections by using new */
/* macros to compute loc_ref_offset & loc_ref. */
/* 08/13/98 JRB 09 Lint cleanup. */
/* 08/14/97 JRB 08 Use MAX_TSEL_LEN defined in tp4api.h */
/* Add max_tpdu_len (negotiated) to TP_CONN. */
/* Add TP0/RFC1006 support defines & protos. */
/* 05/27/97 JRB 7.00 MMSEASE 7.0 release. */
/* 03/21/97 JRB 07 Add tp_free_spdu_all function. */
/* 02/20/97 EJV 06 Add session_timer to TP_CONN for MOSI implem.*/
/* 10/04/96 JRB 05 Add global variable max_tpdu_len_enc. */
/* Chg TPDU_CX param to max_tpdu_len_enc. */
/* 10/04/96 JRB 04 Chg send_ak_flag to ak_delay. */
/* 09/09/96 JRB 03 Add send_ak_flag to TP_CONN. */
/* 09/09/96 JRB 02 Add tp_send_cr, tp_setup_and_send_??, */
/* tp_send_dt_and_ak & tp_conn_clean prototypes.*/
/* 07/17/96 JRB 01 Created */
/************************************************************************/
#include "tp4api.h" /* need some TP4 user defs. */
#include "clnp_usr.h" /* TP4 uses CLNP user interface. */
#if defined (TP0_ENABLED)
#include "tp0_sock.h" /* TP0/RFC1006 sockets interface defs. */
#endif /* TP0_ENABLED */
#ifdef __cplusplus
extern "C" {
#endif
#define TP_MAX_CONN_UDATA 32
#define TP4_EXCEPT() tp4_except (thisFileName, __LINE__)
/************************************************************************/
/* The following defines used in computing "loc_ref" (16-bit value): */
/* TP_CONN_ID_BITS: number of bits to use for conn_id in loc_ref. */
/* TP_MAX_NUM_CONNS: max number of connections allowed. */
/* TP_CONN_ID_MASK: mask used to find conn_id in loc_ref. */
/* TP_LOC_REF_MOD: modulus to use for loc_ref_offset wrap around. */
/* When loc_ref_offset incremented to this value, */
/* go back to 1 (not 0 so loc_ref can never be 0). */
/* TP_CONN_ID_BITS, TP_CONN_ID_MASK, TP_MAX_NUM_CONNS & TP_LOC_REF_MOD */
/* are all related. If one changes, they must all change. */
/************************************************************************/
#define TP_CONN_ID_BITS 10
#define TP_CONN_ID_MASK 0x3ff /* 0000 0011 1111 1111 binary */
#define TP_MAX_NUM_CONNS 0x400 /* conn_id = 0 thru 0x3ff */
/* If 10 bits used for conn_id, 6 bits left for loc_ref_offset, so it */
/* must wrap around when it reaches 0100 0000 binary (i.e. 0x40). */
#define TP_LOC_REF_MOD 0x40 /* modulus for 6-bit value */
/************************************************************************/
/* Structure typedefs. */
/************************************************************************/
/* TPDU_CX - Used for CR or CC TPDU info. */
typedef struct
{
/* NOTE: the following options not supported: */
/* Transport Expedited Data. */
/* Non-use of checksum. */
/* Use of extended format. */
/* When sending CR, don't request any. */
/* When sending CC, don't accept any. */
ST_UCHAR loc_tsap [1+MAX_TSEL_LEN]; /* Local len & TSAP addr */
ST_UCHAR rem_tsap [1+MAX_TSEL_LEN]; /* Remote len & TSAP addr */
ST_UINT16 loc_ref; /* Local Reference for conn. */
ST_UINT16 rem_ref; /* Remote Reference for conn. */
ST_UCHAR max_tpdu_len_enc; /* Negotiated Max TPDU len (encoded). */
ST_UCHAR preferred_class; /* Preferred Transport Class 0-4 */
ST_UCHAR cdt; /* CDT */
ST_UCHAR *rem_mac; /* Remote MAC addr */
ST_UCHAR *rem_nsap; /* Remote len & NSAP addr */
ST_UINT16 udata_len; /* Length of CR/CC User Data. */
ST_CHAR udata_buf [TP_MAX_CONN_UDATA]; /* Buffer for CR/CC User Data. */
#if defined (TP0_ENABLED)
SOCK_INFO *sock_info; /* socket info for TP0 conns only */
#endif /* TP0_ENABLED */
} TPDU_CX;
typedef struct
{
ST_UINT16 loc_ref; /* Local Reference for conn. */
ST_UINT16 rem_ref; /* Remote Reference for conn. */
ST_UCHAR reason; /* Reason for disconnect. */
ST_UCHAR *rem_mac; /* Remote MAC addr */
ST_UCHAR *rem_nsap; /* Remote len & NSAP addr */
#if defined (TP0_ENABLED)
SOCK_INFO *sock_info; /* socket info for TP0 conns only */
#endif /* TP0_ENABLED */
} TPDU_DR;
typedef TPDU_DR TPDU_DC; /* Same as DR but ignore "reason". */
typedef struct
{
ST_UINT16 dst_ref; /* Dest Reference for conn. */
ST_UCHAR sn;
ST_UCHAR cdt;
ST_UCHAR *rem_mac; /* Remote MAC addr */
ST_UCHAR *rem_nsap; /* Remote len & NSAP addr */
} TPDU_AK;
typedef struct
{
ST_UINT16 dst_ref; /* Dest Reference for conn. */
ST_UCHAR sn; /* Sequence #. */
ST_BOOLEAN eot; /* DT TPDU contains or should contain EOT flag */
ST_UCHAR *rem_mac; /* Remote MAC addr */
ST_UCHAR *rem_nsap; /* Remote len & NSAP addr */
ST_CHAR *udata_ptr; /* Pointer to DT User Data. */
ST_UINT16 udata_len; /* Length of DT User Data. */
#if defined (TP0_ENABLED)
SOCK_INFO *sock_info; /* socket info for TP0 conns only */
#endif /* TP0_ENABLED */
} TPDU_DT;
typedef struct
{
ST_CHAR *spdu_ptr; /* Pointer to SPDU. */
ST_UINT spdu_len; /* Length of SPDU. */
ST_UINT offset; /* Offset into SPDU. */
} SPDU_INFO;
typedef struct
{
/* NOTE: "state" is first in this struct because it will be */
/* accessed most often (every time connection made must scan array */
/* for a TP_CONN with state == TP_STATE_CLOSED). */
ST_UCHAR state; /* State of connection (initially CLOSED). */
ST_UCHAR tp_dr_reason; /* reason for disconnect (0 if connected)*/
ST_UINT16 loc_ref_offset; /* Used to compute loc_ref (see calc_loc_ref)*/
ST_UINT16 rem_ref; /* Peer's reference # for this connection. */
ST_UINT16 window_time; /* Window Time */
ST_UINT16 inact_time; /* Inactivity Time */
ST_UINT16 retrans_time; /* Retransmission Time */
ST_UCHAR lower_tx_sn; /* Sequence # for peer's lower window edge. */
ST_UCHAR adj_rem_cdt; /* Last CDT received from peer. */
/* Adjusted to stay within our limits. */
ST_UCHAR next_tx_sn; /* Sequence # for next TPDU to send to peer. */
ST_UCHAR next_rx_sn; /* Sequence # for next TPDU to receive from peer*/
TPDU_DT *tpdu_dt_tx; /* ptr to array of "max_rem_cdt" structs */
/* Allocated by tp4_initialize (). */
ST_UCHAR num_spdu_outst; /* # of SPDUs outstanding */
ST_UCHAR spdu_cnt_qued; /* Count of SPDUs queued. Goes to 0 on overflow */
ST_UCHAR spdu_cnt_sent; /* Count of SPDUs sent. Goes to 0 on overflow */
ST_UCHAR spdu_cnt_done; /* Count of SPDUs done. Goes to 0 on overflow */
SPDU_INFO *spdu_tx; /* ptr to array of "max_spdu_outst" structs */
SPDU_INFO spdu_rx; /* Struct for one received SPDU */
ST_BOOLEAN spdu_rx_start; /* Next TPDU rcvd is start of SPDU. */
/* Save rem_mac & rem_nsap received from CLNP with CR or CC. */
ST_UCHAR rem_mac [CLNP_MAX_LEN_MAC]; /* Remote MAC addr */
ST_UCHAR rem_nsap [1+CLNP_MAX_LEN_NSAP]; /* Remote len & NSAP addr */
ST_UCHAR num_trans; /* (TX ONLY) # of times a TPDU transmitted */
ST_LONG user_conn_id; /* User's ID for this conn. */
TPDU_CX tpdu_cx; /* CR or CC Info to Send/Receive. */
ST_UCHAR ak_delay; /* # of loops to delay sending AK. */
ST_UINT16 session_timer; /* Session timer for MOSI implementation */
ST_UINT16 max_tpdu_len; /* Negotiated TPDU len on this conn. */
ST_UCHAR loc_tsap [1+MAX_TSEL_LEN]; /* Local len & TSAP addr */
ST_UCHAR rem_tsap [1+MAX_TSEL_LEN]; /* Remote len & TSAP addr */
} TP_CONN;
typedef struct
{
/* NOTE: "state" is first in this struct because it will be */
/* accessed most often (every time connection made must scan array */
/* for a TP_CONN with state == TP_STATE_CLOSED). */
ST_UCHAR state; /* State of connection (initially CLOSED). */
ST_UINT16 loc_ref_offset; /* Used to compute loc_ref (see calc_loc_ref)*/
ST_UINT16 rem_ref; /* Peer's reference # for this connection. */
SPDU_INFO spdu_rx; /* Struct for one received SPDU */
ST_BOOLEAN spdu_rx_start; /* Next TPDU rcvd is start of SPDU. */
ST_LONG user_conn_id; /* User's ID for this conn. */
TPDU_CX tpdu_cx; /* CR or CC Info to Send/Receive. */
ST_UINT16 session_timer; /* Session timer for MOSI implementation */
ST_UINT16 max_tpdu_len; /* Negotiated TPDU len on this conn. */
#if defined (TP0_ENABLED)
SOCK_INFO *sock_info; /* socket info for TP0 conns only */
#endif /* TP0_ENABLED */
ST_UCHAR loc_tsap [1+MAX_TSEL_LEN]; /* Local len & TSAP addr */
ST_UCHAR rem_tsap [1+MAX_TSEL_LEN]; /* Remote len & TSAP addr */
} TP0_CONN;
/************************************************************************/
/* Miscellaneous Defines. */
/************************************************************************/
#define MODULUS_SN 128 /* Sequence # Modulus (2**7) */
/************************************************************************/
/* Defines for TP4 connection states. */
/************************************************************************/
#define TP_STATE_CLOSED 0
#define TP_STATE_WFCC 1
#define TP_STATE_WBCL 2
#define TP_STATE_OPEN 3
#define TP_STATE_WFTRESP 4
#define TP_STATE_AKWAIT 5
#define TP_STATE_CLOSING 6
#define TP_STATE_WFNC 7 /* for TP0/RFC1006 only */
/************************************************************************/
/* Defines for types of TPDUs. */
/************************************************************************/
#define TPDU_TYPE_CR 0
#define TPDU_TYPE_CC 1
#define TPDU_TYPE_DR 2
#define TPDU_TYPE_DC 3
#define TPDU_TYPE_DT 4
#define TPDU_TYPE_AK 5
/************************************************************************/
/* Miscellaneous defines. */
/************************************************************************/
#define MIN_TP0_CONN_ID 10000 /* min tp_conn_id for TP0 so */
/* don't overlap with TP4 id's */
/* WARNING: We assume TP_MAX_NUM_CONNS <= MIN_TP0_CONN_ID so TP0 conn */
/* id's can't overlap with TP4 conn id's. */
/* Let's just make sure this assumption is valid. */
#if (TP_MAX_NUM_CONNS > MIN_TP0_CONN_ID)
#error TP_MAX_NUM_CONNS > MIN_TP0_CONN_ID. Definitions incompatible.
#endif
/************************************************************************/
/* Global variables. */
/************************************************************************/
extern TP_CONN *tp_conn_arr; /* ptr to array of "max_num_conns" structs */
extern ST_LONG only_tp4_bind_id; /* Only one tp4_bind_id. */
extern ST_LONG only_user_bind_id; /* Only one user_bind_id. */
extern ST_UCHAR only_loc_tsap []; /* Local len & TSAP addr */
extern ST_UCHAR max_tpdu_len_enc; /* Binary encoded MAX TPDU len. */
extern TP0_CONN *tp0_conn_arr; /* ptr to array of "max_num_conns" structs */
extern ST_LONG only_tp0_bind_id; /* Only one tp0_bind_id. */
extern ST_LONG only_tp0_user_bind_id; /* Only one tp0_user_bind_id. */
extern ST_UCHAR only_tp0_loc_tsap []; /* Local len & TSAP addr */
/************************************************************************/
/* Prototypes */
/************************************************************************/
ST_VOID tp_setup_and_send_ak (TP_CONN *tp_conn);
ST_VOID tp_setup_and_send_dr (TP_CONN *tp_conn);
ST_VOID tp_send_cr (TPDU_CX *tpdu_cr);
ST_VOID tp_send_cc (TPDU_CX *tpdu_cc);
ST_VOID tp_send_dr (TPDU_DR *tpdu_dr);
ST_VOID tp_send_dc (TPDU_DC *tpdu_dc);
ST_VOID tp_send_dt (TPDU_DT *tpdu_dt);
ST_VOID tp_send_ak (TPDU_AK *tpdu_ak);
ST_VOID tp_send_dt_and_ak (TPDU_DT *tpdu_dt, TPDU_AK *tpdu_ak);
ST_VOID tp_process_cr (TPDU_CX *tpdu_cr_rx);
ST_VOID tp_process_cc (TPDU_CX *tpdu_cc_rx);
ST_VOID tp_process_dr (TPDU_DR *tpdu_dr_rx);
ST_VOID tp_process_dc (TPDU_DC *tpdu_dc_rx);
ST_VOID tp_process_dt (TPDU_DT *tpdu_dt_rx);
ST_VOID tp_process_ak (TPDU_AK *tpdu_ak_rx);
ST_VOID tp_conn_clean (TP_CONN *tp_conn);
ST_VOID tp_free_spdu_all (TP_CONN *tp_conn);
ST_RET tp0_send_cr (TPDU_CX *tpdu_cr);
ST_RET tp0_send_cc (TPDU_CX *tpdu_cc);
ST_RET tp0_send_dr (TPDU_DR *tpdu_dr);
ST_RET tp0_send_dt (TPDU_DT *tpdu_dt);
ST_VOID tp0_process_cr (TPDU_CX *tpdu_cr_rx);
ST_VOID tp0_process_cc (TPDU_CX *tpdu_cc_rx);
ST_VOID tp0_process_dr (TPDU_DR *tpdu_dr_rx);
ST_VOID tp0_process_dt (TPDU_DT *tpdu_dt_rx);
ST_VOID tp0_conn_clean (TP0_CONN *tp_conn);
#if defined(MMSEASE_MOSI)
ST_RET tp0_check_tsel (ST_UCHAR *tsel, ST_LONG *user_bind_id);
ST_RET tp0_check_bind_id (ST_LONG bind_id, ST_UCHAR **tsel);
#endif
/************************************************************************/
/* Macros. */
/************************************************************************/
/*----------------------------------------------------------------------*/
/* inc_loc_ref_offset */
/* Increment "loc_ref_offset". When the value reaches TP_LOC_REF_MOD */
/* (defined above), wrap around back to 1. */
/* NOTE: We do not wrap to 0, so "loc_ref_offet" will never be 0. */
/* "loc_ref_offset" is used to compute "loc_ref", so "loc_ref" */
/* will also never be 0. */
/* Arg #1: value (i.e. loc_ref_offset) to be incremented */
/* Example of usage: */
/* inc_loc_ref_offset (tp_conn->loc_ref_offset); */
/*----------------------------------------------------------------------*/
#define inc_loc_ref_offset(value) {\
if (++(value) >= TP_LOC_REF_MOD) \
(value) = 1; } /* comment necessary for DDB installation tool */
/*----------------------------------------------------------------------*/
/* calc_loc_ref */
/* Calculate loc_ref from conn_id and loc_ref_offset. */
/* IMPORTANT: loc_ref_offset MUST NEVER be 0, so loc_ref will never be 0.*/
/* This is accomplished by using ONLY the "inc_loc_ref_offset"*/
/* macro above to change the value of "loc_ref_offset". */
/*----------------------------------------------------------------------*/
#define calc_loc_ref(conn_id,loc_ref_offset) \
((conn_id) | ((loc_ref_offset) << TP_CONN_ID_BITS))
/*----------------------------------------------------------------------*/
/* calc_conn_id */
/* Calculate conn_id from loc_ref. */
/*----------------------------------------------------------------------*/
#define calc_conn_id(loc_ref) \
((loc_ref) & TP_CONN_ID_MASK)
#ifdef __cplusplus
}
#endif
#endif /* !TP4_INCLUDED */