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

📄 print-icmp6.c

📁 Windump3.6.2源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}		printf(", ");		printf("preffered_ltime=");		if ((u_int32_t)ntohl(opp->nd_opt_pi_preferred_time) == ~0U)			printf("infinity");		else {			printf("%u", (u_int32_t)ntohl(opp->nd_opt_pi_preferred_time));		}		printf(", ");		printf("prefix=%s/%d", ip6addr_string(&opp->nd_opt_pi_prefix),			opp->nd_opt_pi_prefix_len);		if (opp->nd_opt_pi_len != 4)			printf("!");		/*(*/		printf(")");		icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),				resid - (op->nd_opt_len << 3));		break;	case ND_OPT_REDIRECTED_HEADER:		opr = (struct icmp6_opts_redirect *)op;		printf("(redirect)");		/* xxx */		icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),				resid - (op->nd_opt_len << 3));		break;	case ND_OPT_MTU:		opm = (struct nd_opt_mtu *)op;		TCHECK(opm->nd_opt_mtu_mtu);		printf("(mtu: ");	/*)*/		printf("mtu=%u", (u_int32_t)ntohl(opm->nd_opt_mtu_mtu));		if (opm->nd_opt_mtu_len != 1)			printf("!");		printf(")");		icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),				resid - (op->nd_opt_len << 3));		break;        case ND_OPT_ADVINT:		opa = (struct nd_opt_advint *)op;		TCHECK(opa->nd_opt_advint_advint);		printf("(advint: ");	/*)*/		printf("advint=%u",		    (u_int32_t)ntohl(opa->nd_opt_advint_advint));		/*(*/		printf(")");		icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),				resid - (op->nd_opt_len << 3));		break;                	default:		opts_len = op->nd_opt_len;		printf("(unknwon opt_type=%d, opt_len=%d)",		       op->nd_opt_type, opts_len);		if (opts_len == 0)			opts_len = 1; /* XXX */		icmp6_opt_print((const u_char *)op + (opts_len << 3),				resid - (opts_len << 3));		break;	}	return; trunc:	fputs("[ndp opt]", stdout);	return;#undef ECHECK}voidmld6_print(register const u_char *bp){	register struct mld6_hdr *mp = (struct mld6_hdr *)bp;	register const u_char *ep;	/* 'ep' points to the end of available data. */	ep = snapend;	if ((u_char *)mp + sizeof(*mp) > ep)		return;	printf("max resp delay: %d ", ntohs(mp->mld6_maxdelay));	printf("addr: %s", ip6addr_string(&mp->mld6_addr));}static voiddnsname_print(const u_char *cp, const u_char *ep){	int i;	/* DNS name decoding - no decompression */	printf(", \"");	while (cp < ep) {		i = *cp++;		if (i) {			if (i > ep - cp) {				printf("???");				break;			}			while (i-- && cp < ep) {				safeputchar(*cp);				cp++;			}			if (cp + 1 < ep && *cp)				printf(".");		} else {			if (cp == ep) {				/* FQDN */				printf(".");			} else if (cp + 1 == ep && *cp == '\0') {				/* truncated */			} else {				/* invalid */				printf("???");			}			break;		}	}	printf("\"");}voidicmp6_nodeinfo_print(int icmp6len, const u_char *bp, const u_char *ep){	struct icmp6_nodeinfo *ni6;	struct icmp6_hdr *dp;	const u_char *cp;	int siz, i;	int needcomma;	dp = (struct icmp6_hdr *)bp;	ni6 = (struct icmp6_nodeinfo *)bp;	siz = ep - bp;	switch (ni6->ni_type) {	case ICMP6_NI_QUERY:		if (siz == sizeof(*dp) + 4) {			/* KAME who-are-you */			printf("icmp6: who-are-you request");			break;		}		printf("icmp6: node information query");		TCHECK2(*dp, sizeof(*ni6));		ni6 = (struct icmp6_nodeinfo *)dp;		printf(" (");	/*)*/		switch (ntohs(ni6->ni_qtype)) {		case NI_QTYPE_NOOP:			printf("noop");			break;		case NI_QTYPE_SUPTYPES:			printf("supported qtypes");			i = ntohs(ni6->ni_flags);			if (i)				printf(" [%s]", (i & 0x01) ? "C" : "");			break;			break;		case NI_QTYPE_FQDN:			printf("DNS name");			break;		case NI_QTYPE_NODEADDR:			printf("node addresses");			i = ni6->ni_flags;			if (!i)				break;			/* NI_NODEADDR_FLAG_TRUNCATE undefined for query */			printf(" [%s%s%s%s%s%s]",			    (i & NI_NODEADDR_FLAG_ANYCAST) ? "a" : "",			    (i & NI_NODEADDR_FLAG_GLOBAL) ? "G" : "",			    (i & NI_NODEADDR_FLAG_SITELOCAL) ? "S" : "",			    (i & NI_NODEADDR_FLAG_LINKLOCAL) ? "L" : "",			    (i & NI_NODEADDR_FLAG_COMPAT) ? "C" : "",			    (i & NI_NODEADDR_FLAG_ALL) ? "A" : "");			break;		default:			printf("unknown");			break;		}		if (ni6->ni_qtype == NI_QTYPE_NOOP ||		    ni6->ni_qtype == NI_QTYPE_SUPTYPES) {			if (siz != sizeof(*ni6))				if (vflag)					printf(", invalid len");			/*(*/			printf(")");			break;		}		/* XXX backward compat, icmp-name-lookup-03 */		if (siz == sizeof(*ni6)) {			printf(", 03 draft");			/*(*/			printf(")");			break;		}		switch (ni6->ni_code) {		case ICMP6_NI_SUBJ_IPV6:			if (!TTEST2(*dp,			    sizeof(*ni6) + sizeof(struct in6_addr)))				break;			if (siz != sizeof(*ni6) + sizeof(struct in6_addr)) {				if (vflag)					printf(", invalid subject len");				break;			}			printf(", subject=%s",			    getname6((const u_char *)(ni6 + 1)));			break;		case ICMP6_NI_SUBJ_FQDN:			printf(", subject=DNS name");			cp = (const u_char *)(ni6 + 1);			if (cp[0] == ep - cp - 1) {				/* icmp-name-lookup-03, pascal string */				if (vflag)					printf(", 03 draft");				cp++;				printf(", \"");				while (cp < ep) {					safeputchar(*cp);					cp++;				}				printf("\"");			} else				dnsname_print(cp, ep);			break;		case ICMP6_NI_SUBJ_IPV4:			if (!TTEST2(*dp, sizeof(*ni6) + sizeof(struct in_addr)))				break;			if (siz != sizeof(*ni6) + sizeof(struct in_addr)) {				if (vflag)					printf(", invalid subject len");				break;			}			printf(", subject=%s",			    getname((const u_char *)(ni6 + 1)));			break;		default:			printf(", unknown subject");			break;		}		/*(*/		printf(")");		break;	case ICMP6_NI_REPLY:		if (icmp6len > siz) {			printf("[|icmp6: node information reply]");			break;		}		needcomma = 0;		ni6 = (struct icmp6_nodeinfo *)dp;		printf("icmp6: node information reply");		printf(" (");	/*)*/		switch (ni6->ni_code) {		case ICMP6_NI_SUCCESS:			if (vflag) {				printf("success");				needcomma++;			}			break;		case ICMP6_NI_REFUSED:			printf("refused");			needcomma++;			if (siz != sizeof(*ni6))				if (vflag)					printf(", invalid length");			break;		case ICMP6_NI_UNKNOWN:			printf("unknown");			needcomma++;			if (siz != sizeof(*ni6))				if (vflag)					printf(", invalid length");			break;		}		if (ni6->ni_code != ICMP6_NI_SUCCESS) {			/*(*/			printf(")");			break;		}		switch (ntohs(ni6->ni_qtype)) {		case NI_QTYPE_NOOP:			if (needcomma)				printf(", ");			printf("noop");			if (siz != sizeof(*ni6))				if (vflag)					printf(", invalid length");			break;		case NI_QTYPE_SUPTYPES:			if (needcomma)				printf(", ");			printf("supported qtypes");			i = ntohs(ni6->ni_flags);			if (i)				printf(" [%s]", (i & 0x01) ? "C" : "");			break;		case NI_QTYPE_FQDN:			if (needcomma)				printf(", ");			printf("DNS name");			cp = (const u_char *)(ni6 + 1) + 4;			if (cp[0] == ep - cp - 1) {				/* icmp-name-lookup-03, pascal string */				if (vflag)					printf(", 03 draft");				cp++;				printf(", \"");				while (cp < ep) {					safeputchar(*cp);					cp++;				}				printf("\"");			} else				dnsname_print(cp, ep);			if ((ntohs(ni6->ni_flags) & 0x01) != 0)				printf(" [TTL=%u]", *(u_int32_t *)(ni6 + 1));			break;		case NI_QTYPE_NODEADDR:			if (needcomma)				printf(", ");			printf("node addresses");			i = sizeof(*ni6);			while (i < siz) {				if (i + sizeof(struct in6_addr) + sizeof(int32_t) > siz)					break;				printf(" %s", getname6(bp + i));				i += sizeof(struct in6_addr);				printf("(%d)", ntohl(*(int32_t *)(bp + i)));				i += sizeof(int32_t);			}			i = ni6->ni_flags;			if (!i)				break;			printf(" [%s%s%s%s%s%s%s]",			    (i & NI_NODEADDR_FLAG_ANYCAST) ? "a" : "",			    (i & NI_NODEADDR_FLAG_GLOBAL) ? "G" : "",			    (i & NI_NODEADDR_FLAG_SITELOCAL) ? "S" : "",			    (i & NI_NODEADDR_FLAG_LINKLOCAL) ? "L" : "",			    (i & NI_NODEADDR_FLAG_COMPAT) ? "C" : "",			    (i & NI_NODEADDR_FLAG_ALL) ? "A" : "",			    (i & NI_NODEADDR_FLAG_TRUNCATE) ? "T" : "");			break;		default:			if (needcomma)				printf(", ");			printf("unknown");			break;		}		/*(*/		printf(")");		break;	}	return;trunc:	fputs("[|icmp6]", stdout);}voidicmp6_rrenum_print(int icmp6len, const u_char *bp, const u_char *ep){	struct icmp6_router_renum *rr6;	struct icmp6_hdr *dp;	size_t siz;	const char *cp;	struct rr_pco_match *match;	struct rr_pco_use *use;	char hbuf[NI_MAXHOST];	int n;	dp = (struct icmp6_hdr *)bp;	rr6 = (struct icmp6_router_renum *)bp;	siz = ep - bp;	cp = (const char *)(rr6 + 1);	TCHECK(rr6->rr_reserved);	switch (rr6->rr_code) {	case ICMP6_ROUTER_RENUMBERING_COMMAND:		printf("router renum: command");		break;	case ICMP6_ROUTER_RENUMBERING_RESULT:		printf("router renum: result");		break;	case ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET:		printf("router renum: sequence number reset");		break;	default:		printf("router renum: code-#%d", rr6->rr_code);		break;	}	printf(", seq=%u", (u_int32_t)ntohl(rr6->rr_seqnum));	if (vflag) {#define F(x, y)	((rr6->rr_flags) & (x) ? (y) : "")		printf("[");	/*]*/		if (rr6->rr_flags) {			printf("%s%s%s%s%s,", F(ICMP6_RR_FLAGS_TEST, "T"),			    F(ICMP6_RR_FLAGS_REQRESULT, "R"),			    F(ICMP6_RR_FLAGS_ALLIF, "A"),			    F(ICMP6_RR_FLAGS_SPECSITE, "S"),			    F(ICMP6_RR_FLAGS_PREVDONE, "P"));		}		printf("seg=%u,", rr6->rr_segnum);		printf("maxdelay=%u", rr6->rr_maxdelay);		if (rr6->rr_reserved)			printf("rsvd=0x%x", (u_int16_t)ntohs(rr6->rr_reserved));		/*[*/		printf("]");#undef F	}	if (rr6->rr_code == ICMP6_ROUTER_RENUMBERING_COMMAND) {		match = (struct rr_pco_match *)cp;		cp = (const char *)(match + 1);		TCHECK(match->rpm_prefix);		if (vflag)			printf("\n\t");		else			printf(" ");		printf("match(");	/*)*/		switch (match->rpm_code) {		case RPM_PCO_ADD:	printf("add"); break;		case RPM_PCO_CHANGE:	printf("change"); break;		case RPM_PCO_SETGLOBAL:	printf("setglobal"); break;		default:		printf("#%u", match->rpm_code); break;		}		if (vflag) {			printf(",ord=%u", match->rpm_ordinal);			printf(",min=%u", match->rpm_minlen);			printf(",max=%u", match->rpm_maxlen);		}		if (inet_ntop(AF_INET6, &match->rpm_prefix, hbuf, sizeof(hbuf)))			printf(",%s/%u", hbuf, match->rpm_matchlen);		else			printf(",?/%u", match->rpm_matchlen);		/*(*/		printf(")");		n = match->rpm_len - 3;		if (n % 4)			goto trunc;		n /= 4;		while (n-- > 0) {			use = (struct rr_pco_use *)cp;			cp = (const char *)(use + 1);			TCHECK(use->rpu_prefix);			if (vflag)				printf("\n\t");			else				printf(" ");			printf("use(");	/*)*/			if (use->rpu_flags) {#define F(x, y)	((use->rpu_flags) & (x) ? (y) : "")				printf("%s%s,",				    F(ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME, "V"),				    F(ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME, "P"));#undef F			}			if (vflag) {				printf("mask=0x%x,", use->rpu_ramask);				printf("raflags=0x%x,", use->rpu_raflags);				if (~use->rpu_vltime == 0)					printf("vltime=infty,");				else					printf("vltime=%u,",					    (u_int32_t)ntohl(use->rpu_vltime));				if (~use->rpu_pltime == 0)					printf("pltime=infty,");				else					printf("pltime=%u,",					    (u_int32_t)ntohl(use->rpu_pltime));			}			if (inet_ntop(AF_INET6, &use->rpu_prefix, hbuf,			    sizeof(hbuf)))				printf("%s/%u/%u", hbuf, use->rpu_uselen,				    use->rpu_keeplen);			else				printf("?/%u/%u", use->rpu_uselen,				    use->rpu_keeplen);			/*(*/			printf(")");		}	}	return;trunc:	fputs("[|icmp6]", stdout);}#endif /* INET6 */

⌨️ 快捷键说明

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