diff options
author | Michal Labedzki <michal.labedzki@tieto.com> | 2014-12-19 15:41:57 +0100 |
---|---|---|
committer | Michal Labedzki <michal.labedzki@tieto.com> | 2015-01-09 07:00:41 +0000 |
commit | 17f1a44168cb0afeff32ab07058fb156a1d2b02b (patch) | |
tree | 56bd5149290c392b5feee347f1e32b8b3018d00c /epan | |
parent | 5be440f1cb72898f100fa4cb0660dc0a822ede53 (diff) |
Bluetooth: AVDTP: Fix other-side Reconfigure
It is used to properly configure internal SEP data using to
properly decode music stream.
Change-Id: If8a15267ce072eaedfac947d7558be2d3e796483
Reviewed-on: https://code.wireshark.org/review/6404
Petri-Dish: Michal Labedzki <michal.labedzki@tieto.com>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
Tested-by: Michal Labedzki <michal.labedzki@tieto.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-btavdtp.c | 102 |
1 files changed, 63 insertions, 39 deletions
diff --git a/epan/dissectors/packet-btavdtp.c b/epan/dissectors/packet-btavdtp.c index 1a4d8ba9a4..d07771a2e7 100644 --- a/epan/dissectors/packet-btavdtp.c +++ b/epan/dissectors/packet-btavdtp.c @@ -1612,6 +1612,7 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) guint32 int_seid; guint32 vendor_id; guint16 vendor_codec; + guint32 reverse_direction; offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, &seid, interface_id, @@ -1622,27 +1623,48 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) offset = dissect_capabilities(tvb, pinfo, btavdtp_tree, offset, &codec, &content_protection_type, &vendor_id, &vendor_codec); - key[0].length = 1; - key[0].key = &interface_id; - key[1].length = 1; - key[1].key = &adapter_id; - key[2].length = 1; - key[2].key = &chandle; - key[3].length = 1; - key[3].key = &direction; - key[4].length = 1; - key[4].key = &seid; - key[5].length = 0; - key[5].key = NULL; + if (!pinfo->fd->flags.visited) { + key[0].length = 1; + key[0].key = &interface_id; + key[1].length = 1; + key[1].key = &adapter_id; + key[2].length = 1; + key[2].key = &chandle; + key[3].length = 1; + key[3].key = &direction; + key[4].length = 1; + key[4].key = &seid; + key[5].length = 0; + key[5].key = NULL; + + subtree = (wmem_tree_t *) wmem_tree_lookup32_array(sep_list, key); + sep = (subtree) ? (sep_entry_t *) wmem_tree_lookup32_le(subtree, frame_number) : NULL; + if (sep) { + sep->codec = codec; + sep->vendor_id = vendor_id; + sep->vendor_codec = vendor_codec; + sep->content_protection_type = content_protection_type; + sep->int_seid = int_seid; + + if (direction == P2P_DIR_SENT) + reverse_direction = P2P_DIR_RECV; + else if (direction == P2P_DIR_RECV) + reverse_direction = P2P_DIR_SENT; + else + reverse_direction = P2P_DIR_UNKNOWN; + + key[3].length = 1; + key[3].key = &reverse_direction; + key[4].length = 1; + key[4].key = &int_seid; + key[5].length = 1; + key[5].key = &frame_number; + key[6].length = 0; + key[6].key = NULL; + + wmem_tree_insert32_array(sep_list, key, sep); + } - subtree = (wmem_tree_t *) wmem_tree_lookup32_array(sep_list, key); - sep = (subtree) ? (sep_entry_t *) wmem_tree_lookup32_le(subtree, frame_number) : NULL; - if (sep) { - sep->codec = codec; - sep->vendor_id = vendor_id; - sep->vendor_codec = vendor_codec; - sep->content_protection_type = content_protection_type; - sep->int_seid = int_seid; } break; @@ -1681,26 +1703,28 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) offset = dissect_capabilities(tvb, pinfo, btavdtp_tree, offset, &codec, &content_protection_type, &vendor_id, &vendor_codec); - key[0].length = 1; - key[0].key = &interface_id; - key[1].length = 1; - key[1].key = &adapter_id; - key[2].length = 1; - key[2].key = &chandle; - key[3].length = 1; - key[3].key = &direction; - key[4].length = 1; - key[4].key = &seid; - key[5].length = 0; - key[5].key = NULL; + if (!pinfo->fd->flags.visited) { + key[0].length = 1; + key[0].key = &interface_id; + key[1].length = 1; + key[1].key = &adapter_id; + key[2].length = 1; + key[2].key = &chandle; + key[3].length = 1; + key[3].key = &direction; + key[4].length = 1; + key[4].key = &seid; + key[5].length = 0; + key[5].key = NULL; - subtree = (wmem_tree_t *) wmem_tree_lookup32_array(sep_list, key); - sep = (subtree) ? (sep_entry_t *) wmem_tree_lookup32_le(subtree, frame_number) : NULL; - if (sep) { - sep->codec = codec; - sep->vendor_id = vendor_id; - sep->vendor_codec = vendor_codec; - sep->content_protection_type = content_protection_type; + subtree = (wmem_tree_t *) wmem_tree_lookup32_array(sep_list, key); + sep = (subtree) ? (sep_entry_t *) wmem_tree_lookup32_le(subtree, frame_number) : NULL; + if (sep) { + sep->codec = codec; + sep->vendor_id = vendor_id; + sep->vendor_codec = vendor_codec; + sep->content_protection_type = content_protection_type; + } } break; |