X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/0b3880c91e169db7cfbdce1b18ef4f1e3fd277de..d2777156522f139a858bd6b5b51e364826bc95a7:/print-dccp.c diff --git a/print-dccp.c b/print-dccp.c index 8d3ad0ae..39234575 100644 --- a/print-dccp.c +++ b/print-dccp.c @@ -17,9 +17,6 @@ #include "netdissect-stdinc.h" -#include -#include - #include "netdissect.h" #include "addrtoname.h" #include "extract.h" @@ -78,11 +75,11 @@ struct dccp_hdr_ext { nd_uint48_t dccph_seq; }; -#define DCCPH_CCVAL(dh) ((EXTRACT_U_1((dh)->dccph_ccval_cscov) >> 4) & 0xF) -#define DCCPH_CSCOV(dh) (EXTRACT_U_1((dh)->dccph_ccval_cscov) & 0xF) +#define DCCPH_CCVAL(dh) ((GET_U_1((dh)->dccph_ccval_cscov) >> 4) & 0xF) +#define DCCPH_CSCOV(dh) (GET_U_1((dh)->dccph_ccval_cscov) & 0xF) -#define DCCPH_X(dh) (EXTRACT_U_1((dh)->dccph_xtr) & 1) -#define DCCPH_TYPE(dh) ((EXTRACT_U_1((dh)->dccph_xtr) >> 1) & 0xF) +#define DCCPH_X(dh) (GET_U_1((dh)->dccph_xtr) & 1) +#define DCCPH_TYPE(dh) ((GET_U_1((dh)->dccph_xtr) >> 1) & 0xF) /** * struct dccp_hdr_request - Connection initiation request header @@ -191,13 +188,14 @@ static const char *dccp_feature_nums[] = { }; static u_int -dccp_csum_coverage(const struct dccp_hdr* dh, u_int len) +dccp_csum_coverage(netdissect_options *ndo, + const struct dccp_hdr *dh, u_int len) { u_int cov; if (DCCPH_CSCOV(dh) == 0) return len; - cov = (EXTRACT_U_1(dh->dccph_doff) + DCCPH_CSCOV(dh) - 1) * sizeof(uint32_t); + cov = (GET_U_1(dh->dccph_doff) + DCCPH_CSCOV(dh) - 1) * sizeof(uint32_t); return (cov > len)? len : cov; } @@ -205,14 +203,14 @@ static uint16_t dccp_cksum(netdissect_options *ndo, const struct ip *ip, const struct dccp_hdr *dh, u_int len) { return nextproto4_cksum(ndo, ip, (const uint8_t *)(const void *)dh, len, - dccp_csum_coverage(dh, len), IPPROTO_DCCP); + dccp_csum_coverage(ndo, dh, len), IPPROTO_DCCP); } static uint16_t dccp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6, const struct dccp_hdr *dh, u_int len) { return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)dh, len, - dccp_csum_coverage(dh, len), IPPROTO_DCCP); + dccp_csum_coverage(ndo, dh, len), IPPROTO_DCCP); } static const char *dccp_reset_code(uint8_t code) @@ -222,23 +220,24 @@ static const char *dccp_reset_code(uint8_t code) return dccp_reset_codes[code]; } -static uint64_t dccp_seqno(const u_char *bp) +static uint64_t +dccp_seqno(netdissect_options *ndo, const u_char *bp) { const struct dccp_hdr *dh = (const struct dccp_hdr *)bp; uint64_t seqno; if (DCCPH_X(dh) != 0) { const struct dccp_hdr_ext *dhx = (const struct dccp_hdr_ext *)bp; - seqno = EXTRACT_BE_U_6(dhx->dccph_seq); + seqno = GET_BE_U_6(dhx->dccph_seq); } else { - seqno = EXTRACT_BE_U_3(dh->dccph_seq); + seqno = GET_BE_U_3(dh->dccph_seq); } return seqno; } static unsigned int -dccp_basic_hdr_len(const struct dccp_hdr *dh) +dccp_basic_hdr_len(netdissect_options *ndo, const struct dccp_hdr *dh) { return DCCPH_X(dh) ? sizeof(struct dccp_hdr_ext) : sizeof(struct dccp_hdr); } @@ -246,20 +245,16 @@ dccp_basic_hdr_len(const struct dccp_hdr *dh) static void dccp_print_ack_no(netdissect_options *ndo, const u_char *bp) { const struct dccp_hdr *dh = (const struct dccp_hdr *)bp; - const u_char *ackp = bp + dccp_basic_hdr_len(dh); + const u_char *ackp = bp + dccp_basic_hdr_len(ndo, dh); uint64_t ackno; if (DCCPH_X(dh) != 0) { - ND_TCHECK_8(ackp); - ackno = EXTRACT_BE_U_6(ackp + 2); + ackno = GET_BE_U_6(ackp + 2); } else { - ND_TCHECK_4(ackp); - ackno = EXTRACT_BE_U_3(ackp + 1); + ackno = GET_BE_U_3(ackp + 1); } ND_PRINT("(ack=%" PRIu64 ") ", ackno); -trunc: - return; } static u_int dccp_print_option(netdissect_options *, const u_char *, u_int); @@ -297,13 +292,13 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, if (cp > ndo->ndo_snapend) goto trunc; if (len < sizeof(struct dccp_hdr)) { - ND_PRINT("truncated-dccp - %u bytes missing!", - (u_int)sizeof(struct dccp_hdr) - len); + ND_PRINT("truncated-dccp - %zu bytes missing!", + sizeof(struct dccp_hdr) - len); return; } /* get the length of the generic header */ - fixed_hdrlen = dccp_basic_hdr_len(dh); + fixed_hdrlen = dccp_basic_hdr_len(ndo, dh); if (len < fixed_hdrlen) { ND_PRINT("truncated-dccp - %u bytes missing!", fixed_hdrlen - len); @@ -311,21 +306,21 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, } ND_TCHECK_LEN(dh, fixed_hdrlen); - sport = EXTRACT_BE_U_2(dh->dccph_sport); - dport = EXTRACT_BE_U_2(dh->dccph_dport); - hlen = EXTRACT_U_1(dh->dccph_doff) * 4; + sport = GET_BE_U_2(dh->dccph_sport); + dport = GET_BE_U_2(dh->dccph_dport); + hlen = GET_U_1(dh->dccph_doff) * 4; if (ip6) { ND_PRINT("%s.%u > %s.%u: ", - ip6addr_string(ndo, ip6->ip6_src), sport, - ip6addr_string(ndo, ip6->ip6_dst), dport); + GET_IP6ADDR_STRING(ip6->ip6_src), sport, + GET_IP6ADDR_STRING(ip6->ip6_dst), dport); } else { ND_PRINT("%s.%u > %s.%u: ", - ipaddr_string(ndo, ip->ip_src), sport, - ipaddr_string(ndo, ip->ip_dst), dport); + GET_IPADDR_STRING(ip->ip_src), sport, + GET_IPADDR_STRING(ip->ip_dst), dport); } - ND_PRINT("DCCP"); + nd_print_protocol_caps(ndo); if (ndo->ndo_qflag) { ND_PRINT(" %u", len - hlen); @@ -338,15 +333,15 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, /* other variables in generic header */ if (ndo->ndo_vflag) { - ND_PRINT(" (CCVal %u, CsCov %u, ", DCCPH_CCVAL(dh), DCCPH_CSCOV(dh)); + ND_PRINT(" (CCVal %u, CsCov %u", DCCPH_CCVAL(dh), DCCPH_CSCOV(dh)); } /* checksum calculation */ if (ndo->ndo_vflag && ND_TTEST_LEN(bp, len)) { uint16_t sum = 0, dccp_sum; - dccp_sum = EXTRACT_BE_U_2(dh->dccph_checksum); - ND_PRINT("cksum 0x%04x ", dccp_sum); + dccp_sum = GET_BE_U_2(dh->dccph_checksum); + ND_PRINT(", cksum 0x%04x ", dccp_sum); if (IP_V(ip) == 4) sum = dccp_cksum(ndo, ip, dh, len); else if (IP_V(ip) == 6) @@ -376,7 +371,7 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, ND_TCHECK_SIZE(dhr); ND_PRINT("%s (service=%u) ", tok2str(dccp_pkt_type_str, "", dccph_type), - EXTRACT_BE_U_4(dhr->dccph_req_service)); + GET_BE_U_4(dhr->dccph_req_service)); break; } case DCCP_PKT_RESPONSE: { @@ -392,7 +387,7 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, ND_TCHECK_SIZE(dhr); ND_PRINT("%s (service=%u) ", tok2str(dccp_pkt_type_str, "", dccph_type), - EXTRACT_BE_U_4(dhr->dccph_resp_service)); + GET_BE_U_4(dhr->dccph_resp_service)); break; } case DCCP_PKT_DATA: @@ -453,7 +448,7 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, ND_TCHECK_SIZE(dhr); ND_PRINT("%s (code=%s) ", tok2str(dccp_pkt_type_str, "", dccph_type), - dccp_reset_code(EXTRACT_U_1(dhr->dccph_reset_code))); + dccp_reset_code(GET_U_1(dhr->dccph_reset_code))); break; } case DCCP_PKT_SYNC: @@ -488,7 +483,7 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, if (ndo->ndo_vflag < 2) return; - ND_PRINT("seq %" PRIu64, dccp_seqno(bp)); + ND_PRINT("seq %" PRIu64, dccp_seqno(ndo, bp)); /* process options */ if (hlen > fixed_hdrlen){ @@ -512,7 +507,6 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, return; trunc: nd_print_trunc(ndo); - return; } static const struct tok dccp_option_values[] = { @@ -540,48 +534,47 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) { uint8_t optlen, i; - ND_TCHECK_1(option); - - if (EXTRACT_U_1(option) >= 32) { - ND_TCHECK_1(option + 1); - optlen = EXTRACT_U_1(option + 1); + if (GET_U_1(option) >= 32) { + optlen = GET_U_1(option + 1); if (optlen < 2) { - if (EXTRACT_U_1(option) >= 128) - ND_PRINT("CCID option %u optlen too short", EXTRACT_U_1(option)); + if (GET_U_1(option) >= 128) + ND_PRINT("CCID option %u optlen too short", + GET_U_1(option)); else ND_PRINT("%s optlen too short", - tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option))); + tok2str(dccp_option_values, "Option %u", GET_U_1(option))); return 0; } } else optlen = 1; if (hlen < optlen) { - if (EXTRACT_U_1(option) >= 128) + if (GET_U_1(option) >= 128) ND_PRINT("CCID option %u optlen goes past header length", - EXTRACT_U_1(option)); + GET_U_1(option)); else ND_PRINT("%s optlen goes past header length", - tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option))); + tok2str(dccp_option_values, "Option %u", GET_U_1(option))); return 0; } ND_TCHECK_LEN(option, optlen); - if (EXTRACT_U_1(option) >= 128) { - ND_PRINT("CCID option %u", EXTRACT_U_1(option)); + if (GET_U_1(option) >= 128) { + ND_PRINT("CCID option %u", GET_U_1(option)); switch (optlen) { case 4: - ND_PRINT(" %u", EXTRACT_BE_U_2(option + 2)); + ND_PRINT(" %u", GET_BE_U_2(option + 2)); break; case 6: - ND_PRINT(" %u", EXTRACT_BE_U_4(option + 2)); + ND_PRINT(" %u", GET_BE_U_4(option + 2)); break; default: break; } } else { - ND_PRINT("%s", tok2str(dccp_option_values, "Option %u", EXTRACT_U_1(option))); - switch (EXTRACT_U_1(option)) { + ND_PRINT("%s", + tok2str(dccp_option_values, "Option %u", GET_U_1(option))); + switch (GET_U_1(option)) { case 32: case 33: case 34: @@ -590,42 +583,48 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) ND_PRINT(" optlen too short"); return optlen; } - if (EXTRACT_U_1(option + 2) < 10){ - ND_PRINT(" %s", dccp_feature_nums[EXTRACT_U_1(option + 2)]); + if (GET_U_1(option + 2) < 10){ + ND_PRINT(" %s", + dccp_feature_nums[GET_U_1(option + 2)]); for (i = 0; i < optlen - 3; i++) - ND_PRINT(" %u", EXTRACT_U_1(option + 3 + i)); + ND_PRINT(" %u", + GET_U_1(option + 3 + i)); } break; case 36: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) - ND_PRINT("%02x", EXTRACT_U_1(option + 2 + i)); + ND_PRINT("%02x", + GET_U_1(option + 2 + i)); } break; case 37: for (i = 0; i < optlen - 2; i++) - ND_PRINT(" %u", EXTRACT_U_1(option + 2 + i)); + ND_PRINT(" %u", GET_U_1(option + 2 + i)); break; case 38: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) - ND_PRINT("%02x", EXTRACT_U_1(option + 2 + i)); + ND_PRINT("%02x", + GET_U_1(option + 2 + i)); } break; case 39: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) - ND_PRINT("%02x", EXTRACT_U_1(option + 2 + i)); + ND_PRINT("%02x", + GET_U_1(option + 2 + i)); } break; case 40: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) - ND_PRINT("%02x", EXTRACT_U_1(option + 2 + i)); + ND_PRINT("%02x", + GET_U_1(option + 2 + i)); } break; case 41: @@ -638,7 +637,7 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) * Type=41 Length=6 */ if (optlen == 6) - ND_PRINT(" %u", EXTRACT_BE_U_4(option + 2)); + ND_PRINT(" %u", GET_BE_U_4(option + 2)); else ND_PRINT(" [optlen != 6]"); break; @@ -663,15 +662,17 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) */ switch (optlen) { case 6: - ND_PRINT(" %u", EXTRACT_BE_U_4(option + 2)); + ND_PRINT(" %u", GET_BE_U_4(option + 2)); break; case 8: - ND_PRINT(" %u", EXTRACT_BE_U_4(option + 2)); - ND_PRINT(" (elapsed time %u)", EXTRACT_BE_U_2(option + 6)); + ND_PRINT(" %u", GET_BE_U_4(option + 2)); + ND_PRINT(" (elapsed time %u)", + GET_BE_U_2(option + 6)); break; case 10: - ND_PRINT(" %u", EXTRACT_BE_U_4(option + 2)); - ND_PRINT(" (elapsed time %u)", EXTRACT_BE_U_4(option + 6)); + ND_PRINT(" %u", GET_BE_U_4(option + 2)); + ND_PRINT(" (elapsed time %u)", + GET_BE_U_4(option + 6)); break; default: ND_PRINT(" [optlen != 6 or 8 or 10]"); @@ -680,9 +681,9 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) break; case 43: if (optlen == 6) - ND_PRINT(" %u", EXTRACT_BE_U_4(option + 2)); + ND_PRINT(" %u", GET_BE_U_4(option + 2)); else if (optlen == 4) - ND_PRINT(" %u", EXTRACT_BE_U_2(option + 2)); + ND_PRINT(" %u", GET_BE_U_2(option + 2)); else ND_PRINT(" [optlen != 4 or 6]"); break; @@ -690,7 +691,8 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) if (optlen > 2) { ND_PRINT(" "); for (i = 0; i < optlen - 2; i++) - ND_PRINT("%02x", EXTRACT_U_1(option + 2 + i)); + ND_PRINT("%02x", + GET_U_1(option + 2 + i)); } break; }