diff options
author | Sergey Avseyev <sergey.avseyev@gmail.com> | 2015-10-30 10:39:01 +0300 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2015-10-30 12:11:45 +0000 |
commit | a4b1cde7937d971f77131204cf3d6e9332835c08 (patch) | |
tree | b13eeef00d23b8019e4bc960217ea285cbaa7e99 /epan/dissectors/packet-couchbase.c | |
parent | d95b8597c923288f342d7e9e33621b66cce51a10 (diff) |
couchbase: implement comand 0x48 to get vbucket seqnos
Also add missing extras definition for DCP buffer acknowledgement
Change-Id: I29cd1e4751b92f119627e42329b2dcfdd7c378df
Reviewed-on: https://code.wireshark.org/review/11419
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-couchbase.c')
-rw-r--r-- | epan/dissectors/packet-couchbase.c | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/epan/dissectors/packet-couchbase.c b/epan/dissectors/packet-couchbase.c index 082963652c..4b6b4d335e 100644 --- a/epan/dissectors/packet-couchbase.c +++ b/epan/dissectors/packet-couchbase.c @@ -171,6 +171,8 @@ #define PROTOCOL_BINARY_CMD_TAP_CHECKPOINT_START 0x46 #define PROTOCOL_BINARY_CMD_TAP_CHECKPOINT_END 0x47 +#define PROTOCOL_BINARY_CMD_GET_ALL_VB_SEQNOS 0x48 + /* Commands from EP (eventually persistent) and bucket engines */ #define PROTOCOL_BINARY_CMD_STOP_PERSISTENCE 0x80 #define PROTOCOL_BINARY_CMD_START_PERSISTENCE 0x81 @@ -325,6 +327,7 @@ static int hf_extras_rev_seqno = -1; static int hf_extras_lock_time = -1; static int hf_extras_nmeta = -1; static int hf_extras_nru = -1; +static int hf_extras_bytes_to_ack = -1; static int hf_extras_pathlen = -1; static int hf_key = -1; static int hf_path = -1; @@ -342,6 +345,12 @@ static int hf_failover_log_size = -1; static int hf_failover_log_vbucket_uuid = -1; static int hf_failover_log_vbucket_seqno = -1; +static int hf_vbucket_states = -1; +static int hf_vbucket_states_state = -1; +static int hf_vbucket_states_size = -1; +static int hf_vbucket_states_id = -1; +static int hf_vbucket_states_seqno = -1; + static int hf_multipath = -1; static int hf_multipath_opcode = -1; static int hf_multipath_index = -1; @@ -368,6 +377,7 @@ static gint ett_extras = -1; static gint ett_extras_flags = -1; static gint ett_observe = -1; static gint ett_failover_log = -1; +static gint ett_vbucket_states = -1; static gint ett_multipath = -1; static const value_string magic_vals[] = { @@ -490,6 +500,7 @@ static const value_string opcode_vals[] = { { PROTOCOL_BINARY_CMD_TAP_VBUCKET_SET, "TAP VBucket Set" }, { PROTOCOL_BINARY_CMD_TAP_CHECKPOINT_START, "TAP Checkpoint Start" }, { PROTOCOL_BINARY_CMD_TAP_CHECKPOINT_END, "TAP Checkpoint End" }, + { PROTOCOL_BINARY_CMD_GET_ALL_VB_SEQNOS, "Get All VBucket Seqnos" }, { PROTOCOL_BINARY_DCP_OPEN_CONNECTION, "DCP Open Connection" }, { PROTOCOL_BINARY_DCP_ADD_STREAM, "DCP Add Stream" }, { PROTOCOL_BINARY_DCP_CLOSE_STREAM, "DCP Close Stream" }, @@ -586,6 +597,14 @@ const value_string dcp_connection_type_vals[] = { {0, NULL} }; +const value_string vbucket_states_vals[] = { + {1, "Active"}, + {2, "Replica"}, + {3, "Pending"}, + {4, "Dead"}, + {0, NULL} +}; + static const value_string datatype_vals[] = { { DT_RAW_BYTES, "Raw bytes"}, { 0, NULL } @@ -757,6 +776,19 @@ dissect_extras(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } break; + case PROTOCOL_BINARY_CMD_GET_ALL_VB_SEQNOS: + if (extlen) { + if (request) { + /* May have extras */ + proto_tree_add_item(extras_tree, hf_vbucket_states_state, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } else { + /* Must not have extras */ + illegal = TRUE; + } + } + break; + case PROTOCOL_BINARY_CMD_TAP_CONNECT: { static const int * extra_flags[] = { @@ -952,6 +984,20 @@ dissect_extras(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } break; + case PROTOCOL_BINARY_DCP_BUFFER_ACKNOWLEDGEMENT: + if (extlen) { + if (request) { + proto_tree_add_item(extras_tree, hf_extras_bytes_to_ack, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } else { + illegal = TRUE; + } + } else if (request) { + /* Request must have extras */ + missing = TRUE; + } + break; + case PROTOCOL_BINARY_CMD_SUBDOC_GET: case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS: case PROTOCOL_BINARY_CMD_SUBDOC_DICT_ADD: @@ -1036,6 +1082,8 @@ dissect_key(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, case PROTOCOL_BINARY_CMD_NOOP: case PROTOCOL_BINARY_CMD_VERSION: case PROTOCOL_BINARY_DCP_FAILOVER_LOG_REQUEST: + case PROTOCOL_BINARY_DCP_BUFFER_ACKNOWLEDGEMENT: + case PROTOCOL_BINARY_CMD_GET_ALL_VB_SEQNOS: /* Request and Response must not have key */ illegal = TRUE; break; @@ -1261,7 +1309,7 @@ dissect_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } } else if (!request && opcode == PROTOCOL_BINARY_DCP_STREAM_REQUEST) { if (value_len % 16 != 0) { - expert_add_info_format(pinfo, ti, &ef_warn_illegal_value_length, "Response with bad failouver log length"); + expert_add_info_format(pinfo, ti, &ef_warn_illegal_value_length, "Response with bad failover log length"); } else { proto_tree *failover_log_tree; gint cur = offset, end = offset + value_len; @@ -1276,6 +1324,23 @@ dissect_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, cur += 8; } } + } else if (!request && opcode == PROTOCOL_BINARY_CMD_GET_ALL_VB_SEQNOS) { + if (value_len % 10 != 0) { + expert_add_info_format(pinfo, ti, &ef_warn_illegal_value_length, "Response with bad body length"); + } else { + proto_tree *vbucket_states_tree; + gint cur = offset, end = offset + value_len; + ti = proto_tree_add_item(tree, hf_vbucket_states, tvb, offset, value_len, ENC_ASCII|ENC_NA); + vbucket_states_tree = proto_item_add_subtree(ti, ett_vbucket_states); + ti = proto_tree_add_uint(vbucket_states_tree, hf_vbucket_states_size, tvb, offset, 0, (end - cur) / 10); + PROTO_ITEM_SET_GENERATED(ti); + while (cur < end) { + proto_tree_add_item(vbucket_states_tree, hf_vbucket_states_id, tvb, cur, 2, ENC_BIG_ENDIAN); + cur += 2; + proto_tree_add_item(vbucket_states_tree, hf_vbucket_states_seqno, tvb, cur, 8, ENC_BIG_ENDIAN); + cur += 8; + } + } } else if (!request && (opcode == PROTOCOL_BINARY_CMD_INCREMENT || opcode == PROTOCOL_BINARY_CMD_DECREMENT)) { ti = proto_tree_add_item(tree, hf_uint64_response, tvb, offset, 8, ENC_BIG_ENDIAN); if (value_len != 8) { @@ -1623,12 +1688,19 @@ proto_register_couchbase(void) { &hf_extras_lock_time, { "lock_time", "couchbase.extras.lock_time", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_extras_nmeta, { "nmeta", "couchbase.extras.nmeta", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_extras_nru, { "nru", "couchbase.extras.nru", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_extras_bytes_to_ack, { "bytes_to_ack", "couchbase.extras.bytes_to_ack", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_failover_log, { "Failover Log", "couchbase.dcp.failover_log", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_failover_log_size, { "Size", "couchbase.dcp.failover_log.size", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_failover_log_vbucket_uuid, { "VBucket UUID", "couchbase.dcp.failover_log.vbucket_uuid", FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_failover_log_vbucket_seqno, { "Sequence Number", "couchbase.dcp.failover_log.seqno", FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_vbucket_states, { "VBucket States", "couchbase.vbucket_states", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + { &hf_vbucket_states_state, { "State", "couchbase.vbucket_states.state", FT_UINT32, BASE_HEX, VALS(vbucket_states_vals), 0x0, NULL, HFILL } }, + { &hf_vbucket_states_size, { "Size", "couchbase.vbucket_states.size", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_vbucket_states_id, { "VBucket", "couchbase.vbucket_states.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_vbucket_states_seqno, { "Sequence Number", "couchbase.vbucket_states.seqno", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_extras_expiration, { "Expiration", "couchbase.extras.expiration", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_extras_delta, { "Amount to Add", "couchbase.extras.delta", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_extras_initial, { "Initial Value", "couchbase.extras.initial", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, @@ -1673,6 +1745,7 @@ proto_register_couchbase(void) &ett_extras_flags, &ett_observe, &ett_failover_log, + &ett_vbucket_states, &ett_multipath }; |