X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/abc8c2d61c65757011d9d32abb01cd1e51232f3a..b51a0dafc7861eb31d21524ec067d7c529a664b8:/print-dccp.c diff --git a/print-dccp.c b/print-dccp.c index 7662a78d..80951cf0 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" @@ -158,36 +155,36 @@ enum dccp_reset_codes { DCCP_RESET_CODE_TOO_BUSY, DCCP_RESET_CODE_BAD_INIT_COOKIE, DCCP_RESET_CODE_AGGRESSION_PENALTY, - __DCCP_RESET_CODE_LAST }; - -static const char *dccp_reset_codes[] = { - "unspecified", - "closed", - "aborted", - "no_connection", - "packet_error", - "option_error", - "mandatory_error", - "connection_refused", - "bad_service_code", - "too_busy", - "bad_init_cookie", - "aggression_penalty", +static const struct tok dccp_reset_code_str[] = { + { DCCP_RESET_CODE_UNSPECIFIED, "unspecified" }, + { DCCP_RESET_CODE_CLOSED, "closed" }, + { DCCP_RESET_CODE_ABORTED, "aborted" }, + { DCCP_RESET_CODE_NO_CONNECTION, "no_connection" }, + { DCCP_RESET_CODE_PACKET_ERROR, "packet_error" }, + { DCCP_RESET_CODE_OPTION_ERROR, "option_error" }, + { DCCP_RESET_CODE_MANDATORY_ERROR, "mandatory_error" }, + { DCCP_RESET_CODE_CONNECTION_REFUSED, "connection_refused" }, + { DCCP_RESET_CODE_BAD_SERVICE_CODE, "bad_service_code" }, + { DCCP_RESET_CODE_TOO_BUSY, "too_busy" }, + { DCCP_RESET_CODE_BAD_INIT_COOKIE, "bad_init_cookie" }, + { DCCP_RESET_CODE_AGGRESSION_PENALTY, "aggression_penalty" }, + { 0, NULL } }; -static const char *dccp_feature_nums[] = { - "reserved", - "ccid", - "allow_short_seqno", - "sequence_window", - "ecn_incapable", - "ack_ratio", - "send_ack_vector", - "send_ndp_count", - "minimum checksum coverage", - "check data checksum", +static const struct tok dccp_feature_num_str[] = { + { 0, "reserved" }, + { 1, "ccid" }, + { 2, "allow_short_seqno" }, + { 3, "sequence_window" }, + { 4, "ecn_incapable" }, + { 5, "ack_ratio" }, + { 6, "send_ack_vector" }, + { 7, "send_ndp_count" }, + { 8, "minimum checksum coverage" }, + { 9, "check data checksum" }, + { 0, NULL } }; static u_int @@ -216,13 +213,6 @@ static uint16_t dccp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6, dccp_csum_coverage(ndo, dh, len), IPPROTO_DCCP); } -static const char *dccp_reset_code(uint8_t code) -{ - if (code >= __DCCP_RESET_CODE_LAST) - return "invalid"; - return dccp_reset_codes[code]; -} - static uint64_t dccp_seqno(netdissect_options *ndo, const u_char *bp) { @@ -252,16 +242,12 @@ static void dccp_print_ack_no(netdissect_options *ndo, const u_char *bp) uint64_t ackno; if (DCCPH_X(dh) != 0) { - ND_TCHECK_8(ackp); ackno = GET_BE_U_6(ackp + 2); } else { - ND_TCHECK_4(ackp); 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); @@ -299,8 +285,8 @@ 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; } @@ -319,12 +305,12 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, 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_protocol_caps(ndo); @@ -455,7 +441,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(GET_U_1(dhr->dccph_reset_code))); + tok2str(dccp_reset_code_str, "invalid", GET_U_1(dhr->dccph_reset_code))); break; } case DCCP_PKT_SYNC: @@ -514,26 +500,44 @@ dccp_print(netdissect_options *ndo, const u_char *bp, const u_char *data2, return; trunc: nd_print_trunc(ndo); - return; } +enum dccp_option_type { + DCCP_OPTION_PADDING = 0, + DCCP_OPTION_MANDATORY = 1, + DCCP_OPTION_SLOW_RECEIVER = 2, + DCCP_OPTION_CHANGE_L = 32, + DCCP_OPTION_CONFIRM_L = 33, + DCCP_OPTION_CHANGE_R = 34, + DCCP_OPTION_CONFIRM_R = 35, + DCCP_OPTION_INIT_COOKIE = 36, + DCCP_OPTION_NDP_COUNT = 37, + DCCP_OPTION_ACK_VECTOR_NONCE_0 = 38, + DCCP_OPTION_ACK_VECTOR_NONCE_1 = 39, + DCCP_OPTION_DATA_DROPPED = 40, + DCCP_OPTION_TIMESTAMP = 41, + DCCP_OPTION_TIMESTAMP_ECHO = 42, + DCCP_OPTION_ELAPSED_TIME = 43, + DCCP_OPTION_DATA_CHECKSUM = 44 +}; + static const struct tok dccp_option_values[] = { - { 0, "nop" }, - { 1, "mandatory" }, - { 2, "slowreceiver" }, - { 32, "change_l" }, - { 33, "confirm_l" }, - { 34, "change_r" }, - { 35, "confirm_r" }, - { 36, "initcookie" }, - { 37, "ndp_count" }, - { 38, "ack_vector0" }, - { 39, "ack_vector1" }, - { 40, "data_dropped" }, - { 41, "timestamp" }, - { 42, "timestamp_echo" }, - { 43, "elapsed_time" }, - { 44, "data_checksum" }, + { DCCP_OPTION_PADDING, "nop" }, + { DCCP_OPTION_MANDATORY, "mandatory" }, + { DCCP_OPTION_SLOW_RECEIVER, "slowreceiver" }, + { DCCP_OPTION_CHANGE_L, "change_l" }, + { DCCP_OPTION_CONFIRM_L, "confirm_l" }, + { DCCP_OPTION_CHANGE_R, "change_r" }, + { DCCP_OPTION_CONFIRM_R, "confirm_r" }, + { DCCP_OPTION_INIT_COOKIE, "initcookie" }, + { DCCP_OPTION_NDP_COUNT, "ndp_count" }, + { DCCP_OPTION_ACK_VECTOR_NONCE_0, "ack_vector0" }, + { DCCP_OPTION_ACK_VECTOR_NONCE_1, "ack_vector1" }, + { DCCP_OPTION_DATA_DROPPED, "data_dropped" }, + { DCCP_OPTION_TIMESTAMP, "timestamp" }, + { DCCP_OPTION_TIMESTAMP_ECHO, "timestamp_echo" }, + { DCCP_OPTION_ELAPSED_TIME, "elapsed_time" }, + { DCCP_OPTION_DATA_CHECKSUM, "data_checksum" }, { 0, NULL } }; @@ -583,23 +587,20 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) ND_PRINT("%s", tok2str(dccp_option_values, "Option %u", GET_U_1(option))); switch (GET_U_1(option)) { - case 32: - case 33: - case 34: - case 35: + case DCCP_OPTION_CHANGE_L: + case DCCP_OPTION_CONFIRM_L: + case DCCP_OPTION_CHANGE_R: + case DCCP_OPTION_CONFIRM_R: if (optlen < 3) { ND_PRINT(" optlen too short"); return optlen; } - 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", - GET_U_1(option + 3 + i)); - } + ND_PRINT(" %s", tok2str(dccp_feature_num_str, + "invalid (%u)", GET_U_1(option + 2))); + for (i = 0; i < optlen - 3; i++) + ND_PRINT(" %u", GET_U_1(option + 3 + i)); break; - case 36: + case DCCP_OPTION_INIT_COOKIE: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) @@ -607,11 +608,11 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) GET_U_1(option + 2 + i)); } break; - case 37: + case DCCP_OPTION_NDP_COUNT: for (i = 0; i < optlen - 2; i++) ND_PRINT(" %u", GET_U_1(option + 2 + i)); break; - case 38: + case DCCP_OPTION_ACK_VECTOR_NONCE_0: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) @@ -619,7 +620,7 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) GET_U_1(option + 2 + i)); } break; - case 39: + case DCCP_OPTION_ACK_VECTOR_NONCE_1: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) @@ -627,7 +628,7 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) GET_U_1(option + 2 + i)); } break; - case 40: + case DCCP_OPTION_DATA_DROPPED: if (optlen > 2) { ND_PRINT(" 0x"); for (i = 0; i < optlen - 2; i++) @@ -635,7 +636,7 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) GET_U_1(option + 2 + i)); } break; - case 41: + case DCCP_OPTION_TIMESTAMP: /* * 13.1. Timestamp Option * @@ -649,7 +650,7 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) else ND_PRINT(" [optlen != 6]"); break; - case 42: + case DCCP_OPTION_TIMESTAMP_ECHO: /* * 13.3. Timestamp Echo Option * @@ -687,7 +688,7 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) break; } break; - case 43: + case DCCP_OPTION_ELAPSED_TIME: if (optlen == 6) ND_PRINT(" %u", GET_BE_U_4(option + 2)); else if (optlen == 4) @@ -695,7 +696,7 @@ dccp_print_option(netdissect_options *ndo, const u_char *option, u_int hlen) else ND_PRINT(" [optlen != 4 or 6]"); break; - case 44: + case DCCP_OPTION_DATA_CHECKSUM: if (optlen > 2) { ND_PRINT(" "); for (i = 0; i < optlen - 2; i++)