📄 print-udp.c
字号:
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 + -