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

📄 print-bgp.c

📁 Windump3.6.2源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			case BGP_COMMUNITY_NO_EXPORT:				printf(" NO_EXPORT");				break;			case BGP_COMMUNITY_NO_ADVERT:				printf(" NO_ADVERTISE");				break;			case BGP_COMMUNITY_NO_EXPORT_SUBCONFED:				printf(" NO_EXPORT_SUBCONFED");				break;			default:				printf(" (AS #%d value 0x%04x)",					(comm >> 16) & 0xffff, comm & 0xffff);				break;			}		}		break;	case BGPTYPE_MP_REACH_NLRI:		af = ntohs(*(u_int16_t *)p);		safi = p[2];		if (safi >= 128)			printf(" %s vendor specific,", af_name(af));		else {			printf(" %s %s,", af_name(af),				bgp_attr_nlri_safi(safi));		}		p += 3;		if (af == AFNUM_INET)			;#ifdef INET6		else if (af == AFNUM_INET6)			;#endif		else			break;		tlen = p[0];		if (tlen) {			printf(" nexthop");			i = 0;			while (i < tlen) {				switch (af) {				case AFNUM_INET:					printf(" %s", getname(p + 1 + i));					i += sizeof(struct in_addr);					break;#ifdef INET6				case AFNUM_INET6:					printf(" %s", getname6(p + 1 + i));					i += sizeof(struct in6_addr);					break;#endif				default:					printf(" (unknown af)");					i = tlen;	/*exit loop*/					break;				}			}			printf(",");		}		p += 1 + tlen;		snpa = p[0];		p++;		if (snpa) {			printf(" %u snpa", snpa);			for (/*nothing*/; snpa > 0; snpa--) {				printf("(%d bytes)", p[0]);				p += p[0] + 1;			}			printf(",");		}		printf(" NLRI");		while (len - (p - dat) > 0) {			switch (af) {			case AFNUM_INET:				advance = decode_prefix4(p, buf, sizeof(buf));				printf(" %s", buf);				break;#ifdef INET6			case AFNUM_INET6:				advance = decode_prefix6(p, buf, sizeof(buf));				printf(" %s", buf);				break;#endif			default:				printf(" (unknown af)");				advance = 0;				p = dat + len;				break;			}			p += advance;		}		break;	case BGPTYPE_MP_UNREACH_NLRI:		af = ntohs(*(u_int16_t *)p);		safi = p[2];		if (safi >= 128)			printf(" %s vendor specific,", af_name(af));		else {			printf(" %s %s,", af_name(af),				bgp_attr_nlri_safi(safi));		}		p += 3;		printf(" Withdraw");		while (len - (p - dat) > 0) {			switch (af) {			case AFNUM_INET:				advance = decode_prefix4(p, buf, sizeof(buf));				printf(" %s", buf);				break;#ifdef INET6			case AFNUM_INET6:				advance = decode_prefix6(p, buf, sizeof(buf));				printf(" %s", buf);				break;#endif			default:				printf(" (unknown af)");				advance = 0;				p = dat + len;				break;			}			p += advance;		}		break;	default:		break;	}}static voidbgp_open_print(const u_char *dat, int length){	struct bgp_open bgpo;	struct bgp_opt bgpopt;	int hlen;	const u_char *opt;	int i;	TCHECK2(dat[0], sizeof(bgpo));	memcpy(&bgpo, dat, sizeof(bgpo));	hlen = ntohs(bgpo.bgpo_len);	printf(": Version %d,", bgpo.bgpo_version);	printf(" AS #%u,", ntohs(bgpo.bgpo_myas));	printf(" Holdtime %u,", ntohs(bgpo.bgpo_holdtime));	printf(" ID %s,", getname((u_char *)&bgpo.bgpo_id));	printf(" Option length %u", bgpo.bgpo_optlen);	/* ugly! */	opt = &((struct bgp_open *)dat)->bgpo_optlen;	opt++;	for (i = 0; i < bgpo.bgpo_optlen; i++) {		memcpy(&bgpopt, &opt[i], sizeof(bgpopt));		if (i + 2 + bgpopt.bgpopt_len > bgpo.bgpo_optlen) {			printf(" [|opt %d %d]", bgpopt.bgpopt_len, bgpopt.bgpopt_type);			break;		}		printf(" (option %s, len=%d)", bgp_opttype(bgpopt.bgpopt_type),			bgpopt.bgpopt_len);		i += sizeof(bgpopt) + bgpopt.bgpopt_len;	}	return;trunc:	printf("[|BGP]");}static voidbgp_update_print(const u_char *dat, int length){	struct bgp bgp;	struct bgp_attr bgpa;	int hlen;	const u_char *p;	int len;	int i;	int newline;	TCHECK2(dat[0], sizeof(bgp));	memcpy(&bgp, dat, sizeof(bgp));	hlen = ntohs(bgp.bgp_len);	p = dat + BGP_SIZE;	/*XXX*/	printf(":");	/* Unfeasible routes */	len = EXTRACT_16BITS(p);	if (len) {		/*  Without keeping state from the original NLRI message,		 *  it's not possible to tell if this a v4 or v6 route,		 *  so only try to decode it if we're not v6 enabled.	         */#ifdef INET6		printf(" (Withdrawn routes: %d bytes)", len);#else			char buf[MAXHOSTNAMELEN + 100];		TCHECK2(p[2], len); 		i = 2;		printf(" (Withdrawn routes:");					while(i < 2 + len) {			i += decode_prefix4(&p[i], buf, sizeof(buf));			printf(" %s", buf);		}		printf(")\n");#endif	}	p += 2 + len;	TCHECK2(p[0], 2);	len = EXTRACT_16BITS(p);	if (len) {		/* do something more useful!*/		i = 2;		printf(" (Path attributes:");	/* ) */		newline = 0;		while (i < 2 + len) {			int alen, aoff;			TCHECK2(p[i], sizeof(bgpa));			memcpy(&bgpa, &p[i], sizeof(bgpa));			alen = bgp_attr_len(&bgpa);			aoff = bgp_attr_off(&bgpa);			if (vflag && newline)				printf("\n\t\t");			else				printf(" ");			printf("(");		/* ) */			printf("%s", bgp_attr_type(bgpa.bgpa_type));			if (bgpa.bgpa_flags) {				printf("[%s%s%s%s",					bgpa.bgpa_flags & 0x80 ? "O" : "",					bgpa.bgpa_flags & 0x40 ? "T" : "",					bgpa.bgpa_flags & 0x20 ? "P" : "",					bgpa.bgpa_flags & 0x10 ? "E" : "");				if (bgpa.bgpa_flags & 0xf)					printf("+%x", bgpa.bgpa_flags & 0xf);				printf("]");			}			bgp_attr_print(&bgpa, &p[i + aoff], alen);			newline = 1;			/* ( */			printf(")");				i += aoff + alen;		}		/* ( */		printf(")");	}	p += 2 + len;	if (len && dat + length > p)		printf("\n\t\t");	if (dat + length > p) {		printf("(NLRI:");	/* ) */		while (dat + length > p) {			char buf[MAXHOSTNAMELEN + 100];			i = decode_prefix4(p, buf, sizeof(buf));			printf(" %s", buf);			if (i < 0)				break;			p += i;		}		/* ( */		printf(")");	}	return;trunc:	printf("[|BGP]");}static voidbgp_notification_print(const u_char *dat, int length){	struct bgp_notification bgpn;	int hlen;	TCHECK2(dat[0], sizeof(bgpn));	memcpy(&bgpn, dat, sizeof(bgpn));	hlen = ntohs(bgpn.bgpn_len);	printf(": error %s,", bgp_notify_major(bgpn.bgpn_major));	printf(" subcode %s",		bgp_notify_minor(bgpn.bgpn_major, bgpn.bgpn_minor));	return;trunc:	printf("[|BGP]");}static voidbgp_header_print(const u_char *dat, int length){	struct bgp bgp;	TCHECK2(dat[0], sizeof(bgp));	memcpy(&bgp, dat, sizeof(bgp));	printf("(%s", bgp_type(bgp.bgp_type));		/* ) */	switch (bgp.bgp_type) {	case BGP_OPEN:		bgp_open_print(dat, length);		break;	case BGP_UPDATE:		bgp_update_print(dat, length);		break;	case BGP_NOTIFICATION:		bgp_notification_print(dat, length);		break;	}	/* ( */	printf(")");	return;trunc:	printf("[|BGP]");}voidbgp_print(const u_char *dat, int length){	const u_char *p;	const u_char *ep;	const u_char *start;	const u_char marker[] = {		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 	};	struct bgp bgp;	u_int16_t hlen;	int newline;	ep = dat + length;	if (snapend < dat + length)		ep = snapend;	printf(": BGP");	p = dat;	newline = 0;	start = p;	while (p < snapend) {		if (!TTEST2(p[0], 1))			break;		if (p[0] != 0xff) {			p++;			continue;		}		if (!TTEST2(p[0], sizeof(marker)))			break;		if (memcmp(p, marker, sizeof(marker)) != 0) {			p++;			continue;		}		/* found BGP header */		TCHECK2(p[0], sizeof(bgp));	/*XXX*/		memcpy(&bgp, p, sizeof(bgp));		if (start != p)			printf(" [|BGP]");		hlen = ntohs(bgp.bgp_len);		if (vflag && newline)			printf("\n\t");		else			printf(" ");		if (TTEST2(p[0], hlen)) {			bgp_header_print(p, hlen);			newline = 1;			p += hlen;			start = p;		} else {			printf("[|BGP %s]", bgp_type(bgp.bgp_type));			break;		}	}	return;trunc:	printf(" [|BGP]");}

⌨️ 快捷键说明

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