diff options
author | Tomasz Moń <desowin@gmail.com> | 2020-07-11 16:54:13 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2020-07-12 05:07:27 +0000 |
commit | ed334d4f2d5204c691224305b04d532f1b04a812 (patch) | |
tree | 323cf895a6a2faef9fda902d6770e476a14d2a24 | |
parent | c706a909e3592d89986b856bf02894a42df699ee (diff) |
FTDI MPSSE: Improve command to response tracking
Display command code in command in packet entry. Fix command response in
linking when response for subsequent commands in packet was not in the
same packet as for the first command. Link to response packet only for
commands that actually have response.
Ping-Bug: 11743
Change-Id: I7c336202cf7d89b5cf785ad6ede8f1a71e0dc063
Reviewed-on: https://code.wireshark.org/review/37827
Petri-Dish: Tomasz Moń <desowin@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Jaap Keuter <jaap.keuter@xs4all.nl>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r-- | epan/dissectors/packet-ftdi-mpsse.c | 62 |
1 files changed, 35 insertions, 27 deletions
diff --git a/epan/dissectors/packet-ftdi-mpsse.c b/epan/dissectors/packet-ftdi-mpsse.c index cf2f149ea3..758e8973bc 100644 --- a/epan/dissectors/packet-ftdi-mpsse.c +++ b/epan/dissectors/packet-ftdi-mpsse.c @@ -374,6 +374,27 @@ static void record_command_data(command_data_t **cmd_data, packet_info *pinfo, f *cmd_data = data; } +static void expect_response(command_data_t **cmd_data, packet_info *pinfo, proto_tree *tree, + ftdi_mpsse_info_t *mpsse_info, guint8 cmd, guint16 response_length) +{ + if (pinfo->fd->visited) + { + DISSECTOR_ASSERT(*cmd_data); + DISSECTOR_ASSERT((*cmd_data)->cmd == cmd); + DISSECTOR_ASSERT((*cmd_data)->response_length == response_length); + if ((*cmd_data)->is_response_set) + { + proto_tree* response_in = proto_tree_add_uint(tree, hf_mpsse_response_in, NULL, 0, 0, (*cmd_data)->response_in_packet); + proto_item_set_generated(response_in); + } + *cmd_data = (*cmd_data)->next; + } + else + { + record_command_data(cmd_data, pinfo, mpsse_info, cmd, response_length); + } +} + static gchar* freq_to_str(gfloat freq) { if (freq < 1e3) @@ -428,16 +449,13 @@ dissect_data_shifting_command_parameters(guint8 cmd, tvbuff_t *tvb, packet_info } } - if (!pinfo->fd->visited) + if (mpsse_info->mcu_mode) { - if (mpsse_info->mcu_mode) - { - /* MCU mode seems to consume data shifting payloads but do not actually return any response data */ - } - else if (IS_DATA_SHIFTING_READING_TDO(cmd)) - { - record_command_data(cmd_data, pinfo, mpsse_info, cmd, IS_DATA_SHIFTING_BYTE_MODE(cmd) ? length + 1 : 1); - } + /* MCU mode seems to consume data shifting payloads but do not actually return any response data */ + } + else if (IS_DATA_SHIFTING_READING_TDO(cmd)) + { + expect_response(cmd_data, pinfo, tree, mpsse_info, cmd, IS_DATA_SHIFTING_BYTE_MODE(cmd) ? length + 1 : 1); } return offset - offset_start; @@ -536,12 +554,9 @@ dissect_cpumode_parameters(guint8 cmd, tvbuff_t *tvb, packet_info *pinfo, proto_ offset += 1; } - if (!pinfo->fd->visited) + if ((cmd == CMD_CPUMODE_READ_SHORT_ADDR) || (cmd == CMD_CPUMODE_READ_EXT_ADDR)) { - if ((cmd == CMD_CPUMODE_READ_SHORT_ADDR) || (cmd == CMD_CPUMODE_READ_EXT_ADDR)) - { - record_command_data(cmd_data, pinfo, mpsse_info, cmd, 1); - } + expect_response(cmd_data, pinfo, tree, mpsse_info, cmd, 1); } return offset - offset_start; @@ -666,10 +681,7 @@ dissect_non_data_shifting_command_parameters(guint8 cmd, tvbuff_t *tvb, packet_i return dissect_set_data_bits_parameters(cmd, tvb, pinfo, tree, offset, high_byte_signal_names, pin_prefix, num_pins); case CMD_READ_DATA_BITS_LOW_BYTE: case CMD_READ_DATA_BITS_HIGH_BYTE: - if (!pinfo->fd->visited) - { - record_command_data(cmd_data, pinfo, mpsse_info, cmd, 1); - } + expect_response(cmd_data, pinfo, tree, mpsse_info, cmd, 1); return 0; case CMD_CPUMODE_READ_SHORT_ADDR: case CMD_CPUMODE_READ_EXT_ADDR: @@ -802,10 +814,6 @@ dissect_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset if (!cmd_str) { cmd_str = "Bad Command"; - if (!pinfo->fd->visited) - { - record_command_data(cmd_data, pinfo, mpsse_info, cmd, 2); - } } cmd_with_parameters = proto_tree_add_bytes_format(tree, hf_mpsse_command_with_parameters, tvb, offset, 1 + parameters_length, NULL, "%s", cmd_str); @@ -833,11 +841,10 @@ dissect_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset offset += parameters_length; } } - - if (*cmd_data && (*cmd_data)->is_response_set) + else { - proto_tree *response_in = proto_tree_add_uint(cmd_tree, hf_mpsse_response_in, tvb, offset_start, 0, (*cmd_data)->response_in_packet); - proto_item_set_generated(response_in); + /* Expect Bad Command response */ + expect_response(cmd_data, pinfo, cmd_tree, mpsse_info, cmd, 2); } return offset - offset_start; @@ -915,7 +922,8 @@ dissect_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offse rsp_data = proto_tree_add_bytes_format(tree, hf_mpsse_response, tvb, offset, cmd_data->response_length, NULL, "%s", cmd_str); rsp_tree = proto_item_add_subtree(rsp_data, ett_mpsse_response_data); - command_in = proto_tree_add_uint(rsp_tree, hf_mpsse_command_in, tvb, offset, 0, cmd_data->command_in_packet); + command_in = proto_tree_add_uint_format(rsp_tree, hf_mpsse_command_in, tvb, offset, 0, cmd_data->command_in_packet, + "Command 0x%02x in: %" G_GUINT32_FORMAT, cmd_data->cmd, cmd_data->command_in_packet); proto_item_set_generated(command_in); offset += dissect_response_data(tvb, pinfo, rsp_tree, offset, cmd_data); |