print-udp.c

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

C
716
字号
}#endifstatic voidudpipaddr_print(const struct ip *ip, int sport, int dport){#ifdef INET6	const struct ip6_hdr *ip6;	if (IP_V(ip) == 6)		ip6 = (const struct ip6_hdr *)ip;	else		ip6 = NULL;	if (ip6) {		if (ip6->ip6_nxt == IPPROTO_UDP) {			if (sport == -1) {				(void)printf("%s > %s: ",					ip6addr_string(&ip6->ip6_src),					ip6addr_string(&ip6->ip6_dst));			} else {				(void)printf("%s.%s > %s.%s: ",					ip6addr_string(&ip6->ip6_src),					udpport_string(sport),					ip6addr_string(&ip6->ip6_dst),					udpport_string(dport));			}		} else {			if (sport != -1) {				(void)printf("%s > %s: ",					udpport_string(sport),					udpport_string(dport));			}		}	} else#endif /*INET6*/	{		if (ip->ip_p == IPPROTO_UDP) {			if (sport == -1) {				(void)printf("%s > %s: ",					ipaddr_string(&ip->ip_src),					ipaddr_string(&ip->ip_dst));			} else {				(void)printf("%s.%s > %s.%s: ",					ipaddr_string(&ip->ip_src),					udpport_string(sport),					ipaddr_string(&ip->ip_dst),					udpport_string(dport));			}		} else {			if (sport != -1) {				(void)printf("%s > %s: ",					udpport_string(sport),					udpport_string(dport));			}		}	}}voidudp_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 (!TTEST(up->uh_dport)) {		udpipaddr_print(ip, -1, -1);		(void)printf("[|udp]");		return;	}	sport = EXTRACT_16BITS(&up->uh_sport);	dport = EXTRACT_16BITS(&up->uh_dport);	if (length < sizeof(struct udphdr)) {		udpipaddr_print(ip, sport, dport);		(void)printf("truncated-udp %d", length);		return;	}	length -= sizeof(struct udphdr);	if (cp > snapend) {		udpipaddr_print(ip, sport, dport);		(void)printf("[|udp]");		return;	}	ulen = EXTRACT_16BITS(&up->uh_ulen);	if (ulen < 8) {		udpipaddr_print(ip, sport, dport);		(void)printf("truncated-udplength %d", ulen);		return;	}	if (packettype) {		register struct sunrpc_msg *rp;		enum sunrpc_msg_type direction;		switch (packettype) {		case PT_VAT:			udpipaddr_print(ip, sport, dport);			vat_print((void *)(up + 1), up);			break;		case PT_WB:			udpipaddr_print(ip, sport, dport);			wb_print((void *)(up + 1), length);			break;		case PT_RPC:			rp = (struct sunrpc_msg *)(up + 1);			direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);			if (direction == SUNRPC_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:			udpipaddr_print(ip, sport, dport);			rtp_print((void *)(up + 1), length, up);			break;		case PT_RTCP:			udpipaddr_print(ip, sport, dport);			while (cp < ep)				cp = rtcp_print(cp, ep);			break;		case PT_SNMP:			udpipaddr_print(ip, sport, dport);			snmp_print((const u_char *)(up + 1), length);			break;		case PT_CNFP:			udpipaddr_print(ip, sport, dport);			cnfp_print(cp, (const u_char *)ip);			break;		case PT_TFTP:			udpipaddr_print(ip, sport, dport);			tftp_print(cp, length);			break;		case PT_AODV:			udpipaddr_print(ip, sport, dport);			aodv_print((const u_char *)(up + 1), length,#ifdef INET6			    ip6 != NULL);#else			    0);#endif			break;		}		return;	}	if (!qflag) {		register struct sunrpc_msg *rp;		enum sunrpc_msg_type direction;		rp = (struct sunrpc_msg *)(up + 1);		if (TTEST(rp->rm_direction)) {			direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);			if (dport == NFS_PORT && direction == SUNRPC_CALL) {				nfsreq_print((u_char *)rp, length,				    (u_char *)ip);				return;			}			if (sport == NFS_PORT && direction == SUNRPC_REPLY) {				nfsreply_print((u_char *)rp, length,				    (u_char *)ip);				return;			}#ifdef notdef			if (dport == SUNRPC_PORT && direction == SUNRPC_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;		}	}	udpipaddr_print(ip, sport, dport);	if (IP_V(ip) == 4 && (vflag > 1) && !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 + sizeof(struct udphdr));			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 + sizeof(struct udphdr));			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, 0);		else if (ISPORT(MULTICASTDNS_PORT))			ns_print((const u_char *)(up + 1), length, 1);		else if (ISPORT(TIMED_PORT))			timed_print((const u_char *)(up + 1));		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);		else if (ISPORT(RIP_PORT))			rip_print((const u_char *)(up + 1), length);		else if (ISPORT(AODV_PORT))			aodv_print((const u_char *)(up + 1), length,#ifdef INET6			    ip6 != NULL);#else			    0);#endif	        else if (ISPORT(ISAKMP_PORT))			 isakmp_print(gndo, (const u_char *)(up + 1), length, bp2);  	        else if (ISPORT(ISAKMP_PORT_NATT))			 isakmp_rfc3948_print(gndo, (const u_char *)(up + 1), length, bp2);#if 1 /*???*/   	        else if (ISPORT(ISAKMP_PORT_USER1) || ISPORT(ISAKMP_PORT_USER2))			isakmp_print(gndo, (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));		else if (ISPORT(L2TP_PORT))			l2tp_print((const u_char *)(up + 1), length);#ifdef TCPDUMP_DO_SMB		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);#endif		else if (dport == 3456)			vat_print((const void *)(up + 1), up);		else if (ISPORT(ZEPHYR_SRV_PORT) || ISPORT(ZEPHYR_CLT_PORT))			zephyr_print((const void *)(up + 1), length);		/*		 * 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);		}#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 if (dport == HSRP_PORT)			hsrp_print((const u_char *)(up + 1), length);		else if (ISPORT(LWRES_PORT))			lwres_print((const u_char *)(up + 1), length);                else if (ISPORT(LDP_PORT))			ldp_print((const u_char *)(up + 1), length);                else if (ISPORT(OLSR_PORT))			olsr_print((const u_char *)(up + 1), length);                else if (ISPORT(MPLS_LSP_PING_PORT))			lspping_print((const u_char *)(up + 1), length);		else if (dport == BFD_CONTROL_PORT ||			 dport == BFD_ECHO_PORT )			bfd_print((const u_char *)(up+1), length, dport);                else if (ISPORT(LMP_PORT))			lmp_print((const u_char *)(up + 1), length);		else if (ISPORT(VQP_PORT))			vqp_print((const u_char *)(up + 1), length);                else if (ISPORT(SFLOW_PORT))                        sflow_print((const u_char *)(up + 1), length);	        else if (dport == LWAPP_CONTROL_PORT)			lwapp_control_print((const u_char *)(up + 1), length, 1);                else if (sport == LWAPP_CONTROL_PORT)                        lwapp_control_print((const u_char *)(up + 1), length, 0);                else if (ISPORT(LWAPP_DATA_PORT))                        lwapp_data_print((const u_char *)(up + 1), length);                else if (ISPORT(SIP_PORT))			sip_print((const u_char *)(up + 1), length);                else if (ISPORT(SYSLOG_PORT))			syslog_print((const u_char *)(up + 1), length);		else			(void)printf("UDP, length %u",			    (u_int32_t)(ulen - sizeof(*up)));#undef ISPORT	} else		(void)printf("UDP, length %u", (u_int32_t)(ulen - sizeof(*up)));}/* * Local Variables: * c-style: whitesmith * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

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