⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsdu2spkt.c

📁 ftam等标准协议服务器和客户端的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 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 + -