print-pim.c

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

C
1,094
字号
		case sizeof(struct in_addr):			af = AF_INET;			break;#ifdef INET6		case sizeof(struct in6_addr):			af = AF_INET6;			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");        printf(", cksum 0x%04x ", EXTRACT_16BITS(&pim->pim_cksum));        if (EXTRACT_16BITS(&pim->pim_cksum) == 0) {                printf("(unverified)");        } else {                printf("(%scorrect)",                       TTEST2(bp[0], len) &&                       in_cksum((const u_short*)bp, len, 0) ? "in" : "" );        }	switch (PIM_TYPE(pim->pim_typever)) {	case PIMV2_TYPE_HELLO:	    {		u_int16_t otype, olen;		bp += 4;		while (bp < ep) {			TCHECK2(bp[0], 4);			otype = EXTRACT_16BITS(&bp[0]);			olen = EXTRACT_16BITS(&bp[2]);			TCHECK2(bp[0], 4 + olen);                        printf("\n\t  %s Option (%u), length %u, Value: ",                               tok2str( pimv2_hello_option_values,"Unknown",otype),                               otype,                               olen);			bp += 4;			switch (otype) {			case PIMV2_HELLO_OPTION_HOLDTIME:                                relts_print(EXTRACT_16BITS(bp));                                break;			case PIMV2_HELLO_OPTION_LANPRUNEDELAY:				if (olen != 4) {					(void)printf("ERROR: Option Lenght != 4 Bytes (%u)", olen);				} else {					char t_bit;					u_int16_t lan_delay, override_interval;					lan_delay = EXTRACT_16BITS(bp);					override_interval = EXTRACT_16BITS(bp+2);					t_bit = (lan_delay & 0x8000)? 1 : 0;					lan_delay &= ~0x8000;					(void)printf("\n\t    T-bit=%d, LAN delay %dms, Override interval %dms",					t_bit, lan_delay, override_interval);				}				break;			case PIMV2_HELLO_OPTION_DR_PRIORITY_OLD:			case PIMV2_HELLO_OPTION_DR_PRIORITY:                                switch (olen) {                                case 0:                                    printf("Bi-Directional Capability (Old)");                                    break;                                case 4:                                    printf("%u", EXTRACT_32BITS(bp));                                    break;                                default:                                    printf("ERROR: Option Lenght != 4 Bytes (%u)", olen);                                    break;                                }                                break;			case PIMV2_HELLO_OPTION_GENID:                                (void)printf("0x%08x", EXTRACT_32BITS(bp));				break;			case PIMV2_HELLO_OPTION_REFRESH_CAP:                                (void)printf("v%d", *bp);				if (*(bp+1) != 0) {                                    (void)printf(", interval ");                                    relts_print(*(bp+1));				}				if (EXTRACT_16BITS(bp+2) != 0) {                                    (void)printf(" ?0x%04x?", EXTRACT_16BITS(bp+2));				}				break;			case  PIMV2_HELLO_OPTION_BIDIR_CAP:				break;                        case PIMV2_HELLO_OPTION_ADDRESS_LIST_OLD:                        case PIMV2_HELLO_OPTION_ADDRESS_LIST:				if (vflag > 1) {					const u_char *ptr = bp;					while (ptr < (bp+olen)) {						int advance;						printf("\n\t    ");						advance = pimv2_addr_print(ptr, pimv2_unicast, 0);						if (advance < 0) {							printf("...");							break;						}						ptr += advance;					}				}				break;			default:                                if (vflag <= 1)                                    print_unknown_data(bp,"\n\t    ",olen);                                break;			}                        /* do we want to see an additionally hexdump ? */                        if (vflag> 1)                            print_unknown_data(bp,"\n\t    ",olen);			bp += olen;		}		break;	    }	case PIMV2_TYPE_REGISTER:	{		struct ip *ip;                if (!TTEST2(*(bp+4), PIMV2_REGISTER_FLAG_LEN))                        goto trunc;                printf(", Flags [ %s ]\n\t",                       tok2str(pimv2_register_flag_values,                               "none",                               EXTRACT_32BITS(bp+4)));		bp += 8; len -= 8;		/* encapsulated multicast packet */		ip = (struct ip *)bp;		switch (IP_V(ip)) {                case 0: /* Null header */			(void)printf("IP-Null-header %s > %s",                                     ipaddr_string(&ip->ip_src),                                     ipaddr_string(&ip->ip_dst));			break;		case 4:	/* IPv4 */			ip_print(gndo, bp, len);			break;#ifdef INET6		case 6:	/* IPv6 */			ip6_print(bp, len);			break;#endif                default:                        (void)printf("IP ver %d", IP_V(ip));                        break;		}		break;	}	case PIMV2_TYPE_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 PIMV2_TYPE_JOIN_PRUNE:	case PIMV2_TYPE_GRAFT:	case PIMV2_TYPE_GRAFT_ACK:        /*         * 0                   1                   2                   3         *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |PIM Ver| Type  | Addr length   |           Checksum            |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |             Unicast-Upstream Neighbor Address                 |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |  Reserved     | Num groups    |          Holdtime             |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |            Encoded-Multicast Group Address-1                  |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |   Number of Joined  Sources   |   Number of Pruned Sources    |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |               Encoded-Joined Source Address-1                 |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |                             .                                 |         *  |                             .                                 |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |               Encoded-Joined Source Address-n                 |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |               Encoded-Pruned Source Address-1                 |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |                             .                                 |         *  |                             .                                 |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |               Encoded-Pruned Source Address-n                 |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |                           .                                   |         *  |                           .                                   |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         *  |                Encoded-Multicast Group Address-n              |         *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         */	    {		u_int8_t ngroup;		u_int16_t holdtime;		u_int16_t njoin;		u_int16_t nprune;		int i, j;		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("\n\t  %u group(s)", ngroup);		if (PIM_TYPE(pim->pim_typever) != 7) {	/*not for Graft-ACK*/			(void)printf(", holdtime: ");			if (holdtime == 0xffff)				(void)printf("infinite");			else				relts_print(holdtime);		}		bp += 4; len -= 4;		for (i = 0; i < ngroup; i++) {			if (bp >= ep)				goto jp_done;			(void)printf("\n\t    group #%u: ", i+1);			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(", joined sources: %u, pruned sources: %u", njoin,nprune);			bp += 4; len -= 4;			for (j = 0; j < njoin; j++) {				(void)printf("\n\t      joined source #%u: ",j+1);				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {					(void)printf("...)");					goto jp_done;				}				bp += advance; len -= advance;			}			for (j = 0; j < nprune; j++) {				(void)printf("\n\t      pruned source #%u: ",j+1);				if ((advance = pimv2_addr_print(bp, pimv2_source, 0)) < 0) {					(void)printf("...)");					goto jp_done;				}				bp += advance; len -= advance;			}		}	jp_done:		break;	    }	case PIMV2_TYPE_BOOTSTRAP:	{		int i, j, frpcnt;		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 PIMV2_TYPE_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 PIMV2_TYPE_CANDIDATE_RP:	{		int i, pfxcnt;		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 PIMV2_TYPE_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]");}/* * Local Variables: * c-style: whitesmith * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

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