X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/ea0f25cc7765554e521bf7ea44d94f77500749f5..296d466cd6bbf2f7e75e15bb6a01268e88c76ed0:/print-udp.c diff --git a/print-udp.c b/print-udp.c index ee93a874..26371f04 100644 --- a/print-udp.c +++ b/print-udp.c @@ -21,9 +21,7 @@ /* \summary: UDP printer */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" @@ -81,14 +79,14 @@ struct rtcp_rr { #define RTCP_PT_SR 200 #define RTCP_PT_RR 201 #define RTCP_PT_SDES 202 -#define RTCP_SDES_CNAME 1 -#define RTCP_SDES_NAME 2 -#define RTCP_SDES_EMAIL 3 -#define RTCP_SDES_PHONE 4 -#define RTCP_SDES_LOC 5 -#define RTCP_SDES_TOOL 6 -#define RTCP_SDES_NOTE 7 -#define RTCP_SDES_PRIV 8 +#define RTCP_SDES_CNAME 1 +#define RTCP_SDES_NAME 2 +#define RTCP_SDES_EMAIL 3 +#define RTCP_SDES_PHONE 4 +#define RTCP_SDES_LOC 5 +#define RTCP_SDES_TOOL 6 +#define RTCP_SDES_NOTE 7 +#define RTCP_SDES_PRIV 8 #define RTCP_PT_BYE 203 #define RTCP_PT_APP 204 @@ -103,7 +101,6 @@ vat_print(netdissect_options *ndo, const u_char *hdr, u_int length) ND_PRINT("udp/va/vat, length %u < 2", length); return; } - ND_TCHECK_2((const u_int *)hdr); ts = GET_BE_U_2(hdr); if ((ts & 0xf060) != 0) { /* probably vt */ @@ -118,9 +115,7 @@ vat_print(netdissect_options *ndo, const u_char *hdr, u_int length) ND_PRINT("udp/vat, length %u < 8", length); return; } - ND_TCHECK_4(&((const u_int *)hdr)[0]); i0 = GET_BE_U_4(&((const u_int *)hdr)[0]); - ND_TCHECK_4(&((const u_int *)hdr)[1]); i1 = GET_BE_U_4(&((const u_int *)hdr)[1]); ND_PRINT("udp/vat %u c%u %u%s", length - 8, @@ -132,10 +127,6 @@ vat_print(netdissect_options *ndo, const u_char *hdr, u_int length) if (i0 & 0x3f000000) ND_PRINT(" s%u", (i0 >> 24) & 0x3f); } - return; - -trunc: - nd_print_trunc(ndo); } static void @@ -152,9 +143,7 @@ rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len) ND_PRINT("udp/rtp, length %u < 8", len); return; } - ND_TCHECK_4(&((const u_int *)hdr)[0]); i0 = GET_BE_U_4(&((const u_int *)hdr)[0]); - ND_TCHECK_4(&((const u_int *)hdr)[1]); i1 = GET_BE_U_4(&((const u_int *)hdr)[1]); dlen = len - 8; ip += 2; @@ -191,12 +180,10 @@ rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len) i0 & 0xffff, i1); if (ndo->ndo_vflag) { - ND_TCHECK_4(&((const u_int *)hdr)[2]); ND_PRINT(" %u", GET_BE_U_4(&((const u_int *)hdr)[2])); if (hasopt) { u_int i2, optlen; do { - ND_TCHECK_4(ip); i2 = GET_BE_U_4(ip); optlen = (i2 >> 16) & 0xff; if (optlen == 0 || optlen > len) { @@ -209,7 +196,6 @@ rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len) } if (hasext) { u_int i2, extlen; - ND_TCHECK_4(ip); i2 = GET_BE_U_4(ip); extlen = (i2 & 0xffff) + 1; if (extlen > len) { @@ -218,14 +204,9 @@ rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len) } ip += extlen; } - ND_TCHECK_4(ip); if (contype == 0x1f) /*XXX H.261 */ ND_PRINT(" 0x%04x", GET_BE_U_4(ip) >> 16); } - return; - -trunc: - nd_print_trunc(ndo); } static const u_char * @@ -260,7 +241,7 @@ rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep) ND_TCHECK_SIZE(sr); ts = (double)(GET_BE_U_4(sr->sr_ntp.upper)) + ((double)(GET_BE_U_4(sr->sr_ntp.lower)) / - 4294967296.0); + FMAXINT); ND_PRINT(" @%.2f %u %up %ub", ts, GET_BE_U_4(sr->sr_ts), GET_BE_U_4(sr->sr_np), GET_BE_U_4(sr->sr_nb)); rr = (const struct rtcp_rr *)(sr + 1); @@ -342,13 +323,13 @@ udpipaddr_print(netdissect_options *ndo, const struct ip *ip, int sport, int dpo if (GET_U_1(ip6->ip6_nxt) == IPPROTO_UDP) { if (sport == -1) { ND_PRINT("%s > %s: ", - ip6addr_string(ndo, ip6->ip6_src), - ip6addr_string(ndo, ip6->ip6_dst)); + GET_IP6ADDR_STRING(ip6->ip6_src), + GET_IP6ADDR_STRING(ip6->ip6_dst)); } else { ND_PRINT("%s.%s > %s.%s: ", - ip6addr_string(ndo, ip6->ip6_src), + GET_IP6ADDR_STRING(ip6->ip6_src), udpport_string(ndo, (uint16_t)sport), - ip6addr_string(ndo, ip6->ip6_dst), + GET_IP6ADDR_STRING(ip6->ip6_dst), udpport_string(ndo, (uint16_t)dport)); } } else { @@ -362,13 +343,13 @@ udpipaddr_print(netdissect_options *ndo, const struct ip *ip, int sport, int dpo if (GET_U_1(ip->ip_p) == IPPROTO_UDP) { if (sport == -1) { ND_PRINT("%s > %s: ", - ipaddr_string(ndo, ip->ip_src), - ipaddr_string(ndo, ip->ip_dst)); + GET_IPADDR_STRING(ip->ip_src), + GET_IPADDR_STRING(ip->ip_dst)); } else { ND_PRINT("%s.%s > %s.%s: ", - ipaddr_string(ndo, ip->ip_src), + GET_IPADDR_STRING(ip->ip_src), udpport_string(ndo, (uint16_t)sport), - ipaddr_string(ndo, ip->ip_dst), + GET_IPADDR_STRING(ip->ip_dst), udpport_string(ndo, (uint16_t)dport)); } } else { @@ -459,7 +440,6 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, case PT_RPC: rp = (const struct sunrpc_msg *)cp; - ND_TCHECK_4(rp->rm_direction); direction = (enum sunrpc_msg_type) GET_BE_U_4(rp->rm_direction); if (direction == SUNRPC_CALL) sunrpc_print(ndo, (const u_char *)rp, length, @@ -497,8 +477,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, case PT_AODV: udpipaddr_print(ndo, ip, sport, dport); - aodv_print(ndo, cp, length, - ip6 != NULL); + aodv_print(ndo, cp, length, IP_V(ip) == 6); break; case PT_RADIUS: @@ -530,7 +509,8 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, break; case PT_DOMAIN: udpipaddr_print(ndo, ip, sport, dport); - domain_print(ndo, cp, length, 0); + /* over_tcp: FALSE, is_mdns: FALSE */ + domain_print(ndo, cp, length, FALSE, FALSE); break; } return; @@ -576,7 +556,6 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, * TCP does, and we do so for UDP-over-IPv6. */ if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1)) { - ND_TCHECK_2(up->uh_sum); udp_sum = GET_BE_U_2(up->uh_sum); if (udp_sum == 0) { ND_PRINT("[no cksum] "); @@ -590,12 +569,10 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, } else ND_PRINT("[udp sum ok] "); } - } - else if (IP_V(ip) == 6) { + } else if (IP_V(ip) == 6) { /* for IPv6, UDP checksum is mandatory */ if (ND_TTEST_LEN(cp, length)) { sum = udp6_cksum(ndo, ip6, up, length + sizeof(struct udphdr)); - ND_TCHECK_2(up->uh_sum); udp_sum = GET_BE_U_2(up->uh_sum); if (sum != 0) { @@ -610,40 +587,65 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, if (!ndo->ndo_qflag) { if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT)) - domain_print(ndo, cp, length, 0); - else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT)) - domain_print(ndo, cp, length, 1); - else if (IS_SRC_OR_DST_PORT(TIMED_PORT)) - timed_print(ndo, (const u_char *)cp); + /* over_tcp: FALSE, is_mdns: FALSE */ + domain_print(ndo, cp, length, FALSE, FALSE); + else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || + IS_SRC_OR_DST_PORT(BOOTPS_PORT)) + bootp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(TFTP_PORT)) tftp_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || IS_SRC_OR_DST_PORT(BOOTPS_PORT)) - bootp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT)) + krb_print(ndo, (const u_char *)cp); + else if (IS_SRC_OR_DST_PORT(NTP_PORT)) + ntp_print(ndo, cp, length); +#ifdef ENABLE_SMB + else if (IS_SRC_OR_DST_PORT(NETBIOS_NS_PORT)) + nbt_udp137_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(NETBIOS_DGRAM_PORT)) + nbt_udp138_print(ndo, cp, length); +#endif + else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || + IS_SRC_OR_DST_PORT(SNMPTRAP_PORT)) + snmp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(PTP_EVENT_PORT) || + IS_SRC_OR_DST_PORT(PTP_GENERAL_PORT)) + ptp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT)) + cisco_autorp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT)) + isakmp_print(ndo, cp, length, bp2); + else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT)) + syslog_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(RIP_PORT)) rip_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(RIPNG_PORT)) + ripng_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(TIMED_PORT)) + timed_print(ndo, (const u_char *)cp); + else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || + IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT)) + dhcp6_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(LDP_PORT)) + ldp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(AODV_PORT)) - aodv_print(ndo, cp, length, - ip6 != NULL); - else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT)) - isakmp_print(ndo, cp, length, bp2); + aodv_print(ndo, cp, length, IP_V(ip) == 6); + else if (IS_SRC_OR_DST_PORT(OLSR_PORT)) + olsr_print(ndo, cp, length, IP_V(ip) == 6); + else if (IS_SRC_OR_DST_PORT(LMP_PORT)) + lmp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT)) + krb_print(ndo, (const u_char *)cp); + else if (IS_SRC_OR_DST_PORT(LWRES_PORT)) + lwres_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT)) + /* over_tcp: FALSE, is_mdns: TRUE */ + domain_print(ndo, cp, length, FALSE, TRUE); else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT)) isakmp_rfc3948_print(ndo, cp, length, bp2, IP_V(ip), fragmented, ttl_hl); else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2)) isakmp_print(ndo, cp, length, bp2); - else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || IS_SRC_OR_DST_PORT(SNMPTRAP_PORT)) - snmp_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(NTP_PORT)) - ntp_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT) || IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT)) - krb_print(ndo, (const u_char *)cp); else if (IS_SRC_OR_DST_PORT(L2TP_PORT)) l2tp_print(ndo, cp, length); -#ifdef ENABLE_SMB - else if (IS_SRC_OR_DST_PORT(NETBIOS_NS_PORT)) - nbt_udp137_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(NETBIOS_DGRAM_PORT)) - nbt_udp138_print(ndo, cp, length); -#endif else if (dport == VAT_PORT) vat_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(ZEPHYR_SRV_PORT) || IS_SRC_OR_DST_PORT(ZEPHYR_CLT_PORT)) @@ -656,10 +658,6 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, (dport >= RX_PORT_LOW && dport <= RX_PORT_HIGH)) rx_print(ndo, cp, length, sport, dport, (const u_char *) ip); - else if (IS_SRC_OR_DST_PORT(RIPNG_PORT)) - ripng_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT)) - dhcp6_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(AHCP_PORT)) ahcp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(BABEL_PORT) || IS_SRC_OR_DST_PORT(BABEL_PORT_OLD)) @@ -671,35 +669,22 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, */ else if (dport == WB_PORT) wb_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT)) - cisco_autorp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(RADIUS_PORT) || IS_SRC_OR_DST_PORT(RADIUS_NEW_PORT) || IS_SRC_OR_DST_PORT(RADIUS_ACCOUNTING_PORT) || IS_SRC_OR_DST_PORT(RADIUS_NEW_ACCOUNTING_PORT) || IS_SRC_OR_DST_PORT(RADIUS_CISCO_COA_PORT) || IS_SRC_OR_DST_PORT(RADIUS_COA_PORT) ) - radius_print(ndo, (const u_char *)(up+1), length); + radius_print(ndo, cp, length); else if (dport == HSRP_PORT) hsrp_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(LWRES_PORT)) - lwres_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(LDP_PORT)) - ldp_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(OLSR_PORT)) - olsr_print(ndo, cp, length, - (IP_V(ip) == 6) ? 1 : 0); else if (IS_SRC_OR_DST_PORT(MPLS_LSP_PING_PORT)) lspping_print(ndo, cp, length); - else if (sport == BCM_LI_PORT) - bcm_li_print(ndo, (const u_char *)(up+1), length); else if (dport == BFD_CONTROL_PORT || dport == BFD_MULTIHOP_PORT || dport == BFD_LAG_PORT || dport == BFD_ECHO_PORT ) - bfd_print(ndo, (const u_char *)(up+1), length, dport); - else if (IS_SRC_OR_DST_PORT(LMP_PORT)) - lmp_print(ndo, cp, length); + bfd_print(ndo, cp, length, dport); else if (IS_SRC_OR_DST_PORT(VQP_PORT)) vqp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(SFLOW_PORT)) @@ -712,13 +697,11 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, lwapp_data_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(SIP_PORT)) sip_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT)) - syslog_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(OTV_PORT)) otv_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(VXLAN_PORT)) vxlan_print(ndo, cp, length); - else if (IS_SRC_OR_DST_PORT(GENEVE_PORT)) + else if (dport == GENEVE_PORT) geneve_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(LISP_CONTROL_PORT)) lisp_print(ndo, cp, length); @@ -734,11 +717,10 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, if (ndo->ndo_vflag) ND_PRINT("kip "); llap_print(ndo, cp, length); - } else if (IS_SRC_OR_DST_PORT(PTP_EVENT_PORT) || - IS_SRC_OR_DST_PORT(PTP_GENERAL_PORT)) { - ptp_print(ndo, cp, length); } else if (IS_SRC_OR_DST_PORT(SOMEIP_PORT)) someip_print(ndo, cp, length); + else if (sport == BCM_LI_PORT) + bcm_li_print(ndo, cp, length); else { if (ulen > length && !fragmented) ND_PRINT("UDP, bad length %u > %u",