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.

397 lines
13 KiB
C

#ifndef TP4_ENCD_INCLUDED
#define TP4_ENCD_INCLUDED
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1996 - 2005, All Rights Reserved. */
/* */
/* PROPRIETARY AND CONFIDENTIAL */
/* */
/* MODULE NAME : tp4_encd.h */
/* PRODUCT(S) : Lean-T Stack */
/* */
/* MODULE DESCRIPTION : */
/* This header file defines structures and functions for */
/* encoding/decoding of class 4 TPDUs. */
/* */
/* Note: The following TP options are NOT supported: */
/* Transport Expedited Data */
/* Non-use of checksum */
/* Use of extended format. */
/* This is reflected in structures and defines below. */
/* */
/* For information see the: */
/* ISO 8073 "Information processing systems - Open Systems */
/* Interconnections - Connection oriented transport protocol */
/* specification. */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 05/25/05 EJV 06 Added include tp4.h */
/* 01/28/99 JRB 05 Move cltp_decode_nsdu proto to ACSE file. */
/* 12/01/97 JRB 04 CRITICAL: Don't use "sizeof" on structures. */
/* Caused padding on VXWORKS. */
/* 08/14/97 JRB 03 Add TP0/RFC1006 support defines & protos. */
/* Add tp_decode_* protos (were static before). */
/* 05/27/97 JRB 7.00 MMSEASE 7.0 release. */
/* 11/22/96 JRB 02 Add TP_PDU_TYPE_UD & cltp_decode_nsdu for CLTP.*/
/* 06/20/96 EJV 01 Created */
/************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
#include "tp4.h"
/* encoding for Transport Protocol class and options */
#define TP_CLASS_0 (ST_UCHAR) 0x00
#define TP_CLASS_1 (ST_UCHAR) 0x10
#define TP_CLASS_2 (ST_UCHAR) 0x20
#define TP_CLASS_3 (ST_UCHAR) 0x30
#define TP_CLASS_4 (ST_UCHAR) 0x40
#define TP_OPT_FORMAT_NORMAL (ST_UCHAR) 0x00
#define TP_OPT_FORMAT_EXTENDED (ST_UCHAR) 0x02
#define TP_CLASS_4_NORMAL (ST_UCHAR) (TP_CLASS_4 | TP_OPT_FORMAT_NORMAL)
#define TP_CLASS_4_EXT (ST_UCHAR) (TP_CLASS_4 | TP_OPT_FORMAT_EXTENDED)
#define TP_CLASS_MASK_OPT (ST_UCHAR) 0xF0 /* for masking opt in ASN1_CLASS_METHOD-OPT in CR */
/* encoding for TPDU type code */
#define TP_PDU_TYPE_CR (ST_UCHAR) 0xE0 /* 1110 xxxx */
#define TP_PDU_TYPE_CC (ST_UCHAR) 0xD0 /* 1101 xxxx */
#define TP_PDU_TYPE_DR (ST_UCHAR) 0x80 /* 1000 0000 */
#define TP_PDU_TYPE_DC (ST_UCHAR) 0xC0 /* 1100 0000 */
#define TP_PDU_TYPE_DT (ST_UCHAR) 0xF0 /* 1111 0000 */
#define TP_PDU_TYPE_ED (ST_UCHAR) 0x10 /* 0001 0000 */
#define TP_PDU_TYPE_AK (ST_UCHAR) 0x60 /* 0110 zzzz */
#define TP_PDU_TYPE_EA (ST_UCHAR) 0x20 /* 0010 0000 */
#define TP_PDU_TYPE_RJ (ST_UCHAR) 0x50 /* 0101 zzzz */
#define TP_PDU_TYPE_ER (ST_UCHAR) 0x70 /* 0111 0000 */
#define TP_PDU_TYPE_UD (ST_UCHAR) 0x40 /* 0100 0000 for CLTP */
#define TP_PDU_MASK_TYPE (ST_UCHAR) 0x0F /* for masking type to get CDT */
#define TP_PDU_MASK_CDT (ST_UCHAR) 0xF0 /* for masking CTD to get type */
/* encoding for max size of TPDU (parameter in the CR) */
#define TP_PDU_MAX_SIZE_65531 (ST_UCHAR) 0x0E /* kluge for TP0/RFC1006 only*/
#define TP_PDU_MAX_SIZE_8192 (ST_UCHAR) 0x0D
#define TP_PDU_MAX_SIZE_4096 (ST_UCHAR) 0x0C
#define TP_PDU_MAX_SIZE_2048 (ST_UCHAR) 0x0B
#define TP_PDU_MAX_SIZE_1024 (ST_UCHAR) 0x0A
#define TP_PDU_MAX_SIZE_512 (ST_UCHAR) 0x09
#define TP_PDU_MAX_SIZE_256 (ST_UCHAR) 0x08
#define TP_PDU_MAX_SIZE_128 (ST_UCHAR) 0x07
/* encoding EOT in DT TPDU - bit 8 */
#define TP_PDU_EOF (ST_UCHAR) 0x80
#define TP_PDU_MASK_EOF (ST_UCHAR) 0x7F /* for masking EOF to get SN (DT)*/
#define TP_PDU_MASK_SN (ST_UCHAR) 0x80 /* for masking SN to get EOF (DT)*/
#define TP_PDU_MASK_BIT8 (ST_UCHAR) 0x7F /* for masking bit 8 to get SN (AK)*/
/* encoding for DR reason */
#define TP_DR_NORMAL (ST_UCHAR) 0x80
#define TP_DR_CONGESTION (ST_UCHAR) 0x81
#define TP_DR_CLASS_UNSUPPORTED (ST_UCHAR) 0x82
#define TP_DR_DUPLICATE_SRC_REF (ST_UCHAR) 0x83
#define TP_DR_INVALID_REF (ST_UCHAR) 0x84
#define TP_DR_PROT_ERROR (ST_UCHAR) 0x85
#define TP_DR_REF_OVERFLOW (ST_UCHAR) 0x87
#define TP_DR_CR_REFUSED (ST_UCHAR) 0x88
#define TP_DR_HDR_INVALID (ST_UCHAR) 0x8A
#define TP_DR_NO_REASON (ST_UCHAR) 0x00
#define TP_DR_CONGESTION_AT_TSAP (ST_UCHAR) 0x01
#define TP_DR_NO_SESSION (ST_UCHAR) 0x02
#define TP_DR_ADDR_UNKNOWN (ST_UCHAR) 0x03
/* misc defines */
#define TP_MAX_CDT (ST_UCHAR) 0x0F
/*----------------------------------------------*/
/* Encoding and structures for TP parameters */
/*----------------------------------------------*/
/* encoding for TP version */
#define TP_VERSION (ST_UCHAR) 0x01
/* encoding for the parameter code in CR or CC TPDU variable part */
#define TP_PAR_CODE_TSAP_CALLING (ST_UCHAR) 0xC1
#define TP_PAR_CODE_TSAP_CALLED (ST_UCHAR) 0xC2
#define TP_PAR_CODE_TPDU_SIZE (ST_UCHAR) 0xC0
#define TP_PAR_CODE_VERSION (ST_UCHAR) 0xC4
#define TP_PAR_CODE_ADD_OPTIONS (ST_UCHAR) 0xC6
/* encoding for the parameter code in AK TPDU variable part */
#define TP_PAR_CODE_AK_SUB_SN (ST_UCHAR) 0x8A
#define TP_PAR_CODE_AK_FLOW_CTRL (ST_UCHAR) 0x8C
/* encoding for the parameter code in variable part (common to */
/* different TPDU types) */
#define TP_PAR_CODE_CHECKSUM (ST_UCHAR) 0xC3
/* encoding for CR TPDU additional options */
#define TP_OPT_CHECKSUM_USE (ST_UCHAR) 0x00
#define TP_OPT_CHECKSUM_NON_USE (ST_UCHAR) 0x02
#define TP_OPT_EXPEDITED_NON_USE (ST_UCHAR) 0x00
#define TP_OPT_EXPEDITED_USE (ST_UCHAR) 0x01
typedef struct
{
ST_UCHAR code; /* parameter code */
ST_UCHAR len; /* Parameter length */
ST_UCHAR value [2]; /* parameter value has variable length */
/* (defined as 2 bytes buffer, the ptr */
/* will allow us to access any len param*/
}TP_PAR;
#define TP_PAR_FIX_LEN 2
/* define above specifies only the fixed part */
/* of parameter (code and len) */
/* some parameters are fixed in size so we can define them here */
/* parameters length in CR or CC */
#define TP_PAR_LEN_TPDU_SIZE (TP_PAR_FIX_LEN + 1)
#define TP_PAR_LEN_VERSION (TP_PAR_FIX_LEN + 1)
#define TP_PAR_LEN_ADD_OPTIONS (TP_PAR_FIX_LEN + 1)
/* parameters length in AK */
#define TP_PAR_LEN_AK_SUB_SN (TP_PAR_FIX_LEN + 2)
#define TP_PAR_LEN_AK_FLOW_CTRL (TP_PAR_FIX_LEN + 8)
/* parameters length (common to different types of TPDU types) */
#define TP_PAR_LEN_CHECKSUM (TP_PAR_FIX_LEN + 2)
/* ! */
/* NOTE: ! only ST_UCHAR type should be in protocol structs to avoid */
/* ! packing or problems with sizeof operator. */
/* ! */
/*----------------------------------------------*/
/* Struct and defines for CR and CC TPDU */
/*----------------------------------------------*/
typedef struct
{
/* fixed part of header */
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type_cdt; /* TPDU type and CDT */
ST_UCHAR dest_ref [2]; /* Remote connection id (set to 0) */
ST_UCHAR src_ref [2]; /* Local connection id */
ST_UCHAR class_opt; /* Class and options */
}TP_FHDR_CX;
#define TP_FHDR_CX_LEN 7
/* for alloc of n_unitdata purposes the max len will be used */
/* fixed part of header */
/* local & remote TSAP */
/* TPDU size parameter */
/* TP version parameter */
/* checksum parameter */
/* additional opt param */
/* user data (max allowed)*/
#define TP_MAX_LEN_CX (TP_FHDR_CX_LEN + \
2*(TP_PAR_FIX_LEN + MAX_TSEL_LEN) + \
TP_PAR_LEN_TPDU_SIZE + \
TP_PAR_LEN_VERSION + \
TP_PAR_LEN_CHECKSUM + \
TP_PAR_LEN_ADD_OPTIONS + \
TP_MAX_CONN_UDATA)
/*--------------------------------------*/
/* Struct and defines for DR TPDU */
/*--------------------------------------*/
typedef struct
{
/* fixed part of header */
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type; /* TPDU type */
ST_UCHAR dest_ref [2]; /* Remote connection id (set to 0) */
ST_UCHAR src_ref [2]; /* Local connection id */
ST_UCHAR reason; /* Reason code for disconnect */
}TP_FHDR_DR;
#define TP_FHDR_DR_LEN 7
/* for alloc of n_unitdata the max len will be used. */
#define TP_MAX_LEN_DR (TP_FHDR_DR_LEN + TP_PAR_LEN_CHECKSUM)
/* no additional info parameter or user data in DR */
/*--------------------------------------*/
/* Struct and defines for DC TPDU */
/*--------------------------------------*/
typedef struct
{
/* fixed part of header */
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type; /* TPDU type */
ST_UCHAR dest_ref [2]; /* Remote connection id (set to 0) */
ST_UCHAR src_ref [2]; /* Local connection id */
}TP_FHDR_DC;
#define TP_FHDR_DC_LEN 6
/* for alloc of n_unitdata the max len will be used. */
#define TP_MAX_LEN_DC (TP_FHDR_DC_LEN + TP_PAR_LEN_CHECKSUM)
/*--------------------------------------*/
/* Struct and defines for DT TPDU */
/*--------------------------------------*/
typedef struct
{
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type; /* TPDU type */
ST_UCHAR dest_ref [2]; /* Remote connection id */
ST_UCHAR eot_sn; /* EOT flag and sequence number */
}TP_FHDR_DT;
#define TP_FHDR_DT_LEN 5
/* for alloc of n_unitdata use TP_HEAD_LEN_DT + udata_len */
#define TP_HEAD_LEN_DT (ST_UINT16)(TP_FHDR_DT_LEN + TP_PAR_LEN_CHECKSUM)
/* TP0 DT same as TP4 except doesn't use DST-REF. */
typedef struct
{
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type; /* TPDU type */
ST_UCHAR eot_sn; /* EOT flag and sequence number */
}TP0_FHDR_DT;
#define TP0_FHDR_DT_LEN 3
#define TP0_HEAD_LEN_DT (ST_UINT16)(TP0_FHDR_DT_LEN) /* no chksum*/
/*--------------------------------------*/
/* Struct and defines for AK TPDU */
/*--------------------------------------*/
typedef struct
{
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type_cdt; /* TPDU type and CDT */
ST_UCHAR dest_ref [2]; /* Remote connection id */
ST_UCHAR sn; /* Next expected DT TPDU sequence number*/
}TP_FHDR_AK;
#define TP_FHDR_AK_LEN 5
/* for alloc of n_unitdata the max len will be used. */
#define TP_MAX_LEN_AK (TP_FHDR_AK_LEN + TP_PAR_LEN_CHECKSUM)
/*--------------------------------------*/
/* Struct and defines for RJ TPDU */
/*--------------------------------------*/
typedef struct
{
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type_cdt; /* TPDU type and CDT */
ST_UCHAR dest_ref [2]; /* Remote connection id */
ST_UCHAR sn; /* Next expected DT TPDU sequence number*/
}TP_FHDR_RJ;
#define TP_FHDR_RJ_LEN 5
/* for alloc of n_unitdata the max len will be used. */
#define TP_MAX_LEN_RJ TP_FHDR_RJ_LEN
/*--------------------------------------*/
/* Struct and defines for ER TPDU */
/*--------------------------------------*/
typedef struct
{
ST_UCHAR hdr_len; /* hdr length (don't count the len byte)*/
ST_UCHAR type; /* TPDU type */
ST_UCHAR dest_ref [2]; /* Remote connection id */
ST_UCHAR reason; /* Code for reject couse */
}TP_FHDR_ER;
#define TP_FHDR_ER_LEN 5
/* for alloc of n_unitdata the max len will be used. */
#define TP_MAX_LEN_ER (TP_FHDR_ER_LEN + TP_PAR_LEN_CHECKSUM)
/*----------------------------------------------*/
/* Function prototypes for encoding/decoding */
/*----------------------------------------------*/
ST_UINT16 tp_encode_cx (ST_UCHAR *enc_buf, TPDU_CX *tpdu_cx, ST_UCHAR pdu_type);
ST_UINT16 tp_encode_dr (ST_UCHAR *enc_buf, TPDU_DR *tpdu_dr);
ST_UINT16 tp_encode_dc (ST_UCHAR *enc_buf, TPDU_DC *tpdu_dc);
ST_UINT16 tp_encode_dt (ST_UCHAR *enc_buf, TPDU_DT *tpdu_dt);
ST_UINT16 tp0_encode_dt (ST_UCHAR *enc_buf, TPDU_DT *tpdu_dt);
ST_UINT16 tp_encode_ak (ST_UCHAR *enc_buf, TPDU_AK *tpdu_ak);
ST_RET tp_decode_nsdu (N_UNITDATA *n_unitdata);
ST_UINT16 tp_decode_cx (TPDU_CX *tpdu_cx_rx, ST_UCHAR *pdu_ptr,
ST_UINT16 pdu_len, ST_UCHAR pdu_type, ST_UCHAR max_tpdu_len_enc);
ST_UINT16 tp_decode_dr (TPDU_DR *tpdu_dr_rx, ST_UCHAR *pdu_ptr,
ST_UINT16 pdu_len);
ST_UINT16 tp_decode_dc (TPDU_DC *tpdu_dc_rx, ST_UCHAR *pdu_ptr);
ST_UINT16 tp_decode_dt (TPDU_DT *tpdu_dt_rx, ST_UCHAR *pdu_ptr,
ST_UINT16 pdu_len);
ST_UINT16 tp0_decode_dt (TPDU_DT *tpdu_dt_rx, ST_UCHAR *pdu_ptr,
ST_UINT16 pdu_len);
ST_UINT16 tp_decode_ak (TPDU_AK *tpdu_ak_rx, ST_UCHAR *pdu_ptr);
ST_UINT16 tp_decode_rj (ST_UCHAR *pdu_ptr);
ST_UINT16 tp_decode_er (ST_UCHAR *pdu_ptr);
ST_VOID tp_log_tsdu (ST_VOID *tsdu, ST_UCHAR type, ST_UCHAR mask);
#ifdef __cplusplus
}
#endif
#endif /* end of 'already included' */