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 + -
显示快捷键?