X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/0b1de8f73d9b1484095a5ba484e83021ef7bc7ae..refs/heads/tcpdump-4.9:/print-dccp.c diff --git a/print-dccp.c b/print-dccp.c index 09cf72b2..bc3feb7c 100644 --- a/print-dccp.c +++ b/print-dccp.c @@ -7,22 +7,22 @@ * BSD-style license that accompanies tcpdump or the GNU GPL version 2 */ +/* \summary: Datagram Congestion Control Protocol (DCCP) printer */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include +#include #include #include -#include "interface.h" +#include "netdissect.h" #include "addrtoname.h" -#include "extract.h" /* must come after interface.h */ +#include "extract.h" #include "ip.h" -#ifdef INET6 #include "ip6.h" -#endif #include "ipproto.h" /* RFC4340: Datagram Congestion Control Protocol (DCCP) */ @@ -204,13 +204,12 @@ static int dccp_cksum(netdissect_options *ndo, const struct ip *ip, dccp_csum_coverage(dh, len), IPPROTO_DCCP); } -#ifdef INET6 -static int dccp6_cksum(const struct ip6_hdr *ip6, const struct dccp_hdr *dh, u_int len) +static int dccp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6, + const struct dccp_hdr *dh, u_int len) { - return nextproto6_cksum(ip6, (const uint8_t *)(const void *)dh, len, + return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)dh, len, dccp_csum_coverage(dh, len), IPPROTO_DCCP); } -#endif static const char *dccp_reset_code(uint8_t code) { @@ -271,9 +270,7 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, { const struct dccp_hdr *dh; const struct ip *ip; -#ifdef INET6 const struct ip6_hdr *ip6; -#endif const u_char *cp; u_short sport, dport; u_int hlen; @@ -283,12 +280,10 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, dh = (const struct dccp_hdr *)bp; ip = (const struct ip *)data2; -#ifdef INET6 if (IP_V(ip) == 6) ip6 = (const struct ip6_hdr *)data2; else ip6 = NULL; -#endif /*INET6*/ /* make sure we have enough data to look at the X bit */ cp = (const u_char *)(dh + 1); @@ -315,14 +310,11 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, dport = EXTRACT_16BITS(&dh->dccph_dport); hlen = dh->dccph_doff * 4; -#ifdef INET6 if (ip6) { ND_PRINT((ndo, "%s.%d > %s.%d: ", ip6addr_string(ndo, &ip6->ip6_src), sport, ip6addr_string(ndo, &ip6->ip6_dst), dport)); - } else -#endif /*INET6*/ - { + } else { ND_PRINT((ndo, "%s.%d > %s.%d: ", ipaddr_string(ndo, &ip->ip_src), sport, ipaddr_string(ndo, &ip->ip_dst), dport)); @@ -352,10 +344,8 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, ND_PRINT((ndo, "cksum 0x%04x ", dccp_sum)); if (IP_V(ip) == 4) sum = dccp_cksum(ndo, ip, dh, len); -#ifdef INET6 else if (IP_V(ip) == 6) - sum = dccp6_cksum(ip6, dh, len); -#endif + sum = dccp6_cksum(ndo, ip6, dh, len); if (sum != 0) ND_PRINT((ndo, "(incorrect -> 0x%04x)",in_cksum_shouldbe(dccp_sum, sum))); else @@ -497,7 +487,6 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, /* process options */ if (hlen > fixed_hdrlen){ - const u_char *cp; u_int optlen; cp = bp + fixed_hdrlen; ND_PRINT((ndo, " <")); @@ -541,7 +530,8 @@ static const struct tok dccp_option_values[] = { { 0, NULL } }; -static int dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) +static int +dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) { uint8_t optlen, i; @@ -634,16 +624,54 @@ static int dccp_print_option(netdissect_options *ndo, const u_char *option, u_in } break; case 41: - if (optlen == 4) + /* + * 13.1. Timestamp Option + * + * +--------+--------+--------+--------+--------+--------+ + * |00101001|00000110| Timestamp Value | + * +--------+--------+--------+--------+--------+--------+ + * Type=41 Length=6 + */ + if (optlen == 6) ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); else - ND_PRINT((ndo, " optlen != 4")); + ND_PRINT((ndo, " [optlen != 6]")); break; case 42: - if (optlen == 4) + /* + * 13.3. Timestamp Echo Option + * + * +--------+--------+--------+--------+--------+--------+ + * |00101010|00000110| Timestamp Echo | + * +--------+--------+--------+--------+--------+--------+ + * Type=42 Len=6 + * + * +--------+--------+------- ... -------+--------+--------+ + * |00101010|00001000| Timestamp Echo | Elapsed Time | + * +--------+--------+------- ... -------+--------+--------+ + * Type=42 Len=8 (4 bytes) + * + * +--------+--------+------- ... -------+------- ... -------+ + * |00101010|00001010| Timestamp Echo | Elapsed Time | + * +--------+--------+------- ... -------+------- ... -------+ + * Type=42 Len=10 (4 bytes) (4 bytes) + */ + switch (optlen) { + case 6: ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); - else - ND_PRINT((ndo, " optlen != 4")); + break; + case 8: + ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); + ND_PRINT((ndo, " (elapsed time %u)", EXTRACT_16BITS(option + 6))); + break; + case 10: + ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); + ND_PRINT((ndo, " (elapsed time %u)", EXTRACT_32BITS(option + 6))); + break; + default: + ND_PRINT((ndo, " [optlen != 6 or 8 or 10]")); + break; + } break; case 43: if (optlen == 6) @@ -651,7 +679,7 @@ static int dccp_print_option(netdissect_options *ndo, const u_char *option, u_in else if (optlen == 4) ND_PRINT((ndo, " %u", EXTRACT_16BITS(option + 2))); else - ND_PRINT((ndo, " optlen != 4 or 6")); + ND_PRINT((ndo, " [optlen != 4 or 6]")); break; case 44: if (optlen > 2) {