]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-udp.c
CI: Add warning exemptions for Sun C (suncc-5.15) on Solaris 10
[tcpdump] / print-udp.c
index ad0c47b0b4e9ae5203c3d7fdfd83ce817a6c74c9..982ddb9291f62d6d81f4075d60089c8b251b11c0 100644 (file)
@@ -21,9 +21,7 @@
 
 /* \summary: UDP printer */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#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
 
@@ -212,7 +210,7 @@ rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len)
 }
 
 static const u_char *
-rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
+rtcp_print(netdissect_options *ndo, const u_char *hdr)
 {
        /* rtp v2 control (rtcp) */
        const struct rtcp_rr *rr = 0;
@@ -220,16 +218,15 @@ rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
        const struct rtcphdr *rh = (const struct rtcphdr *)hdr;
        u_int len;
        uint16_t flags;
+       uint32_t ssrc;
        u_int cnt;
        double ts, dts;
 
        ndo->ndo_protocol = "rtcp";
-       if ((const u_char *)(rh + 1) > ep)
-               goto trunc;
-       ND_TCHECK_SIZE(rh);
        len = (GET_BE_U_2(rh->rh_len) + 1) * 4;
        flags = GET_BE_U_2(rh->rh_flags);
        cnt = (flags >> 8) & 0x1f;
+       ssrc = GET_BE_U_4(rh->rh_ssrc);
        switch (flags & 0xff) {
        case RTCP_PT_SR:
                sr = (const struct rtcp_sr *)(rh + 1);
@@ -237,10 +234,7 @@ rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
                if (len != cnt * sizeof(*rr) + sizeof(*sr) + sizeof(*rh))
                        ND_PRINT(" [%u]", len);
                if (ndo->ndo_vflag)
-                       ND_PRINT(" %u", GET_BE_U_4(rh->rh_ssrc));
-               if ((const u_char *)(sr + 1) > ep)
-                       goto trunc;
-               ND_TCHECK_SIZE(sr);
+                       ND_PRINT(" %u", ssrc);
                ts = (double)(GET_BE_U_4(sr->sr_ntp.upper)) +
                    ((double)(GET_BE_U_4(sr->sr_ntp.lower)) /
                     FMAXINT);
@@ -254,18 +248,18 @@ rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
                        ND_PRINT(" [%u]", len);
                rr = (const struct rtcp_rr *)(rh + 1);
                if (ndo->ndo_vflag)
-                       ND_PRINT(" %u", GET_BE_U_4(rh->rh_ssrc));
+                       ND_PRINT(" %u", ssrc);
                break;
        case RTCP_PT_SDES:
                ND_PRINT(" sdes %u", len);
                if (ndo->ndo_vflag)
-                       ND_PRINT(" %u", GET_BE_U_4(rh->rh_ssrc));
+                       ND_PRINT(" %u", ssrc);
                cnt = 0;
                break;
        case RTCP_PT_BYE:
                ND_PRINT(" bye %u", len);
                if (ndo->ndo_vflag)
-                       ND_PRINT(" %u", GET_BE_U_4(rh->rh_ssrc));
+                       ND_PRINT(" %u", ssrc);
                cnt = 0;
                break;
        default:
@@ -276,9 +270,6 @@ rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
        if (cnt > 1)
                ND_PRINT(" c%u", cnt);
        while (cnt != 0) {
-               if ((const u_char *)(rr + 1) > ep)
-                       goto trunc;
-               ND_TCHECK_SIZE(rr);
                if (ndo->ndo_vflag)
                        ND_PRINT(" %u", GET_BE_U_4(rr->rr_srcid));
                ts = (double)(GET_BE_U_4(rr->rr_lsr)) / 65536.;
@@ -290,10 +281,6 @@ rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
                cnt--;
        }
        return (hdr + len);
-
-trunc:
-       nd_print_trunc(ndo);
-       return ep;
 }
 
 static uint16_t udp_cksum(netdissect_options *ndo, const struct ip *ip,
@@ -360,6 +347,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
        const u_char *ep = ndo->ndo_snapend;
        uint16_t sport, dport;
        u_int ulen;
+       uint16_t udp_sum;
        const struct ip6_hdr *ip6;
 
        ndo->ndo_protocol = "udp";
@@ -371,7 +359,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
                ip6 = NULL;
        if (!ND_TTEST_2(up->uh_dport)) {
                udpipaddr_noport_print(ndo, ip);
-               goto trunc;
+               nd_trunc_longjmp(ndo);
        }
 
        sport = GET_BE_U_2(up->uh_sport);
@@ -379,14 +367,9 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
        if (ndo->ndo_packettype != PT_RPC)
                udpipaddr_print(ndo, ip, sport, dport);
 
-       if (length < sizeof(struct udphdr)) {
-               ND_PRINT("truncated-udp %u", length);
-               return;
-       }
-       if (!ND_TTEST_2(up->uh_ulen)) {
-               goto trunc;
-       }
+       ND_ICHECKMSG_ZU("undersized-udp", length, <, sizeof(struct udphdr));
        ulen = GET_BE_U_2(up->uh_ulen);
+       udp_sum = GET_BE_U_2(up->uh_sum);
        /*
         * IPv6 Jumbo Datagrams; see RFC 2675.
         * If the length is zero, and the length provided to us is
@@ -394,19 +377,14 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
         */
        if (ulen == 0 && length > 65535)
                ulen = length;
-       if (ulen < sizeof(struct udphdr)) {
-               ND_PRINT("truncated-udplength %u", ulen);
-               return;
-       }
+       ND_ICHECKMSG_ZU("undersized-udplength", ulen, <,
+                       sizeof(struct udphdr));
        ulen -= sizeof(struct udphdr);
        length -= sizeof(struct udphdr);
        if (ulen < length)
                length = ulen;
 
        cp = (const u_char *)(up + 1);
-       if (cp > ndo->ndo_snapend) {
-               goto trunc;
-       }
 
        if (ndo->ndo_packettype) {
                const struct sunrpc_msg *rp;
@@ -439,7 +417,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
 
                case PT_RTCP:
                        while (cp < ep)
-                               cp = rtcp_print(ndo, cp, ep);
+                               cp = rtcp_print(ndo, cp);
                        break;
 
                case PT_SNMP:
@@ -455,8 +433,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
                        break;
 
                case PT_AODV:
-                       aodv_print(ndo, cp, length,
-                           ip6 != NULL);
+                       aodv_print(ndo, cp, length, IP_V(ip) == 6);
                        break;
 
                case PT_RADIUS:
@@ -484,6 +461,9 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
                        /* over_tcp: FALSE, is_mdns: FALSE */
                        domain_print(ndo, cp, length, FALSE, FALSE);
                        break;
+               case PT_QUIC:
+                       quic_print(ndo, cp);
+                       break;
                }
                return;
        }
@@ -520,14 +500,13 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
 
        if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
                /* Check the checksum, if possible. */
-               uint16_t sum, udp_sum;
+               uint16_t sum;
 
                /*
                 * XXX - do this even if vflag == 1?
                 * TCP does, and we do so for UDP-over-IPv6.
                 */
                if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1)) {
-                       udp_sum = GET_BE_U_2(up->uh_sum);
                        if (udp_sum == 0) {
                                ND_PRINT("[no cksum] ");
                        } else if (ND_TTEST_LEN(cp, length)) {
@@ -540,12 +519,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));
-                               udp_sum = GET_BE_U_2(up->uh_sum);
 
                                if (sum != 0) {
                                        ND_PRINT("[bad udp cksum 0x%04x -> 0x%04x!] ",
@@ -561,40 +538,63 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
                if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT))
                        /* over_tcp: FALSE, is_mdns: FALSE */
                        domain_print(ndo, cp, length, FALSE, FALSE);
-               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(TIMED_PORT))
-                       timed_print(ndo, (const u_char *)cp);
+               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))
@@ -607,10 +607,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))
@@ -622,8 +618,6 @@ 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) ||
@@ -633,24 +627,16 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int 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, cp, length);
                else if (dport == BFD_CONTROL_PORT ||
                         dport == BFD_MULTIHOP_PORT ||
                         dport == BFD_LAG_PORT ||
+                        dport == SBFD_PORT ||
                         dport == BFD_ECHO_PORT )
                        bfd_print(ndo, cp, length, dport);
-               else if (IS_SRC_OR_DST_PORT(LMP_PORT))
-                       lmp_print(ndo, cp, length);
+               else if (sport == SBFD_PORT)
+                       bfd_print(ndo, cp, length, sport);
                else if (IS_SRC_OR_DST_PORT(VQP_PORT))
                        vqp_print(ndo, cp, length);
                else if (IS_SRC_OR_DST_PORT(SFLOW_PORT))
@@ -663,13 +649,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);
@@ -679,17 +663,18 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
                        zep_print(ndo, cp, length);
                else if (IS_SRC_OR_DST_PORT(MPLS_PORT))
                        mpls_print(ndo, cp, length);
-               else if (ND_TTEST_1(((const struct LAP *)cp)->type) &&
-                        GET_U_1(((const struct LAP *)cp)->type) == lapDDP &&
-                        (atalk_port(sport) || atalk_port(dport))) {
+               else if ((atalk_port(sport) || atalk_port(dport)) &&
+                        GET_U_1(((const struct LAP *)cp)->type) == lapDDP) {
                        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 (IS_SRC_OR_DST_PORT(HTTPS_PORT) &&
+                        quic_detect(ndo, cp, length))
+                       quic_print(ndo, cp);
+               else if (sport == BCM_LI_PORT)
+                       bcm_li_print(ndo, cp, length);
                else {
                        if (ulen > length && !fragmented)
                                ND_PRINT("UDP, bad length %u > %u",
@@ -706,6 +691,6 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
        }
        return;
 
-trunc:
-       nd_print_trunc(ndo);
+invalid:
+       nd_print_invalid(ndo);
 }