print-decnet.c

来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 896 行 · 第 1/2 页

C
896
字号
			    (void)printf("ack %d ", ack & SGQ_MASK);			data_off += sizeof(short);			if (nsplen < data_off)			    goto trunc;			TCHECK(shp->sh_seq[1]);		        ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);			if (ack & SGQ_OACK) {	/* ackoth field */			    if ((ack & SGQ_ONAK) == SGQ_ONAK)				(void)printf("onak %d ", ack & SGQ_MASK);			    else				(void)printf("oack %d ", ack & SGQ_MASK);			    data_off += sizeof(short);			    if (nsplen < data_off)				goto trunc;			    TCHECK(shp->sh_seq[2]);			    ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);			}		    }		    (void)printf("seg %d ", ack & SGQ_MASK);#ifdef	PRINT_NSPDATA		    if (nsplen > data_off) {			dp = &(nspp[data_off]);			TCHECK2(*dp, nsplen - data_off);			pdata(dp, nsplen - data_off);		    }#endif		}		break;	    case MFS_ILS+MFS_INT:		printf("intr ");		{		    struct seghdr *shp = (struct seghdr *)nspp;		    int ack;#ifdef	PRINT_NSPDATA		    u_char *dp;#endif		    u_int data_off = sizeof(struct minseghdr);		    if (nsplen < data_off)			goto trunc;		    TCHECK(shp->sh_seq[0]);		    ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);		    if (ack & SGQ_ACK) {	/* acknum field */			if ((ack & SGQ_NAK) == SGQ_NAK)			    (void)printf("nak %d ", ack & SGQ_MASK);			else			    (void)printf("ack %d ", ack & SGQ_MASK);			data_off += sizeof(short);			if (nsplen < data_off)			    goto trunc;			TCHECK(shp->sh_seq[1]);		        ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);			if (ack & SGQ_OACK) {	/* ackdat field */			    if ((ack & SGQ_ONAK) == SGQ_ONAK)				(void)printf("nakdat %d ", ack & SGQ_MASK);			    else				(void)printf("ackdat %d ", ack & SGQ_MASK);			    data_off += sizeof(short);			    if (nsplen < data_off)				goto trunc;			    TCHECK(shp->sh_seq[2]);			    ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);			}		    }		    (void)printf("seg %d ", ack & SGQ_MASK);#ifdef	PRINT_NSPDATA		    if (nsplen > data_off) {			dp = &(nspp[data_off]);			TCHECK2(*dp, nsplen - data_off);			pdata(dp, nsplen - data_off);		    }#endif		}		break;	    case MFS_ILS:		(void)printf("link-service %d>%d ", src, dst);		{		    struct seghdr *shp = (struct seghdr *)nspp;		    struct lsmsg *lsmp =			(struct lsmsg *)&(nspp[sizeof(struct seghdr)]);		    int ack;		    int lsflags, fcval;		    if (nsplen < sizeof(struct seghdr) + sizeof(struct lsmsg))			goto trunc;		    TCHECK(shp->sh_seq[0]);		    ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);		    if (ack & SGQ_ACK) {	/* acknum field */			if ((ack & SGQ_NAK) == SGQ_NAK)			    (void)printf("nak %d ", ack & SGQ_MASK);			else			    (void)printf("ack %d ", ack & SGQ_MASK);			TCHECK(shp->sh_seq[1]);		        ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);			if (ack & SGQ_OACK) {	/* ackdat field */			    if ((ack & SGQ_ONAK) == SGQ_ONAK)				(void)printf("nakdat %d ", ack & SGQ_MASK);			    else				(void)printf("ackdat %d ", ack & SGQ_MASK);			    TCHECK(shp->sh_seq[2]);			    ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);			}		    }		    (void)printf("seg %d ", ack & SGQ_MASK);		    TCHECK(*lsmp);		    lsflags = EXTRACT_LE_8BITS(lsmp->ls_lsflags);		    fcval = EXTRACT_LE_8BITS(lsmp->ls_fcval);		    switch (lsflags & LSI_MASK) {		    case LSI_DATA:			(void)printf("dat seg count %d ", fcval);			switch (lsflags & LSM_MASK) {			case LSM_NOCHANGE:			    break;			case LSM_DONOTSEND:			    (void)printf("donotsend-data ");			    break;			case LSM_SEND:			    (void)printf("send-data ");			    break;			default:			    (void)printf("reserved-fcmod? %x", lsflags);			    break;			}			break;		    case LSI_INTR:			(void)printf("intr req count %d ", fcval);			break;		    default:			(void)printf("reserved-fcval-int? %x", lsflags);			break;		    }		}		break;	    default:		(void)printf("reserved-subtype? %x %d > %d", flags, src, dst);		break;	    }	    break;	case MFT_ACK:	    switch (flags & NSP_SUBMASK) {	    case MFS_DACK:		(void)printf("data-ack %d>%d ", src, dst);		{		    struct ackmsg *amp = (struct ackmsg *)nspp;		    int ack;		    if (nsplen < sizeof(struct ackmsg))			goto trunc;		    TCHECK(*amp);		    ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]);		    if (ack & SGQ_ACK) {	/* acknum field */			if ((ack & SGQ_NAK) == SGQ_NAK)			    (void)printf("nak %d ", ack & SGQ_MASK);			else			    (void)printf("ack %d ", ack & SGQ_MASK);		        ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]);			if (ack & SGQ_OACK) {	/* ackoth field */			    if ((ack & SGQ_ONAK) == SGQ_ONAK)				(void)printf("onak %d ", ack & SGQ_MASK);			    else				(void)printf("oack %d ", ack & SGQ_MASK);			}		    }		}		break;	    case MFS_IACK:		(void)printf("ils-ack %d>%d ", src, dst);		{		    struct ackmsg *amp = (struct ackmsg *)nspp;		    int ack;		    if (nsplen < sizeof(struct ackmsg))			goto trunc;		    TCHECK(*amp);		    ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]);		    if (ack & SGQ_ACK) {	/* acknum field */			if ((ack & SGQ_NAK) == SGQ_NAK)			    (void)printf("nak %d ", ack & SGQ_MASK);			else			    (void)printf("ack %d ", ack & SGQ_MASK);			TCHECK(amp->ak_acknum[1]);		        ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]);			if (ack & SGQ_OACK) {	/* ackdat field */			    if ((ack & SGQ_ONAK) == SGQ_ONAK)				(void)printf("nakdat %d ", ack & SGQ_MASK);			    else				(void)printf("ackdat %d ", ack & SGQ_MASK);			}		    }		}		break;	    case MFS_CACK:		(void)printf("conn-ack %d", dst);		break;	    default:		(void)printf("reserved-acktype? %x %d > %d", flags, src, dst);		break;	    }	    break;	case MFT_CTL:	    switch (flags & NSP_SUBMASK) {	    case MFS_CI:	    case MFS_RCI:		if ((flags & NSP_SUBMASK) == MFS_CI)		    (void)printf("conn-initiate ");		else		    (void)printf("retrans-conn-initiate ");		(void)printf("%d>%d ", src, dst);		{		    struct cimsg *cimp = (struct cimsg *)nspp;		    int services, info, segsize;#ifdef	PRINT_NSPDATA		    u_char *dp;#endif		    if (nsplen < sizeof(struct cimsg))			goto trunc;		    TCHECK(*cimp);		    services = EXTRACT_LE_8BITS(cimp->ci_services);		    info = EXTRACT_LE_8BITS(cimp->ci_info);		    segsize = EXTRACT_LE_16BITS(cimp->ci_segsize);		    switch (services & COS_MASK) {		    case COS_NONE:			break;		    case COS_SEGMENT:			(void)printf("seg ");			break;		    case COS_MESSAGE:			(void)printf("msg ");			break;		    case COS_CRYPTSER:			(void)printf("crypt ");			break;		    }		    switch (info & COI_MASK) {		    case COI_32:			(void)printf("ver 3.2 ");			break;		    case COI_31:			(void)printf("ver 3.1 ");			break;		    case COI_40:			(void)printf("ver 4.0 ");			break;		    case COI_41:			(void)printf("ver 4.1 ");			break;		    }		    (void)printf("segsize %d ", segsize);#ifdef	PRINT_NSPDATA		    if (nsplen > sizeof(struct cimsg)) {			dp = &(nspp[sizeof(struct cimsg)]);			TCHECK2(*dp, nsplen - sizeof(struct cimsg));			pdata(dp, nsplen - sizeof(struct cimsg));		    }#endif		}		break;	    case MFS_CC:		(void)printf("conn-confirm %d>%d ", src, dst);		{		    struct ccmsg *ccmp = (struct ccmsg *)nspp;		    int services, info;		    u_int segsize, optlen;#ifdef	PRINT_NSPDATA		    u_char *dp;#endif		    if (nsplen < sizeof(struct ccmsg))			goto trunc;		    TCHECK(*ccmp);		    services = EXTRACT_LE_8BITS(ccmp->cc_services);		    info = EXTRACT_LE_8BITS(ccmp->cc_info);		    segsize = EXTRACT_LE_16BITS(ccmp->cc_segsize);		    optlen = EXTRACT_LE_8BITS(ccmp->cc_optlen);		    switch (services & COS_MASK) {		    case COS_NONE:			break;		    case COS_SEGMENT:			(void)printf("seg ");			break;		    case COS_MESSAGE:			(void)printf("msg ");			break;		    case COS_CRYPTSER:			(void)printf("crypt ");			break;		    }		    switch (info & COI_MASK) {		    case COI_32:			(void)printf("ver 3.2 ");			break;		    case COI_31:			(void)printf("ver 3.1 ");			break;		    case COI_40:			(void)printf("ver 4.0 ");			break;		    case COI_41:			(void)printf("ver 4.1 ");			break;		    }		    (void)printf("segsize %d ", segsize);		    if (optlen) {			(void)printf("optlen %d ", optlen);#ifdef	PRINT_NSPDATA			if (optlen > nsplen - sizeof(struct ccmsg))			    goto trunc;			dp = &(nspp[sizeof(struct ccmsg)]);			TCHECK2(*dp, optlen);			pdata(dp, optlen);#endif		    }		}		break;	    case MFS_DI:		(void)printf("disconn-initiate %d>%d ", src, dst);		{		    struct dimsg *dimp = (struct dimsg *)nspp;		    int reason;		    u_int optlen;#ifdef	PRINT_NSPDATA		    u_char *dp;#endif		    if (nsplen < sizeof(struct dimsg))			goto trunc;		    TCHECK(*dimp);		    reason = EXTRACT_LE_16BITS(dimp->di_reason);		    optlen = EXTRACT_LE_8BITS(dimp->di_optlen);		    print_reason(reason);		    if (optlen) {			(void)printf("optlen %d ", optlen);#ifdef	PRINT_NSPDATA			if (optlen > nsplen - sizeof(struct dimsg))			    goto trunc;			dp = &(nspp[sizeof(struct dimsg)]);			TCHECK2(*dp, optlen);			pdata(dp, optlen);#endif		    }		}		break;	    case MFS_DC:		(void)printf("disconn-confirm %d>%d ", src, dst);		{		    struct dcmsg *dcmp = (struct dcmsg *)nspp;		    int reason;		    TCHECK(*dcmp);		    reason = EXTRACT_LE_16BITS(dcmp->dc_reason);		    print_reason(reason);		}		break;	    default:		(void)printf("reserved-ctltype? %x %d > %d", flags, src, dst);		break;	    }	    break;	default:	    (void)printf("reserved-type? %x %d > %d", flags, src, dst);	    break;	}	return (1);trunc:	return (0);}static struct tok reason2str[] = {	{ UC_OBJREJECT,		"object rejected connect" },	{ UC_RESOURCES,		"insufficient resources" },	{ UC_NOSUCHNODE,	"unrecognized node name" },	{ DI_SHUT,		"node is shutting down" },	{ UC_NOSUCHOBJ,		"unrecognized object" },	{ UC_INVOBJFORMAT,	"invalid object name format" },	{ UC_OBJTOOBUSY,	"object too busy" },	{ DI_PROTOCOL,		"protocol error discovered" },	{ DI_TPA,		"third party abort" },	{ UC_USERABORT,		"user abort" },	{ UC_INVNODEFORMAT,	"invalid node name format" },	{ UC_LOCALSHUT,		"local node shutting down" },	{ DI_LOCALRESRC,	"insufficient local resources" },	{ DI_REMUSERRESRC,	"insufficient remote user resources" },	{ UC_ACCESSREJECT,	"invalid access control information" },	{ DI_BADACCNT,		"bad ACCOUNT information" },	{ UC_NORESPONSE,	"no response from object" },	{ UC_UNREACHABLE,	"node unreachable" },	{ DC_NOLINK,		"no link terminate" },	{ DC_COMPLETE,		"disconnect complete" },	{ DI_BADIMAGE,		"bad image data in connect" },	{ DI_SERVMISMATCH,	"cryptographic service mismatch" },	{ 0,			NULL }};static voidprint_reason(register int reason){	printf("%s ", tok2str(reason2str, "reason-%d", reason));}const char *dnnum_string(u_short dnaddr){	char *str;	size_t siz;	int area = (u_short)(dnaddr & AREAMASK) >> AREASHIFT;	int node = dnaddr & NODEMASK;	str = (char *)malloc(siz = sizeof("00.0000"));	if (str == NULL)		error("dnnum_string: malloc");	snprintf(str, siz, "%d.%d", area, node);	return(str);}const char *dnname_string(u_short dnaddr){#ifdef HAVE_DNET_HTOA	struct dn_naddr dna;	dna.a_len = sizeof(short);	memcpy((char *)dna.a_addr, (char *)&dnaddr, sizeof(short));	return (strdup(dnet_htoa(&dna)));#else	return(dnnum_string(dnaddr));	/* punt */#endif}#ifdef	PRINT_NSPDATAstatic voidpdata(u_char *dp, u_int maxlen){	char c;	u_int x = maxlen;	while (x-- > 0) {	    c = *dp++;	    safeputchar(c);	}}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?