X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/c1c3c77463d592cc576eaa491e604752044ca55a..1a04b92e365f5ed01ca38619b41bcc4fc9cbd63c:/print-dccp.c diff --git a/print-dccp.c b/print-dccp.c index 74054fb6..66d215fe 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 "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) { @@ -226,9 +225,9 @@ static uint64_t dccp_seqno(const u_char *bp) if (DCCPH_X(dh) != 0) { const struct dccp_hdr_ext *dhx = (const struct dccp_hdr_ext *)bp; - seqno = EXTRACT_48BITS(dhx->dccph_seq); + seqno = EXTRACT_BE_U_6(dhx->dccph_seq); } else { - seqno = EXTRACT_24BITS(dh->dccph_seq); + seqno = EXTRACT_BE_U_3(dh->dccph_seq); } return seqno; @@ -246,11 +245,11 @@ static void dccp_print_ack_no(netdissect_options *ndo, const u_char *bp) uint64_t ackno; if (DCCPH_X(dh) != 0) { - ND_TCHECK2(*ackp, 8); - ackno = EXTRACT_48BITS(ackp + 2); + ND_TCHECK_8(ackp); + ackno = EXTRACT_BE_U_6(ackp + 2); } else { - ND_TCHECK2(*ackp, 4); - ackno = EXTRACT_24BITS(ackp + 1); + ND_TCHECK_4(ackp); + ackno = EXTRACT_BE_U_3(ackp + 1); } ND_PRINT((ndo, "(ack=%" PRIu64 ") ", ackno)); @@ -266,14 +265,13 @@ static int dccp_print_option(netdissect_options *, const u_char *, u_int); * @data2 - beginning of enclosing * @len - lenght of ip packet */ -void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, - u_int len) +void +dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, + u_int len) { 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 +281,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); @@ -309,20 +305,17 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, len - fixed_hdrlen)); return; } - ND_TCHECK2(*dh, fixed_hdrlen); + ND_TCHECK_LEN(dh, fixed_hdrlen); - sport = EXTRACT_16BITS(&dh->dccph_sport); - dport = EXTRACT_16BITS(&dh->dccph_dport); + sport = EXTRACT_BE_U_2(&dh->dccph_sport); + dport = EXTRACT_BE_U_2(&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)); @@ -345,17 +338,15 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, } /* checksum calculation */ - if (ndo->ndo_vflag && ND_TTEST2(bp[0], len)) { + if (ndo->ndo_vflag && ND_TTEST_LEN(bp, len)) { uint16_t sum = 0, dccp_sum; - dccp_sum = EXTRACT_16BITS(&dh->dccph_checksum); + dccp_sum = EXTRACT_BE_U_2(&dh->dccph_checksum); 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 @@ -381,7 +372,7 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, ND_TCHECK(*dhr); ND_PRINT((ndo, "%s (service=%d) ", tok2str(dccp_pkt_type_str, "", dccph_type), - EXTRACT_32BITS(&dhr->dccph_req_service))); + EXTRACT_BE_U_4(&dhr->dccph_req_service))); break; } case DCCP_PKT_RESPONSE: { @@ -397,7 +388,7 @@ void dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, ND_TCHECK(*dhr); ND_PRINT((ndo, "%s (service=%d) ", tok2str(dccp_pkt_type_str, "", dccph_type), - EXTRACT_32BITS(&dhr->dccph_resp_service))); + EXTRACT_BE_U_4(&dhr->dccph_resp_service))); break; } case DCCP_PKT_DATA: @@ -544,48 +535,48 @@ static int dccp_print_option(netdissect_options *ndo, const u_char *option, u_in { uint8_t optlen, i; - ND_TCHECK(*option); + ND_TCHECK_1(option); - if (*option >= 32) { - ND_TCHECK(*(option+1)); - optlen = *(option +1); + if (EXTRACT_U_1(option) >= 32) { + ND_TCHECK_1(option + 1); + optlen = EXTRACT_U_1(option + 1); if (optlen < 2) { - if (*option >= 128) - ND_PRINT((ndo, "CCID option %u optlen too short", *option)); + if (EXTRACT_U_1(option) >= 128) + ND_PRINT((ndo, "CCID option %u optlen too short", EXTRACT_U_1(option))); else ND_PRINT((ndo, "%s optlen too short", - tok2str(dccp_option_values, "Option %u", *option))); + tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option)))); return 0; } } else optlen = 1; if (hlen < optlen) { - if (*option >= 128) + if (EXTRACT_U_1(option) >= 128) ND_PRINT((ndo, "CCID option %u optlen goes past header length", - *option)); + EXTRACT_U_1(option))); else ND_PRINT((ndo, "%s optlen goes past header length", - tok2str(dccp_option_values, "Option %u", *option))); + tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option)))); return 0; } - ND_TCHECK2(*option, optlen); + ND_TCHECK_LEN(option, optlen); - if (*option >= 128) { - ND_PRINT((ndo, "CCID option %d", *option)); + if (EXTRACT_U_1(option) >= 128) { + ND_PRINT((ndo, "CCID option %d", EXTRACT_U_1(option))); switch (optlen) { case 4: - ND_PRINT((ndo, " %u", EXTRACT_16BITS(option + 2))); + ND_PRINT((ndo, " %u", EXTRACT_BE_U_2(option + 2))); break; case 6: - ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); + ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2))); break; default: break; } } else { - ND_PRINT((ndo, "%s", tok2str(dccp_option_values, "Option %u", *option))); - switch (*option) { + ND_PRINT((ndo, "%s", tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option)))); + switch (EXTRACT_U_1(option)) { case 32: case 33: case 34: @@ -594,61 +585,61 @@ static int dccp_print_option(netdissect_options *ndo, const u_char *option, u_in ND_PRINT((ndo, " optlen too short")); return optlen; } - if (*(option + 2) < 10){ - ND_PRINT((ndo, " %s", dccp_feature_nums[*(option + 2)])); + if (EXTRACT_U_1(option + 2) < 10){ + ND_PRINT((ndo, " %s", dccp_feature_nums[EXTRACT_U_1(option + 2)])); for (i = 0; i < optlen - 3; i++) - ND_PRINT((ndo, " %d", *(option + 3 + i))); + ND_PRINT((ndo, " %d", EXTRACT_U_1(option + 3 + i))); } break; case 36: if (optlen > 2) { ND_PRINT((ndo, " 0x")); for (i = 0; i < optlen - 2; i++) - ND_PRINT((ndo, "%02x", *(option + 2 + i))); + ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i))); } break; case 37: for (i = 0; i < optlen - 2; i++) - ND_PRINT((ndo, " %d", *(option + 2 + i))); + ND_PRINT((ndo, " %d", EXTRACT_U_1(option + 2 + i))); break; case 38: if (optlen > 2) { ND_PRINT((ndo, " 0x")); for (i = 0; i < optlen - 2; i++) - ND_PRINT((ndo, "%02x", *(option + 2 + i))); + ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i))); } break; case 39: if (optlen > 2) { ND_PRINT((ndo, " 0x")); for (i = 0; i < optlen - 2; i++) - ND_PRINT((ndo, "%02x", *(option + 2 + i))); + ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i))); } break; case 40: if (optlen > 2) { ND_PRINT((ndo, " 0x")); for (i = 0; i < optlen - 2; i++) - ND_PRINT((ndo, "%02x", *(option + 2 + i))); + ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i))); } break; case 41: if (optlen == 4) - ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); + ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2))); else ND_PRINT((ndo, " optlen != 4")); break; case 42: if (optlen == 4) - ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); + ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2))); else ND_PRINT((ndo, " optlen != 4")); break; case 43: if (optlen == 6) - ND_PRINT((ndo, " %u", EXTRACT_32BITS(option + 2))); + ND_PRINT((ndo, " %u", EXTRACT_BE_U_4(option + 2))); else if (optlen == 4) - ND_PRINT((ndo, " %u", EXTRACT_16BITS(option + 2))); + ND_PRINT((ndo, " %u", EXTRACT_BE_U_2(option + 2))); else ND_PRINT((ndo, " optlen != 4 or 6")); break; @@ -656,7 +647,7 @@ static int dccp_print_option(netdissect_options *ndo, const u_char *option, u_in if (optlen > 2) { ND_PRINT((ndo, " ")); for (i = 0; i < optlen - 2; i++) - ND_PRINT((ndo, "%02x", *(option + 2 + i))); + ND_PRINT((ndo, "%02x", EXTRACT_U_1(option + 2 + i))); } break; }