aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-btavdtp.c
diff options
context:
space:
mode:
authorMichal Labedzki <michal.labedzki@tieto.com>2014-02-24 11:50:37 +0100
committerAnders Broman <a.broman58@gmail.com>2014-03-07 05:04:53 +0000
commitd0132adb076e6d59141621f08c090ca5b68e59c5 (patch)
treede61a0cc16da01706078437a3b43011c98307ebe /epan/dissectors/packet-btavdtp.c
parent058527f3f19a09c332b6877030b13dedf7414c1b (diff)
Bluetooth: AVDTP: Fix trees and distinguish local and remote SEPs
When there is more then one interface or adapter then AVDTP dissector incorrectly mixing it data together. Patch extends keys to support multiple interfaces/adapters. Also do little simplification on trees. There are two device, both use SEPs to configuration and it is possible to use the same SEID. SetConfiguration use remote "ACP" SEID and local "INT" SEID, so there is need to distinguish them and please remember then INT SEID types can be unknown in most case. Change-Id: I150f3625f532386a1078deb8d0ac70a1c05c3f04 Reviewed-on: https://code.wireshark.org/review/473 Reviewed-by: Evan Huus <eapache@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-btavdtp.c')
-rw-r--r--epan/dissectors/packet-btavdtp.c400
1 files changed, 267 insertions, 133 deletions
diff --git a/epan/dissectors/packet-btavdtp.c b/epan/dissectors/packet-btavdtp.c
index c082f2d0f7..95d8818f04 100644
--- a/epan/dissectors/packet-btavdtp.c
+++ b/epan/dissectors/packet-btavdtp.c
@@ -28,6 +28,7 @@
#include <epan/expert.h>
#include <epan/prefs.h>
#include <epan/wmem/wmem.h>
+#include <wiretap/wtap.h>
#include "packet-btl2cap.h"
#include "packet-btsdp.h"
@@ -452,6 +453,9 @@ typedef struct _sep_entry_t {
} sep_entry_t;
typedef struct _cid_type_data_t {
+ guint32 interface_id;
+ guint32 adapter_id;
+ guint32 chandle;
guint32 type;
guint16 cid;
sep_entry_t *sep;
@@ -473,25 +477,29 @@ void proto_reg_handoff_btvdp(void);
void proto_register_btvdp_content_protection_header_scms_t(void);
static const char *
-get_sep_type(guint32 frame_number, guint seid)
+get_sep_type(guint32 interface_id,
+ guint32 adapter_id, guint32 chandle, guint32 direction, guint32 seid, guint32 frame_number)
{
+ wmem_tree_key_t key[6];
+ wmem_tree_t *subtree;
sep_entry_t *sep;
- wmem_tree_key_t key[3];
- guint32 t_seid;
- guint32 t_frame_number;
-
- t_seid = seid;
- t_frame_number = frame_number;
key[0].length = 1;
- key[0].key = &t_seid;
+ key[0].key = &interface_id;
key[1].length = 1;
- key[1].key = &t_frame_number;
- key[2].length = 0;
- key[2].key = NULL;
-
- sep = (sep_entry_t *)wmem_tree_lookup32_array_le(sep_list, key);
- if (sep && sep->seid == seid) {
+ 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) {
return val_to_str_const(sep->type, sep_type_vals, "unknown");
}
@@ -499,25 +507,29 @@ get_sep_type(guint32 frame_number, guint seid)
}
static const char *
-get_sep_media_type(guint32 frame_number, guint seid)
+get_sep_media_type(guint32 interface_id,
+ guint32 adapter_id, guint32 chandle, guint32 direction, guint32 seid, guint32 frame_number)
{
+ wmem_tree_key_t key[6];
+ wmem_tree_t *subtree;
sep_entry_t *sep;
- wmem_tree_key_t key[3];
- guint32 t_seid;
- guint32 t_frame_number;
-
- t_seid = seid;
- t_frame_number = frame_number;
key[0].length = 1;
- key[0].key = &t_seid;
+ key[0].key = &interface_id;
key[1].length = 1;
- key[1].key = &t_frame_number;
- key[2].length = 0;
- key[2].key = NULL;
-
- sep = (sep_entry_t *)wmem_tree_lookup32_array_le(sep_list, key);
- if (sep && sep->seid == seid) {
+ 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) {
return val_to_str_const(sep->media_type, media_type_vals, "unknown");
}
@@ -526,7 +538,8 @@ get_sep_media_type(guint32 frame_number, guint seid)
static gint
-dissect_sep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
+dissect_sep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
+ guint32 interface_id, guint32 adapter_id, guint32 chandle)
{
proto_tree *sep_tree;
proto_item *sep_item;
@@ -536,11 +549,12 @@ dissect_sep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
guint seid;
guint in_use;
guint items;
- sep_entry_t *sep_data;
- wmem_tree_key_t key[3];
- guint32 t_seid;
- guint32 t_frame_number;
+ guint32 direction;
+ /* Reverse direction to avoid mass reversing it, because this is only case
+ when SEP is provided in ACP role, otherwise INT frequently asking for it
+ */
+ direction = (pinfo->p2p_dir == P2P_DIR_SENT) ? P2P_DIR_RECV : P2P_DIR_SENT;
items = tvb_length_remaining(tvb, offset) / 2;
while (tvb_length_remaining(tvb, offset) > 0) {
seid = tvb_get_guint8(tvb, offset);
@@ -562,18 +576,26 @@ dissect_sep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
proto_tree_add_item(sep_tree, hf_btavdtp_sep_type , tvb, offset, 1, ENC_NA);
proto_tree_add_item(sep_tree, hf_btavdtp_sep_rfa1 , tvb, offset, 1, ENC_NA);
- /* save information for later recognizing */
- t_seid = seid;
- t_frame_number = pinfo->fd->num;
-
- key[0].length = 1;
- key[0].key = &t_seid;
- key[1].length = 1;
- key[1].key = &t_frame_number;
- key[2].length = 0;
- key[2].key = NULL;
-
if (!pinfo->fd->flags.visited) {
+ sep_entry_t *sep_data;
+ wmem_tree_key_t key[7];
+ guint32 frame_number = pinfo->fd->num;
+
+ 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 = 1;
+ key[5].key = &frame_number;
+ key[6].length = 0;
+ key[6].key = NULL;
+
sep_data = wmem_new(wmem_file_scope(), sep_entry_t);
sep_data->seid = seid;
sep_data->type = type;
@@ -947,11 +969,14 @@ dissect_capabilities(tvbuff_t *tvb, packet_info *pinfo,
static gint
dissect_seid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
- gint seid_side, gint i_item, guint32 *sep_seid)
+ gint seid_side, gint i_item, guint32 *sep_seid,
+ guint32 interface_id, guint32 adapter_id, guint32 chandle,
+ guint32 frame_number)
{
- guint32 seid;
+ guint32 seid;
proto_tree *seid_tree = NULL;
proto_item *seid_item = NULL;
+ guint32 direction;
seid = tvb_get_guint8(tvb, offset) >> 2;
if (sep_seid) {
@@ -959,23 +984,31 @@ dissect_seid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
}
if (seid_side == SEID_ACP) {
+ direction = pinfo->p2p_dir;
seid_item = proto_tree_add_none_format(tree, hf_btavdtp_acp_seid_item, tvb, offset, 1,
- "ACP SEID [%u - %s %s]", seid, get_sep_media_type(pinfo->fd->num, seid), get_sep_type(pinfo->fd->num, seid));
+ "ACP SEID [%u - %s %s]", seid,
+ get_sep_media_type(interface_id, adapter_id, chandle, direction, seid, frame_number),
+ get_sep_type(interface_id, adapter_id, chandle, direction, seid, frame_number));
seid_tree = proto_item_add_subtree(seid_item, ett_btavdtp_sep);
proto_tree_add_item(seid_tree, hf_btavdtp_acp_seid, tvb, offset, 1, ENC_NA);
if (i_item > 0) proto_item_append_text(seid_item, " item %u", i_item);
col_append_fstr(pinfo->cinfo, COL_INFO, " - ACP SEID [%u - %s %s]",
- seid, get_sep_media_type(pinfo->fd->num, seid), get_sep_type(pinfo->fd->num, seid));
+ seid, get_sep_media_type(interface_id, adapter_id, chandle, direction, seid, frame_number),
+ get_sep_type(interface_id, adapter_id, chandle, direction, seid, frame_number));
} else {
+ direction = (pinfo->p2p_dir == P2P_DIR_SENT) ? P2P_DIR_RECV : P2P_DIR_SENT;
seid_item = proto_tree_add_none_format(tree, hf_btavdtp_int_seid_item, tvb, offset, 1,
- "INT SEID [%u - %s %s]", seid, get_sep_media_type(pinfo->fd->num, seid), get_sep_type(pinfo->fd->num, seid));
+ "INT SEID [%u - %s %s]", seid,
+ get_sep_media_type(interface_id, adapter_id, chandle, direction, seid, frame_number),
+ get_sep_type(interface_id, adapter_id, chandle, direction, seid, frame_number));
seid_tree = proto_item_add_subtree(seid_item, ett_btavdtp_sep);
proto_tree_add_item(seid_tree, hf_btavdtp_int_seid, tvb, offset, 1, ENC_NA);
if (i_item > 0) proto_item_append_text(seid_item, " item %u", i_item);
col_append_fstr(pinfo->cinfo, COL_INFO, " - INT SEID [%u - %s %s]",
- seid, get_sep_media_type(pinfo->fd->num, seid), get_sep_type(pinfo->fd->num, seid));
+ seid, get_sep_media_type(interface_id, adapter_id, chandle, direction, seid, frame_number),
+ get_sep_type(interface_id, adapter_id, chandle, direction, seid, frame_number));
}
proto_tree_add_item(seid_tree, hf_btavdtp_rfa_seid, tvb, offset, 1, ENC_NA);
@@ -999,21 +1032,26 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
gint message_type = 0;
gint signal_id = 0;
guint delay;
- wmem_tree_key_t key[4];
- guint32 t_type;
- guint32 t_cid;
- guint32 t_frame_number;
+ wmem_tree_t *subtree;
+ wmem_tree_key_t key[8];
+ guint32 interface_id;
+ guint32 adapter_id;
+ guint32 chandle;
+ guint32 direction;
+ guint32 type;
+ guint32 cid;
+ guint32 frame_number;
cid_type_data_t *cid_type_data;
sep_entry_t *sep;
tvbuff_t *next_tvb;
guint32 seid;
- guint32 t_seid;
gint codec = -1;
gint content_protection_type = 0;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "AVDTP");
- switch (pinfo->p2p_dir) {
+ direction = pinfo->p2p_dir;
+ switch (direction) {
case P2P_DIR_SENT:
col_set_str(pinfo->cinfo, COL_INFO, "Sent ");
break;
@@ -1023,7 +1061,7 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
default:
col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown direction %d ",
- pinfo->p2p_dir);
+ direction);
goto LABEL_data;
break;
}
@@ -1034,6 +1072,9 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
if (!force_avdtp && !pinfo->fd->flags.visited && (l2cap_data->first_scid_frame == pinfo->fd->num ||
l2cap_data->first_dcid_frame == pinfo->fd->num)) {
cid_type_data = wmem_new(wmem_file_scope(), cid_type_data_t);
+ cid_type_data->interface_id = l2cap_data->interface_id;
+ cid_type_data->adapter_id = l2cap_data->adapter_id;
+ cid_type_data->chandle = l2cap_data->chandle;
cid_type_data->type = STREAM_TYPE_MEDIA;
cid_type_data->cid = l2cap_data->cid;
cid_type_data->sep = NULL;
@@ -1051,47 +1092,81 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
/* It is AVDTP Signaling rsp side */
cid_type_data->type = STREAM_TYPE_SIGNAL;
} else {
- sep = (sep_entry_t *)wmem_tree_lookup32_le(sep_open, pinfo->fd->num);
-
+ interface_id = cid_type_data->interface_id;
+ adapter_id = cid_type_data->adapter_id;
+ chandle = cid_type_data->chandle;
+ frame_number = pinfo->fd->num;
+
+ 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 = 0;
+ key[3].key = NULL;
+
+ subtree = (wmem_tree_t *) wmem_tree_lookup32_array(sep_open, key);
+ sep = (subtree) ? (sep_entry_t *) wmem_tree_lookup32_le(subtree, frame_number) : NULL;
if (sep && sep->state == SEP_STATE_OPEN) {
sep->state = SEP_STATE_IN_USE;
cid_type_data->sep = sep;
}
}
- t_type = cid_type_data->type;
- t_cid = cid_type_data->cid;
- t_frame_number = pinfo->fd->num;
+ interface_id = cid_type_data->interface_id;
+ adapter_id = cid_type_data->adapter_id;
+ chandle = cid_type_data->chandle;
+ type = cid_type_data->type;
+ cid = cid_type_data->cid;
+ frame_number = pinfo->fd->num;
key[0].length = 1;
- key[0].key = &t_cid;
+ key[0].key = &interface_id;
key[1].length = 1;
- key[1].key = &t_type;
+ key[1].key = &adapter_id;
key[2].length = 1;
- key[2].key = &t_frame_number;
- key[3].length = 0;
- key[3].key = NULL;
+ key[2].key = &chandle;
+ key[3].length = 1;
+ key[3].key = &cid;
+ key[4].length = 1;
+ key[4].key = &type;
+ key[5].length = 1;
+ key[5].key = &frame_number;
+ key[6].length = 0;
+ key[6].key = NULL;
wmem_tree_insert32_array(cid_to_type_table, key, cid_type_data);
}
+ interface_id = l2cap_data->interface_id;
+ adapter_id = l2cap_data->adapter_id;
+ chandle = l2cap_data->chandle;
+ cid = l2cap_data->cid;
+ frame_number = pinfo->fd->num;
if (!force_avdtp) {
- t_type = STREAM_TYPE_SIGNAL;
- t_cid = l2cap_data->cid;
- t_frame_number = pinfo->fd->num;
-
key[0].length = 1;
- key[0].key = &t_cid;
+ key[0].key = &interface_id;
key[1].length = 1;
- key[1].key = &t_type;
+ key[1].key = &adapter_id;
key[2].length = 1;
- key[2].key = &t_frame_number;
- key[3].length = 0;
- key[3].key = NULL;
-
- cid_type_data = (cid_type_data_t *)wmem_tree_lookup32_array_le(cid_to_type_table, key);
- if (cid_type_data && cid_type_data->type == STREAM_TYPE_MEDIA && cid_type_data->cid == l2cap_data->cid) {
+ key[2].key = &chandle;
+ key[3].length = 1;
+ key[3].key = &cid;
+ key[4].length = 0;
+ key[4].key = NULL;
+ subtree = (wmem_tree_t *) wmem_tree_lookup32_array(cid_to_type_table, key);
+ if (subtree) {
+ wmem_tree_t *type_tree;
+
+ type_tree = (wmem_tree_t *) wmem_tree_lookup32(subtree, STREAM_TYPE_MEDIA);
+ if (!type_tree)
+ type_tree = (wmem_tree_t *) wmem_tree_lookup32(subtree, STREAM_TYPE_SIGNAL);
+ subtree = type_tree;
+ }
+ cid_type_data = (subtree) ? (cid_type_data_t *) wmem_tree_lookup32_le(subtree, frame_number) : NULL;
+ if (cid_type_data && cid_type_data->type == STREAM_TYPE_MEDIA) {
/* AVDTP Media */
if (!cid_type_data->sep) {
@@ -1102,8 +1177,19 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
proto_tree_add_item(btavdtp_tree, hf_btavdtp_data, tvb, offset, -1, ENC_NA);
} else {
col_append_fstr(pinfo->cinfo, COL_INFO, "Media stream ACP SEID [%u - %s %s]",
- cid_type_data->sep->seid, get_sep_media_type(pinfo->fd->num, cid_type_data->sep->seid),
- get_sep_type(pinfo->fd->num, cid_type_data->sep->seid));
+ cid_type_data->sep->seid, get_sep_media_type(
+ cid_type_data->interface_id,
+ cid_type_data->adapter_id,
+ cid_type_data->chandle,
+ direction,
+ cid_type_data->sep->seid,
+ pinfo->fd->num),
+ get_sep_type(cid_type_data->interface_id,
+ cid_type_data->adapter_id,
+ cid_type_data->chandle,
+ direction,
+ cid_type_data->sep->seid,
+ pinfo->fd->num));
if (cid_type_data->sep->media_type == MEDIA_TYPE_AUDIO) {
sep_data_t sep_data;
@@ -1131,7 +1217,7 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
}
return tvb_length(tvb);
- } else if (!(cid_type_data && cid_type_data->type == STREAM_TYPE_SIGNAL && cid_type_data->cid == l2cap_data->cid)) {
+ } else if (!(cid_type_data && cid_type_data->type == STREAM_TYPE_SIGNAL)) {
/* AVDTP not signaling - Unknown Media stream */
ti = proto_tree_add_item(tree, proto_btavdtp, tvb, offset, -1, ENC_NA);
btavdtp_tree = proto_item_add_subtree(ti, ett_btavdtp);
@@ -1186,12 +1272,15 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
offset += 1;
break;
}
- offset = dissect_sep(tvb, pinfo, btavdtp_tree, offset);
+ offset = dissect_sep(tvb, pinfo, btavdtp_tree, offset,
+ interface_id, adapter_id, chandle);
break;
case SIGNAL_ID_GET_CAPABILITIES:
case SIGNAL_ID_GET_ALL_CAPABILITIES:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL, interface_id,
+ adapter_id, chandle, frame_number);
break;
}
if (message_type == MESSAGE_TYPE_REJECT) {
@@ -1203,22 +1292,30 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
case SIGNAL_ID_SET_CONFIGURATION:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, &seid);
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_INT, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, &seid, interface_id,
+ adapter_id, chandle, frame_number);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_INT, 0, NULL, interface_id,
+ adapter_id, chandle, frame_number);
offset = dissect_capabilities(tvb, pinfo, btavdtp_tree, offset, &codec, &content_protection_type);
- t_frame_number = pinfo->fd->num;
- t_seid = seid;
-
key[0].length = 1;
- key[0].key = &t_seid;
+ key[0].key = &interface_id;
key[1].length = 1;
- key[1].key = &t_frame_number;
- key[2].length = 0;
- key[2].key = NULL;
-
- sep = (sep_entry_t *)wmem_tree_lookup32_array_le(sep_list, key);
- if (sep && sep->seid == seid) {
+ 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->content_protection_type = content_protection_type;
}
@@ -1236,7 +1333,9 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
case SIGNAL_ID_GET_CONFIGURATION:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL, interface_id,
+ adapter_id, chandle, frame_number);
break;
}
if (message_type == MESSAGE_TYPE_REJECT) {
@@ -1248,21 +1347,27 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
case SIGNAL_ID_RECONFIGURE:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, &seid);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, &seid, interface_id,
+ adapter_id, chandle, frame_number);
offset = dissect_capabilities(tvb, pinfo, btavdtp_tree, offset, &codec, &content_protection_type);
- t_frame_number = pinfo->fd->num;
- t_seid = seid;
-
key[0].length = 1;
- key[0].key = &t_seid;
+ key[0].key = &interface_id;
key[1].length = 1;
- key[1].key = &t_frame_number;
- key[2].length = 0;
- key[2].key = NULL;
-
- sep = (sep_entry_t *)wmem_tree_lookup32_array_le(sep_list, key);
- if (sep && sep->seid == seid) {
+ 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->content_protection_type = content_protection_type;
}
@@ -1280,24 +1385,37 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
case SIGNAL_ID_OPEN:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, &seid);
-
- t_frame_number = pinfo->fd->num;
- t_seid = seid;
-
- key[0].length = 1;
- key[0].key = &t_seid;
- key[1].length = 1;
- key[1].key = &t_frame_number;
- key[2].length = 0;
- key[2].key = NULL;
-
- sep = (sep_entry_t *)wmem_tree_lookup32_array_le(sep_list, key);
- if (sep && sep->seid == seid) {
- sep->state = SEP_STATE_OPEN;
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, &seid, interface_id,
+ adapter_id, chandle, frame_number);
+
+ 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->state = SEP_STATE_OPEN;
+
+ key[3].length = 1;
+ key[3].key = &frame_number;
+ key[4].length = 0;
+ key[4].key = NULL;
+
+ wmem_tree_insert32_array(sep_open, key, sep);
+ }
}
-
- wmem_tree_insert32(sep_open, pinfo->fd->num, sep);
break;
}
if (message_type == MESSAGE_TYPE_REJECT) {
@@ -1310,13 +1428,17 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
if (message_type == MESSAGE_TYPE_COMMAND) {
i_sep = 1;
while (tvb_length_remaining(tvb, offset) > 0) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, i_sep, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, i_sep, NULL,
+ interface_id, adapter_id, chandle, frame_number);
i_sep += 1;
}
break;
}
if (message_type == MESSAGE_TYPE_REJECT) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL,
+ interface_id, adapter_id, chandle, frame_number);
proto_tree_add_item(btavdtp_tree, hf_btavdtp_error_code, tvb, offset, 1, ENC_NA);
offset += 1;
break;
@@ -1324,7 +1446,9 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
case SIGNAL_ID_CLOSE:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL, interface_id,
+ adapter_id, chandle, frame_number);
break;
}
if (message_type == MESSAGE_TYPE_REJECT) {
@@ -1337,13 +1461,17 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
if (message_type == MESSAGE_TYPE_COMMAND) {
i_sep = 1;
while (tvb_length_remaining(tvb, offset) > 0) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, i_sep, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, i_sep, NULL,
+ interface_id, adapter_id, chandle, frame_number);
i_sep += 1;
}
break;
}
if (message_type == MESSAGE_TYPE_REJECT) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL, interface_id,
+ adapter_id, chandle, frame_number);
proto_tree_add_item(btavdtp_tree, hf_btavdtp_error_code, tvb, offset, 1, ENC_NA);
offset += 1;
break;
@@ -1351,7 +1479,9 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
case SIGNAL_ID_ABORT:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL, interface_id,
+ adapter_id, chandle, frame_number);
break;
}
if (message_type == MESSAGE_TYPE_REJECT) {
@@ -1362,7 +1492,9 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
break;
case SIGNAL_ID_SECURITY_CONTROL:
if (message_type == MESSAGE_TYPE_COMMAND) {
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL, interface_id,
+ adapter_id, chandle, frame_number);
proto_tree_add_item(btavdtp_tree, hf_btavdtp_data, tvb, offset, -1, ENC_NA);
offset += tvb_length_remaining(tvb, offset);
break;
@@ -1381,7 +1513,9 @@ dissect_btavdtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
proto_item *pitem;
delay = tvb_get_ntohs(tvb, offset + 1);
col_append_fstr(pinfo->cinfo, COL_INFO, "(%u.%u ms)", delay/10, delay%10);
- offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset, SEID_ACP, 0, NULL);
+ offset = dissect_seid(tvb, pinfo, btavdtp_tree, offset,
+ SEID_ACP, 0, NULL,
+ interface_id, adapter_id, chandle, frame_number);
pitem = proto_tree_add_item(btavdtp_tree, hf_btavdtp_delay, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_item_append_text(pitem, " (1/10 ms)");
offset += 2;