📄 tsdu2spkt.c
字号:
/* tsdu2spkt.c - read/write a SPDU to a TSDU */#ifndef lintstatic char *rcsid = "$Header: /f/iso/ssap/RCS/tsdu2spkt.c,v 5.0 88/07/21 14:58:23 mrose Rel $";#endif/* * $Header: /f/iso/ssap/RCS/tsdu2spkt.c,v 5.0 88/07/21 14:58:23 mrose Rel $ * * * $Log$ *//* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * *//* LINTLIBRARY */#include <stdio.h>#include "spkt.h"#include "tailor.h"/* */struct local_buf { char *top; /* Top of buffer */ char *ptr; /* Pointer to working buffer */ int pgi; /* Offset of last PGI li */ int left; /* Number of bytes left */ int li; /* Running spdu length */ int allocli; /* Allocated li */ int len; /* Current buffer size */};/* */#define PMASK_NODATA 0x000000#define PMASK_CN_ID 0x000001 /* 1: Connection ID */#define PMASK_CN_ITEMS 0x000002 /* 5: Connect/Accept Item */#define PMASK_SYNC 0x000004 /* 15: Sync Type Item */#define PMASK_TOKEN 0x000008 /* 16: Token Item */#define PMASK_TDISC 0x000010 /* 17: Transport Disc */#define PMASK_USER_REQ 0x000020 /* 20: Session User Req */#define PMASK_VERSION 0x000040 /* 22: Version Number */#define PMASK_PREPARE 0x000080 /* 24: Prepare type */#define PMASK_ENCLOSE 0x000100 /* 25: Enclosure Item */#define PMASK_TOKEN_SET 0x000200 /* 26: Token Setting Item */#define PMASK_RESYNC 0x000400 /* 27: Resync type */#define PMASK_LINK 0x000800 /* 33: Linking information */#define PMASK_ACT_ID 0x001000 /* 41: Activity ID */#define PMASK_SERIAL 0x002000 /* 42: Serial Number */#define PMASK_MIA_DATA 0x004000 /* 46: MIA User Data */#define PMASK_REFLECT 0x008000 /* 49: Reflect parameter */#define PMASK_REASON 0x010000 /* 50: Refusal Reason */#define PMASK_SSAP_CALLING 0x020000 /* 51: Calling SSAP ID */#define PMASK_SSAP_CALLED 0x040000 /* 52: Called SSAP ID */#define PMASK_UDATA 0x080000 /* 193: User data */#define PMASK_XDATA 0x100000 /* 194: Extended user data */#define PMASK_VARLEN 0x800000 /* PI is Variable Len */#define PMASK_NOTSUPPORTED -1 /* Type not supported */static int si_table[] = { PMASK_REFLECT, /* 0x00: SPDU_ER */ PMASK_ENCLOSE /* 0x01: SPDU_GT & SPDU_DT */ | PMASK_TOKEN, PMASK_TOKEN /* 0x02: SPDU_PT */ | PMASK_ENCLOSE | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x03 */ PMASK_NOTSUPPORTED, /* 0x04 */ PMASK_NODATA, /* 0x05: SPDU_EX */ PMASK_NOTSUPPORTED, /* 0x06 */ PMASK_PREPARE, /* 0x07: SPDU_PR */ PMASK_ENCLOSE /* 0x08: SPDU_NF */ | PMASK_UDATA, PMASK_TDISC /* 0x09: SPDU_FN */ | PMASK_ENCLOSE | PMASK_UDATA, PMASK_ENCLOSE /* 0x0a: SPDU_DN */ | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x0b */ PMASK_CN_ID /* 0x0c: SPDU_RF */ | PMASK_TDISC | PMASK_USER_REQ | PMASK_VERSION | PMASK_ENCLOSE | PMASK_REASON, PMASK_CN_ID /* 0x0d: SPDU_CN */ | PMASK_CN_ITEMS | PMASK_USER_REQ | PMASK_VERSION | PMASK_SSAP_CALLING | PMASK_SSAP_CALLED | PMASK_UDATA | PMASK_XDATA, PMASK_CN_ID /* 0x0e: SPDU_AC */ | PMASK_CN_ITEMS | PMASK_USER_REQ | PMASK_VERSION | PMASK_SSAP_CALLING | PMASK_TOKEN | PMASK_ENCLOSE | PMASK_SSAP_CALLED | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x0f */ PMASK_NOTSUPPORTED, /* 0x10 */ PMASK_NOTSUPPORTED, /* 0x11 */ PMASK_NOTSUPPORTED, /* 0x12 */ PMASK_NOTSUPPORTED, /* 0x13 */ PMASK_NOTSUPPORTED, /* 0x14 */ PMASK_NODATA, /* 0x15: SPDU_GTC */ PMASK_NODATA, /* 0x16: SPDU_GTA */ PMASK_NOTSUPPORTED, /* 0x17 */ PMASK_NOTSUPPORTED, /* 0x18 */ PMASK_TDISC /* 0x19: SPDU_AB & SPDU_AI */ | PMASK_REFLECT | PMASK_REASON | PMASK_ENCLOSE | PMASK_UDATA, PMASK_NODATA, /* 0x1a: SPDU_AA & SPDU_AIA */ PMASK_NOTSUPPORTED, /* 0x1b */ PMASK_NOTSUPPORTED, /* 0x1c */ PMASK_LINK /* 0x1d: SPDU_AR */ | PMASK_ACT_ID | PMASK_ENCLOSE | PMASK_SERIAL | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x1e */ PMASK_NOTSUPPORTED, /* 0x1f */ PMASK_NOTSUPPORTED, /* 0x20 */ PMASK_ENCLOSE, /* 0x21: SPDU_TD */ PMASK_TOKEN_SET /* 0x22: SPDU_RA */ | PMASK_ENCLOSE | PMASK_SERIAL | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x23 */ PMASK_NOTSUPPORTED, /* 0x24 */ PMASK_NOTSUPPORTED, /* 0x25 */ PMASK_NOTSUPPORTED, /* 0x26 */ PMASK_NOTSUPPORTED, /* 0x27 */ PMASK_NOTSUPPORTED, /* 0x28 */ PMASK_SYNC /* 0x29: SPDU_MAP & SPDU_AE */ | PMASK_ENCLOSE | PMASK_SERIAL | PMASK_UDATA, PMASK_ENCLOSE /* 0x2a: SPDU_MAA & SPDU_AEA */ | PMASK_SERIAL | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x2b */ PMASK_NOTSUPPORTED, /* 0x2c */ PMASK_ENCLOSE /* 0x2d: SPDU_AS */ | PMASK_ACT_ID | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x2e */ PMASK_NOTSUPPORTED, /* 0x2f */ PMASK_ENCLOSE /* 0x30: SPDU_ED */ | PMASK_REASON | PMASK_UDATA, PMASK_SYNC /* 0x31: SPDU_MIP */ | PMASK_ENCLOSE | PMASK_SERIAL | PMASK_UDATA, PMASK_ENCLOSE /* 0x32: SPDU_MIA */ | PMASK_SERIAL | PMASK_MIA_DATA, PMASK_NOTSUPPORTED, /* 0x33 */ PMASK_NOTSUPPORTED, /* 0x34 */ PMASK_TOKEN_SET /* 0x35: SPDU_RS */ | PMASK_ENCLOSE | PMASK_RESYNC | PMASK_SERIAL | PMASK_UDATA, PMASK_NOTSUPPORTED, /* 0x36 */ PMASK_NOTSUPPORTED, /* 0x37 */ PMASK_NOTSUPPORTED, /* 0x38 */ PMASK_REASON, /* 0x39: SPDU_AD */ PMASK_NODATA, /* 0x3a: SPDU_ADA */ PMASK_NOTSUPPORTED, /* 0x3b */ PMASK_NOTSUPPORTED, /* 0x3c */ PMASK_ENCLOSE /* 0x3d: SPDU_CD */ | PMASK_UDATA, PMASK_ENCLOSE /* 0x3e: SPDU_CDA */ | PMASK_UDATA#ifdef HULA , PMASK_NOTSUPPORTED, /* 0x3f */ PMASK_VERSION /* 0x40: SPDU_UD */ | PMASK_SSAP_CALLING | PMASK_SSAP_CALLED | PMASK_UDATA#endif};#define SI_TABLE_LEN ((sizeof si_table) / (sizeof si_table[0]))/* */#define PGI_CN_ID 1#define PI_CALLED_SS 9#define PI_CALLING_SS 10#define PI_COMMON_REF 11#define PI_ADD_INFO 12#define PGI_CN_ITEMS 5#define PI_PROTOCOL_OPT 19#define PI_TSDU_MAXSIZ 21#define PI_VERSION 22#define PI_ISN 23#define PI_TOKEN_SET 26#define PI_ISN2 55#define PI_SYNC 15#define PI_TOKEN 16#define PI_TDISC 17#define PI_USER_REQ 20#define PI_PREPARE 24#define PI_ENCLOSE 25#define PI_RESYNC 27#define PGI_AR_LINK 33#define PI_AR_CALLED 9#define PI_AR_CALLING 10#define PI_AR_COMMON 11#define PI_AR_ADDT 12#define PI_AR_OLD 41#define PI_AR_SERIAL 42#define PI_ACT_ID 41#define PI_SERIAL 42#define PI_MIA_DATA 46#define PI_REFLECT 49#define PI_REASON 50#define PI_SSAP_CALLING 51#define PI_SSAP_CALLED 52#define PI_UDATA 193#define PI_XDATA 194static int pi_table[] = { 0, /* 0x00 */ PMASK_VARLEN | PMASK_CN_ID, /* 0x01: Connection ID */ 0, 0, 0, /* 0x02-04 */ PMASK_VARLEN | PMASK_CN_ITEMS, /* 0x05: Connect/Accept Item */ 0, 0, 0, /* 0x06-08 */ PMASK_VARLEN | PMASK_CN_ID | PMASK_LINK,/* 0x09: Called Session SS */ PMASK_VARLEN | PMASK_CN_ID | PMASK_LINK,/* 0x0a: Calling Session SS */ PMASK_VARLEN | PMASK_CN_ID | PMASK_LINK,/* 0x0b: Common Reference */ PMASK_VARLEN | PMASK_CN_ID | PMASK_LINK,/* 0x0c: Additional Info */ 0, 0, /* 0x0d-0e */ PMASK_SYNC, /* 0x0f: Sync Type Item */ PMASK_TOKEN, /* 0x10: Token Item */ PMASK_TDISC, /* 0x11: Transport Disc */ 0, /* 0x12 */ PMASK_CN_ITEMS, /* 0x13: Protocol Option */ PMASK_USER_REQ, /* 0x14: Session User Req */ PMASK_VARLEN | PMASK_CN_ITEMS, /* 0x15: TSDU Max Size */ PMASK_VERSION, /* 0x16: Version Number */ PMASK_VARLEN | PMASK_CN_ITEMS, /* 0x17: Initial Serial Num */ PMASK_PREPARE, /* 0x18: Prepare Type */ PMASK_ENCLOSE, /* 0x19: Enclosure Item */ PMASK_CN_ITEMS | PMASK_TOKEN_SET, /* 0x1a: Token setting item */ PMASK_RESYNC, /* 0x1b: Resync type */ 0, 0, 0, 0, 0, /* 0x1c-20 */ PMASK_VARLEN | PMASK_LINK, /* 0x21: Activity Link */ 0, 0, 0, 0, 0, 0, 0, /* 0x22-28 */ PMASK_VARLEN | PMASK_ACT_ID, /* 0x29: Activity ID */ PMASK_VARLEN | PMASK_SERIAL, /* 0x2a: Serial Number */ 0, 0, 0, /* 0x2b-2d */ PMASK_VARLEN | PMASK_MIA_DATA, /* 0x2e: MIA User Data */ 0, 0, /* 0x2f-30 */ PMASK_VARLEN | PMASK_REFLECT, /* 0x31: Reflect parameter */ PMASK_VARLEN | PMASK_REASON, /* 0x32: Refusal Reason */ PMASK_VARLEN | PMASK_SSAP_CALLING, /* 0x33: Calling SSAP ID */ PMASK_VARLEN | PMASK_SSAP_CALLED, /* 0x34: Called SSAP ID */ 0, 0, /* 0x35-36 */ PMASK_VARLEN | PMASK_CN_ITEMS /* 0x17: 2nd initial s/n */};#define PI_TABLE_LEN ((sizeof pi_table) / (sizeof pi_table[0]))/* */static int pi_length[PI_TABLE_LEN] = { 0, /* 0x00 */ SREF_USER_SIZE /* 0x01: Connection ID */ + SREF_COMM_SIZE + SREF_ADDT_SIZE + 6, 0, 0, 0, /* 0x02-04 */ 1 + 4 + 1 + 6 + 1 + 10, /* 0x05: Connect/Accept Item */ 0, 0, 0, /* 0x06-08 */ SREF_USER_SIZE, /* 0x09: Called Session SS */ SREF_USER_SIZE, /* 0x0a: Calling Session SS */ SREF_COMM_SIZE, /* 0x0b: Common Reference */ SREF_ADDT_SIZE, /* 0x0c: Additional Info */ 0, 0, /* 0x0d-0e */ 1, /* 0x0f: Sync Type Item */ 1, /* 0x10: Token Item */ 1, /* 0x11: Transport Disc */ 0, /* 0x12 */ 1, /* 0x13: Protocol Option */ 2, /* 0x14: Session User Req */ 4, /* 0x15: TSDU Max Size */ 1, /* 0x16: Version Number */ SIZE_CN_ISN, /* 0x17: Initial Serial Num */ 1, /* 0x18: Prepare Type */ 1, /* 0x19: Enclosure Item */ 1, /* 0x1a: Token setting item */ 1, /* 0x1b: Resync type */ 0, 0, 0, 0, 0, /* 0x1c-20 */ 2 * SREF_USER_SIZE /* 0x21: Activity Link */ + SREF_COMM_SIZE + SREF_ADDT_SIZE + SID_DATA_SIZE + SIZE_CN_ISN + 6 * 2, 0, 0, 0, 0, 0, 0, 0, /* 0x22-28 */ SID_DATA_SIZE, /* 0x29: Activity ID */ SIZE_CN_ISN, /* 0x2a: Serial Number */ 0, 0, 0, /* 0x2b-2d */ SEGMENT_MAX /* MIA_SIZE */, /* 0x2e: MIA User Data */ 0, 0, /* 0x2f-30 */ SEGMENT_MAX, /* 0x31: Reflect parameter */ RF_SIZE, /* 0x32: Refusal Reason */ SSSIZE, /* 0x33: Calling SSAP ID */ SSSIZE, /* 0x34: Called SSAP ID */ 0, 0, /* 0x35-36 */ SIZE_CN_ISN, /* 0x37: 2nd initial s/n */};/* */#define If_Set(flag) if (s -> s_mask & (flag))#define If_Reset(flag) if (!(s -> s_mask & (flag)))#define Set(flag) s -> s_mask |= (flag)#define Reset(flag) s -> s_mask &= ~(flag)#define Put_Item(code,value) \ put2spdu((code), pi_length[(code)], (value), &c)#define Put_Ref(r,code) \{ \ start_pgi (PGI_CN_ID, &c); \ if (r.sr_ulen) \ put2spdu (code, (int) r.sr_ulen, r.sr_udata, &c); \ if (r.sr_clen) \ put2spdu (PI_COMMON_REF, (int) r.sr_clen, r.sr_cdata, &c); \ if (r.sr_alen) \ put2spdu (PI_ADD_INFO, (int) r.sr_alen, r.sr_adata, &c); \ end_pgi (&c); \}#define Put_SSN(code,ssn) \{ \ if ((ssn) > SERIAL_MAX + 1) { \ if (c.len) \ free (c.top); \ s -> s_errno = SC_PROTOCOL; \ return NOTOK; \ } \ (void) sprintf (isn, "%lu", (ssn)); \ put2spdu ((code), strlen (isn), isn, &c); \}/* this used to check if (s -> s_ulen > (csize)) { if (c.len) free (c.top); s -> s_errno = SC_PROTOCOL; return NOTOK; } but with version 2 session, there's really no point... */#define Put_UData(csize) \{ \ if (s -> s_udata) { \ put2spdu (PI_UDATA, s -> s_ulen, s -> s_udata, &c); \ } \}#ifdef HULA#define Put_UNITData(csize) \{ \ if (s -> s_udata) { \ put2spdu (PI_UDATA, s -> s_ulen, s -> s_udata, &c); \ } \}#endif#define Put_XData(csize) \{ \ if (s -> s_udata) { \ put2spdu (s -> s_ulen > csize ? PI_XDATA : PI_UDATA, s -> s_ulen, \ s -> s_udata, &c); \ } \}#define Put_MData(csize) \{ \ if (s -> s_udata) { \ put2spdu (PI_MIA_DATA, s -> s_ulen, s -> s_udata, &c); \ } \}/* */static start_spdu (s, c, basesize)struct ssapkt *s;struct local_buf *c;int basesize;{ if (s -> s_udata) switch (s -> s_code) { case SPDU_DT: /* caller responsible for this... */#ifdef HULA case SPDU_UD:#endif case SPDU_EX: case SPDU_TD: break; default: if (s -> s_ulen) basesize += s -> s_ulen + (s -> s_ulen > 254 ? 4 : 2); break; } switch (s -> s_code) { case SPDU_CN: case SPDU_AC: If_Set (SMASK_CN_REF) { basesize += 2; if (s -> s_cn_reference.sr_ulen) basesize += 2 + s -> s_cn_reference.sr_ulen; if (s -> s_cn_reference.sr_clen) basesize += 2 + s -> s_cn_reference.sr_clen; if (s -> s_cn_reference.sr_alen) basesize += 2 + s -> s_cn_reference.sr_alen; } If_Set (SMASK_CN_CALLING) basesize += s -> s_callinglen + 2; If_Set (SMASK_CN_CALLED) basesize += s -> s_calledlen + 2; break; case SPDU_RF: If_Set (SMASK_RF_REF) { basesize += 2; if (s -> s_rf_reference.sr_ulen) basesize += 2 + s -> s_rf_reference.sr_ulen; if (s -> s_rf_reference.sr_clen) basesize += 2 + s -> s_rf_reference.sr_clen; if (s -> s_rf_reference.sr_alen) basesize += 2 + s -> s_rf_reference.sr_alen; } break; case SPDU_AR: basesize += 2; If_Set (SMASK_AR_REF) { if (s -> s_ar_reference.sr_ulen) basesize += 2 + s -> s_ar_reference.sr_ulen; if (s -> s_ar_reference.sr_clen) basesize += 2 + s -> s_ar_reference.sr_clen; if (s -> s_ar_reference.sr_alen) basesize += 2 + s -> s_ar_reference.sr_alen; if (s -> s_ar_reference.sr_vlen) basesize += 2 + s -> s_ar_reference.sr_vlen; } break; } if (basesize < 254) basesize = 254; c -> li = c -> pgi = 0; c -> len = basesize + ((basesize > 254) ? 4 : 2); if ((c -> top = malloc ((unsigned) c -> len)) == NULL) { c -> len = 0; s -> s_errno = SC_CONGEST; } else s -> s_errno = SC_ACCEPT; if ((c -> allocli = c -> left = basesize) > 254) c -> ptr = c -> top + 4; else c -> ptr = c -> top + 2;}/* */static int end_spdu (code, c)unsigned char code;struct local_buf *c;{ if (c -> len) { if (c -> allocli > 254) { if (c -> li < 255) { bcopy ((c -> top + 2), c -> top, (c -> len - c -> left)); *(c -> top + 1) = c -> li; c -> len = c -> li + 2; } else { *(c -> top + 1) = 255; *(c -> top + 2) = (c -> li >> 8) & 0xff; *(c -> top + 3) = c -> li & 0xff; c -> len = c -> li + 4; } } else { *(c -> top + 1) = c -> li; c -> len = c -> ptr - c -> top; } *c -> top = code; return OK; } return NOTOK;}/* */static start_pgi (code, c)unsigned char code;struct local_buf *c;{ put2spdu ((int) code, 0, NULLCP, c); if (c -> len) c -> pgi = (c -> ptr - c -> top - 1);}static end_pgi (c)struct local_buf *c;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -