diff options
author | Michal Labedzki <michal.labedzki@tieto.com> | 2015-09-22 10:11:10 +0200 |
---|---|---|
committer | Michal Labedzki <michal.labedzki@tieto.com> | 2015-10-15 05:56:58 +0000 |
commit | feb6b58e28e08c274408bf775086491500c933be (patch) | |
tree | 0eb0f31105ab5393965d275ca1d9ba1a5bf30970 | |
parent | dae1286270af8cc9f6839e82102fa7433ac7acb4 (diff) | |
download | wireshark-feb6b58e28e08c274408bf775086491500c933be.tar.gz |
Bluetooth: ATT: Support two request at once
There is possible that request will be send from two devices
in the same time. Fix request-response tracking to support this case.
Change-Id: Iaacf910d952f8dff96073e7155ea4947f9b8cbc3
Reviewed-on: https://code.wireshark.org/review/11014
Petri-Dish: Michal Labedzki <michal.labedzki@tieto.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
-rw-r--r-- | epan/dissectors/packet-btatt.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/epan/dissectors/packet-btatt.c b/epan/dissectors/packet-btatt.c index adc23e750a..5875b6923e 100644 --- a/epan/dissectors/packet-btatt.c +++ b/epan/dissectors/packet-btatt.c @@ -2951,6 +2951,39 @@ get_request(tvbuff_t *tvb, gint offset, packet_info *pinfo, guint8 opcode, sub_wmemtree = (wmem_tree_t *) wmem_tree_lookup32_array(requests, key); request_data = (sub_wmemtree) ? (request_data_t *) wmem_tree_lookup32_le(sub_wmemtree, frame_number) : NULL; + if (request_data) do { + frame_number = request_data->request_in_frame - 1; + + if (request_data->request_in_frame == pinfo->fd->num) + break; + + switch (opcode) { + case 0x01: /* Error Response */ + if (tvb_captured_length_remaining(tvb, offset) < 1) + return NULL; + opcode = tvb_get_guint8(tvb, 1) + 1; + /* No break */ + case 0x03: /* Exchange MTU Response */ + case 0x05: /* Find Information Response */ + case 0x07: /* Find By Type Value Response */ + case 0x09: /* Read By Type Response */ + case 0x0b: /* Read Response */ + case 0x0d: /* Read Blob Response */ + case 0x0f: /* Read Multiple Response */ + case 0x11: /* Read By Group Type Response */ + case 0x13: /* Write Response */ + case 0x17: /* Prepare Write Response */ + case 0x19: /* Execute Write Response */ + case 0x1E: /* Handle Value Confirmation */ + if (request_data->opcode == opcode -1) + return request_data; + + break; + } + } while(0); + + request_data = (sub_wmemtree) ? (request_data_t *) wmem_tree_lookup32_le(sub_wmemtree, frame_number) : NULL; + if (!request_data) return NULL; |