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

📄 print-udp.c

📁 Windump3.6.2源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	union {		struct {			struct in6_addr ph_src;			struct in6_addr ph_dst;			u_int32_t	ph_len;			u_int8_t	ph_zero[3];			u_int8_t	ph_nxt;		} ph;		u_int16_t pa[20];	} phu;	tlen = ntohs(ip6->ip6_plen) + sizeof(struct ip6_hdr) -	    ((const char *)up - (const char*)ip6);	/* pseudo-header */	memset(&phu, 0, sizeof(phu));	phu.ph.ph_src = ip6->ip6_src;	phu.ph.ph_dst = ip6->ip6_dst;	phu.ph.ph_len = htonl(tlen);	phu.ph.ph_nxt = IPPROTO_UDP;	sum = 0;	for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++)		sum += phu.pa[i];	sp = (const u_int16_t *)up;	for (i = 0; i < (tlen & ~1); i += 2)		sum += *sp++;	if (tlen & 1)		sum += htons((*(const u_int8_t *)sp) << 8);	while (sum > 0xffff)		sum = (sum & 0xffff) + (sum >> 16);	sum = ~sum & 0xffff;	return (sum);}#endif/* XXX probably should use getservbyname() and cache answers */#define TFTP_PORT 69		/*XXX*/#define KERBEROS_PORT 88	/*XXX*/#define SUNRPC_PORT 111		/*XXX*/#define SNMP_PORT 161		/*XXX*/#define NTP_PORT 123		/*XXX*/#define SNMPTRAP_PORT 162	/*XXX*/#define ISAKMP_PORT 500		/*XXX*/#define TIMED_PORT 525		/*XXX*/#define RIP_PORT 520		/*XXX*/#define KERBEROS_SEC_PORT 750	/*XXX*/#define L2TP_PORT 1701		/*XXX*/#define ISAKMP_PORT_USER1 7500	/*??? - nonstandard*/#define ISAKMP_PORT_USER2 8500	/*??? - nonstandard*/#define RX_PORT_LOW 7000	/*XXX*/#define RX_PORT_HIGH 7009	/*XXX*/#define NETBIOS_NS_PORT   137#define NETBIOS_DGRAM_PORT   138#define CISCO_AUTORP_PORT 496	/*XXX*/#define RADIUS_PORT 1645#define RADIUS_NEW_PORT 1812#define RADIUS_ACCOUNTING_PORT 1646#define RADIUS_NEW_ACCOUNTING_PORT 1813#ifdef INET6#define RIPNG_PORT 521		/*XXX*/#define DHCP6_SERV_PORT 546	/*XXX*/#define DHCP6_CLI_PORT 547	/*XXX*/#endifvoidudp_print(register const u_char *bp, u_int length,	  register const u_char *bp2, int fragmented){	register const struct udphdr *up;	register const struct ip *ip;	register const u_char *cp;	register const u_char *ep = bp + length;	u_int16_t sport, dport, ulen;#ifdef INET6	register const struct ip6_hdr *ip6;#endif	if (ep > snapend)		ep = snapend;	up = (struct udphdr *)bp;	ip = (struct ip *)bp2;#ifdef INET6	if (IP_V(ip) == 6)		ip6 = (struct ip6_hdr *)bp2;	else		ip6 = NULL;#endif /*INET6*/	cp = (u_char *)(up + 1);	if (cp > snapend) {		(void)printf("%s > %s: [|udp]",			ipaddr_string(&ip->ip_src), ipaddr_string(&ip->ip_dst));		return;	}	if (length < sizeof(struct udphdr)) {		(void)printf("%s > %s: truncated-udp %d",			ipaddr_string(&ip->ip_src), ipaddr_string(&ip->ip_dst),			length);		return;	}	length -= sizeof(struct udphdr);	sport = ntohs(up->uh_sport);	dport = ntohs(up->uh_dport);	ulen = ntohs(up->uh_ulen);	if (ulen < 8) {		(void)printf("%s > %s: truncated-udplength %d",			     ipaddr_string(&ip->ip_src),			     ipaddr_string(&ip->ip_dst),			     ulen);		return;	}	if (packettype) {		register struct rpc_msg *rp;		enum msg_type direction;		switch (packettype) {		case PT_VAT:			(void)printf("%s.%s > %s.%s:",				ipaddr_string(&ip->ip_src),				udpport_string(sport),				ipaddr_string(&ip->ip_dst),				udpport_string(dport));			vat_print((void *)(up + 1), length, up);			break;		case PT_WB:			(void)printf("%s.%s > %s.%s:",				ipaddr_string(&ip->ip_src),				udpport_string(sport),				ipaddr_string(&ip->ip_dst),				udpport_string(dport));			wb_print((void *)(up + 1), length);			break;		case PT_RPC:			rp = (struct rpc_msg *)(up + 1);			direction = (enum msg_type)ntohl(rp->rm_direction);			if (direction == CALL)				sunrpcrequest_print((u_char *)rp, length,				    (u_char *)ip);			else				nfsreply_print((u_char *)rp, length,				    (u_char *)ip);			/*XXX*/			break;		case PT_RTP:			(void)printf("%s.%s > %s.%s:",				ipaddr_string(&ip->ip_src),				udpport_string(sport),				ipaddr_string(&ip->ip_dst),				udpport_string(dport));			rtp_print((void *)(up + 1), length, up);			break;		case PT_RTCP:			(void)printf("%s.%s > %s.%s:",				ipaddr_string(&ip->ip_src),				udpport_string(sport),				ipaddr_string(&ip->ip_dst),				udpport_string(dport));			while (cp < ep)				cp = rtcp_print(cp, ep);			break;		case PT_SNMP:			(void)printf("%s.%s > %s.%s:",				ipaddr_string(&ip->ip_src),				udpport_string(sport),				ipaddr_string(&ip->ip_dst),				udpport_string(dport));			snmp_print((const u_char *)(up + 1), length);			break;		case PT_CNFP:			(void)printf("%s.%s > %s.%s:",				ipaddr_string(&ip->ip_src),				udpport_string(sport),				ipaddr_string(&ip->ip_dst),				udpport_string(dport));			cnfp_print(cp, length, (const u_char *)ip);			break;		}		return;	}	if (!qflag) {		register struct rpc_msg *rp;		enum msg_type direction;		rp = (struct rpc_msg *)(up + 1);		if (TTEST(rp->rm_direction)) {			direction = (enum msg_type)ntohl(rp->rm_direction);			if (dport == NFS_PORT && direction == CALL) {				nfsreq_print((u_char *)rp, length,				    (u_char *)ip);				return;			}			if (sport == NFS_PORT && direction == REPLY) {				nfsreply_print((u_char *)rp, length,				    (u_char *)ip);				return;			}#ifdef notdef			if (dport == SUNRPC_PORT && direction == CALL) {				sunrpcrequest_print((u_char *)rp, length, (u_char *)ip);				return;			}#endif		}		if (TTEST(((struct LAP *)cp)->type) &&		    ((struct LAP *)cp)->type == lapDDP &&		    (atalk_port(sport) || atalk_port(dport))) {			if (vflag)				fputs("kip ", stdout);			llap_print(cp, length);			return;		}	}#if 0	(void)printf("%s.%s > %s.%s:",		ipaddr_string(&ip->ip_src), udpport_string(sport),		ipaddr_string(&ip->ip_dst), udpport_string(dport));#else#ifdef INET6	if (ip6) {		if (ip6->ip6_nxt == IPPROTO_UDP) {			(void)printf("%s.%s > %s.%s: ",				ip6addr_string(&ip6->ip6_src),				udpport_string(sport),				ip6addr_string(&ip6->ip6_dst),				udpport_string(dport));		} else {			(void)printf("%s > %s: ",				udpport_string(sport), udpport_string(dport));		}	} else#endif /*INET6*/	{		if (ip->ip_p == IPPROTO_UDP) {			(void)printf("%s.%s > %s.%s: ",				ipaddr_string(&ip->ip_src),				udpport_string(sport),				ipaddr_string(&ip->ip_dst),				udpport_string(dport));		} else {			(void)printf("%s > %s: ",				udpport_string(sport), udpport_string(dport));		}	}#endif	if (IP_V(ip) == 4 && vflag && !fragmented) {		int sum = up->uh_sum;		if (sum == 0) {			(void)printf(" [no cksum]");		} else if (TTEST2(cp[0], length)) {			sum = udp_cksum(ip, up, length);			if (sum != 0)				(void)printf(" [bad udp cksum %x!]", sum);			else				(void)printf(" [udp sum ok]");		}	}#ifdef INET6	if (IP_V(ip) == 6 && ip6->ip6_plen && vflag && !fragmented) {		int sum = up->uh_sum;		/* for IPv6, UDP checksum is mandatory */		if (TTEST2(cp[0], length)) {			sum = udp6_cksum(ip6, up, length);			if (sum != 0)				(void)printf(" [bad udp cksum %x!]", sum);			else				(void)printf(" [udp sum ok]");		}	}#endif	if (!qflag) {#define ISPORT(p) (dport == (p) || sport == (p))		if (ISPORT(NAMESERVER_PORT))			ns_print((const u_char *)(up + 1), length);		else if (ISPORT(TIMED_PORT))			timed_print((const u_char *)(up + 1), length);		else if (ISPORT(TFTP_PORT))			tftp_print((const u_char *)(up + 1), length);		else if (ISPORT(IPPORT_BOOTPC) || ISPORT(IPPORT_BOOTPS))			bootp_print((const u_char *)(up + 1), length,			    sport, dport);		else if (ISPORT(RIP_PORT))			rip_print((const u_char *)(up + 1), length);		else if (ISPORT(ISAKMP_PORT))			isakmp_print((const u_char *)(up + 1), length, bp2);#if 1 /*???*/		else if (ISPORT(ISAKMP_PORT_USER1) || ISPORT(ISAKMP_PORT_USER2))			isakmp_print((const u_char *)(up + 1), length, bp2);#endif		else if (ISPORT(SNMP_PORT) || ISPORT(SNMPTRAP_PORT))			snmp_print((const u_char *)(up + 1), length);		else if (ISPORT(NTP_PORT))			ntp_print((const u_char *)(up + 1), length);		else if (ISPORT(KERBEROS_PORT) || ISPORT(KERBEROS_SEC_PORT))			krb_print((const void *)(up + 1), length);		else if (ISPORT(L2TP_PORT))			l2tp_print((const u_char *)(up + 1), length); 		else if (ISPORT(NETBIOS_NS_PORT)) {			nbt_udp137_print((const u_char *)(up + 1), length); 		} 		else if (ISPORT(NETBIOS_DGRAM_PORT)) { 			nbt_udp138_print((const u_char *)(up + 1), length); 		}		else if (dport == 3456)			vat_print((const void *)(up + 1), length, up); 		/* 		 * Since there are 10 possible ports to check, I think 		 * a <> test would be more efficient 		 */ 		else if ((sport >= RX_PORT_LOW && sport <= RX_PORT_HIGH) || 			 (dport >= RX_PORT_LOW && dport <= RX_PORT_HIGH)) 			rx_print((const void *)(up + 1), length, sport, dport, 				 (u_char *) ip);#ifdef INET6		else if (ISPORT(RIPNG_PORT))			ripng_print((const u_char *)(up + 1), length);		else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT)) {			dhcp6_print((const u_char *)(up + 1), length,				sport, dport);		}#endif /*INET6*/		/*		 * Kludge in test for whiteboard packets.		 */		else if (dport == 4567)			wb_print((const void *)(up + 1), length);		else if (ISPORT(CISCO_AUTORP_PORT))			cisco_autorp_print((const void *)(up + 1), length);		else if (ISPORT(RADIUS_PORT) ||		         ISPORT(RADIUS_NEW_PORT) ||		         ISPORT(RADIUS_ACCOUNTING_PORT) || 		         ISPORT(RADIUS_NEW_ACCOUNTING_PORT) )		         radius_print((const u_char *)(up+1), length);		else			(void)printf(" udp %u",			    (u_int32_t)(ulen - sizeof(*up)));#undef ISPORT	} else		(void)printf(" udp %u", (u_int32_t)(ulen - sizeof(*up)));}

⌨️ 快捷键说明

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