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

📄 print-pim.c

📁 Windump3.6.2源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}		if (bp[1] != 0)			return -1;		hdrlen = 2;	} else {		switch (pimv2_addr_len) {		 case 4:			af = AF_INET;			afstr = "IPv4";			break;#ifdef INET6		 case 16:			af = AF_INET6;			afstr = "IPv6";			break;#endif		 default:			return -1;			break;		}		len = pimv2_addr_len;		hdrlen = 0;	}	bp += hdrlen;	switch (at) {	 case pimv2_unicast:		TCHECK2(bp[0], len);		if (af == AF_INET) {			if (!silent)				(void)printf("%s", ipaddr_string(bp));		}#ifdef INET6		else if (af == AF_INET6) {			if (!silent)				(void)printf("%s", ip6addr_string(bp));		}#endif		return hdrlen + len;	 case pimv2_group:	 case pimv2_source:		TCHECK2(bp[0], len + 2);		if (af == AF_INET) {			if (!silent) {				(void)printf("%s", ipaddr_string(bp + 2));				if (bp[1] != 32)					(void)printf("/%u", bp[1]);			}		}#ifdef INET6		else if (af == AF_INET6) {			if (!silent) {				(void)printf("%s", ip6addr_string(bp + 2));				if (bp[1] != 128)					(void)printf("/%u", bp[1]);			}		}#endif		if (bp[0] && !silent) {			if (at == pimv2_group) {				(void)printf("(0x%02x)", bp[0]);			} else {				(void)printf("(%s%s%s",					bp[0] & 0x04 ? "S" : "",					bp[0] & 0x02 ? "W" : "",					bp[0] & 0x01 ? "R" : "");				if (bp[0] & 0xf8) {					(void) printf("+0x%02x", bp[0] & 0xf8);				}				(void)printf(")");			}		}		return hdrlen + 2 + len;	default:		return -1;	}trunc:	return -1;}static voidpimv2_print(register const u_char *bp, register u_int len){	register const u_char *ep;	register struct pim *pim = (struct pim *)bp;	int advance;	ep = (const u_char *)snapend;	if (bp >= ep)		return;	if (ep > bp + len)		ep = bp + len;	TCHECK(pim->pim_rsv);	pimv2_addr_len = pim->pim_rsv;	if (pimv2_addr_len != 0)		(void)printf("[RFC2117-encoding] ");	switch (PIM_TYPE(pim->pim_typever)) {	 case 0:	    {		u_int16_t otype, olen;		(void)printf(" Hello");		bp += 4;		while (bp < ep) {			TCHECK2(bp[0], 4);			otype = EXTRACT_16BITS(&bp[0]);			olen = EXTRACT_16BITS(&bp[2]);			TCHECK2(bp[0], 4 + olen);			switch (otype) {			case 1:		/* Hold time */				(void)printf(" (Hold-time ");				relts_print(EXTRACT_16BITS(&bp[4]));				(void)printf(")");				break;			/* XXX			 * draft-ietf-idmr-pimv2-dr-priority-00.txt			 * says that DR-Priority is option 19.			 * draft-ietf-pim-v2-sm-00.txt says it's 18.			 */			case 18:	/* DR-Priority */				(void)printf(" (DR-Priority: %d)", EXTRACT_32BITS(&bp[4]));				break;			case 19:	/* Bidir-Capable */				if (olen == 4)					(void)printf(" (OLD-DR-Priority: %d)", EXTRACT_32BITS(&bp[4]));				else					(void)printf(" (bidir-capable)");				break;			case 20:				(void)printf(" (Genid: 0x%08x)", EXTRACT_32BITS(&bp[4]));				break;			case 21:				(void)printf(" (State Refresh Capable");				if (EXTRACT_32BITS(&bp[4]) != 1) {					(void)printf(" ?0x%x?", EXTRACT_32BITS(&bp[4]));				}				(void)printf(")");				break;			default:				if (vflag)					(void)printf(" [Hello option %d]", otype);			}			bp += 4 + olen;		}		break;	    }	 case 1:	 {		struct ip *ip;		(void)printf(" Register");		if (vflag && bp + 8 <= ep) {			(void)printf(" %s%s", bp[4] & 0x80 ? "B" : "",				bp[4] & 0x40 ? "N" : "");		}		bp += 8; len -= 8;		/* encapsulated multicast packet */		if (bp >= ep)			break;		ip = (struct ip *)bp;		switch (IP_V(ip)) {		 case 4:	/* IPv4 */			printf(" ");			ip_print(bp, len);			break;#ifdef INET6		 case 6:	/* IPv6 */			printf(" ");			ip6_print(bp, len);			break;#endif		 default:			(void)printf(" IP ver %d", IP_V(ip));			break;		}		break;	 }	 case 2:		(void)printf(" Register-Stop");		bp += 4; len -= 4;		if (bp >= ep)			break;		(void)printf(" group=");		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance; len -= advance;		if (bp >= ep)			break;		(void)printf(" source=");		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance; len -= advance;		break;	 case 3:	 case 6:	 case 7:	    {		u_int8_t ngroup;		u_int16_t holdtime;		u_int16_t njoin;		u_int16_t nprune;		int i, j;		switch (PIM_TYPE(pim->pim_typever)) {		 case 3:			(void)printf(" Join/Prune");			break;		 case 6:			(void)printf(" Graft");			break;		 case 7:			(void)printf(" Graft-ACK");			break;		}		bp += 4; len -= 4;		if (PIM_TYPE(pim->pim_typever) != 7) {	/*not for Graft-ACK*/			if (bp >= ep)				break;			(void)printf(" upstream-neighbor=");			if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {				(void)printf("...");				break;			}			bp += advance; len -= advance;		}		if (bp + 4 > ep)			break;		ngroup = bp[1];		holdtime = EXTRACT_16BITS(&bp[2]);		(void)printf(" groups=%u", ngroup);		if (PIM_TYPE(pim->pim_typever) != 7) {	/*not for Graft-ACK*/			(void)printf(" holdtime=");			if (holdtime == 0xffff)				(void)printf("infty");			else				relts_print(holdtime);		}		bp += 4; len -= 4;		for (i = 0; i < ngroup; i++) {			if (bp >= ep)				goto jp_done;			(void)printf(" (group%d: ", i);			if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {				(void)printf("...)");				goto jp_done;			}			bp += advance; len -= advance;			if (bp + 4 > ep) {				(void)printf("...)");				goto jp_done;			}			njoin = EXTRACT_16BITS(&bp[0]);			nprune = EXTRACT_16BITS(&bp[2]);			(void)printf(" join=%u", njoin);			bp += 4; len -= 4;			for (j = 0; j < njoin; j++) {				(void)printf(" ");				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {					(void)printf("...)");					goto jp_done;				}				bp += advance; len -= advance;			}			(void)printf(" prune=%u", nprune);			for (j = 0; j < nprune; j++) {				(void)printf(" ");				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {					(void)printf("...)");					goto jp_done;				}				bp += advance; len -= advance;			}			(void)printf(")");		}	jp_done:		break;	    }	 case 4:	 {		int i, j, frpcnt;		(void)printf(" Bootstrap");		bp += 4;		/* Fragment Tag, Hash Mask len, and BSR-priority */		if (bp + sizeof(u_int16_t) >= ep) break;		(void)printf(" tag=%x", EXTRACT_16BITS(bp));		bp += sizeof(u_int16_t);		if (bp >= ep) break;		(void)printf(" hashmlen=%d", bp[0]);		if (bp + 1 >= ep) break;		(void)printf(" BSRprio=%d", bp[1]);		bp += 2;		/* Encoded-Unicast-BSR-Address */		if (bp >= ep) break;		(void)printf(" BSR=");		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance;		for (i = 0; bp < ep; i++) {			/* Encoded-Group Address */			(void)printf(" (group%d: ", i);			if ((advance = pimv2_addr_print(bp, pimv2_group, 0))			    < 0) {				(void)printf("...)");				goto bs_done;			}			bp += advance;			/* RP-Count, Frag RP-Cnt, and rsvd */			if (bp >= ep) {				(void)printf("...)");				goto bs_done;			}			(void)printf(" RPcnt=%d", bp[0]);			if (bp + 1 >= ep) {				(void)printf("...)");				goto bs_done;			}			(void)printf(" FRPcnt=%d", frpcnt = bp[1]);			bp += 4;			for (j = 0; j < frpcnt && bp < ep; j++) {				/* each RP info */				(void)printf(" RP%d=", j);				if ((advance = pimv2_addr_print(bp,								pimv2_unicast,								0)) < 0) {					(void)printf("...)");					goto bs_done;				}				bp += advance;				if (bp + 1 >= ep) {					(void)printf("...)");					goto bs_done;				}				(void)printf(",holdtime=");				relts_print(EXTRACT_16BITS(bp));				if (bp + 2 >= ep) {					(void)printf("...)");					goto bs_done;				}				(void)printf(",prio=%d", bp[2]);				bp += 4;			}			(void)printf(")");		}	   bs_done:		break;	 }	 case 5:		(void)printf(" Assert");		bp += 4; len -= 4;		if (bp >= ep)			break;		(void)printf(" group=");		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance; len -= advance;		if (bp >= ep)			break;		(void)printf(" src=");		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance; len -= advance;		if (bp + 8 > ep)			break;		if (bp[0] & 0x80)			(void)printf(" RPT");		(void)printf(" pref=%u", EXTRACT_32BITS(&bp[0]) & 0x7fffffff);		(void)printf(" metric=%u", EXTRACT_32BITS(&bp[4]));		break;	 case 8:	 {		int i, pfxcnt;		(void)printf(" Candidate-RP-Advertisement");		bp += 4;		/* Prefix-Cnt, Priority, and Holdtime */		if (bp >= ep) break;		(void)printf(" prefix-cnt=%d", bp[0]);		pfxcnt = bp[0];		if (bp + 1 >= ep) break;		(void)printf(" prio=%d", bp[1]);		if (bp + 3 >= ep) break;		(void)printf(" holdtime=");		relts_print(EXTRACT_16BITS(&bp[2]));		bp += 4;		/* Encoded-Unicast-RP-Address */		if (bp >= ep) break;		(void)printf(" RP=");		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance;		/* Encoded-Group Addresses */		for (i = 0; i < pfxcnt && bp < ep; i++) {			(void)printf(" Group%d=", i);			if ((advance = pimv2_addr_print(bp, pimv2_group, 0))			    < 0) {				(void)printf("...");				break;			}			bp += advance;		}		break;	 }	 case 9:		(void)printf(" Prune-Refresh");		(void)printf(" src=");		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance;		(void)printf(" grp=");		if ((advance = pimv2_addr_print(bp, pimv2_group, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance;		(void)printf(" forwarder=");		if ((advance = pimv2_addr_print(bp, pimv2_unicast, 0)) < 0) {			(void)printf("...");			break;		}		bp += advance;		TCHECK2(bp[0], 2);		(void)printf(" TUNR ");		relts_print(EXTRACT_16BITS(bp));		break;	 default:		(void)printf(" [type %d]", PIM_TYPE(pim->pim_typever));		break;	}	return;trunc:	(void)printf("[|pim]");}

⌨️ 快捷键说明

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