aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-btavrcp.c
diff options
context:
space:
mode:
authorMichal Labedzki <michal.labedzki@tieto.com>2014-11-12 11:57:12 +0100
committerMichal Labedzki <michal.labedzki@tieto.com>2014-11-14 10:28:22 +0000
commitf1dee59d6661dc9538819209607e7884c45049b9 (patch)
treeee6911c2f2d620fbb6d69cb0433ac5880fd26262 /epan/dissectors/packet-btavrcp.c
parentad1977bc197b9695d05f11f4975d0aa27d10c90b (diff)
Bluetooth: A2DP: Add AVRCP song position indicator
"sbc.avrcp_song_position" can be used to determine time synchronization between AVRCP and A2DP. It is updated on every AVRCP PlaybackPositionChanged. Also provide version for aptx. Change-Id: I48cd49f0fee54131a738290e2a70a24d33ba1d22 Reviewed-on: https://code.wireshark.org/review/5290 Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
Diffstat (limited to 'epan/dissectors/packet-btavrcp.c')
-rw-r--r--epan/dissectors/packet-btavrcp.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/epan/dissectors/packet-btavrcp.c b/epan/dissectors/packet-btavrcp.c
index 195d7b665a..eb0c6edd40 100644
--- a/epan/dissectors/packet-btavrcp.c
+++ b/epan/dissectors/packet-btavrcp.c
@@ -34,6 +34,7 @@
#include "packet-btl2cap.h"
#include "packet-btsdp.h"
#include "packet-btavctp.h"
+#include "packet-btavrcp.h"
static int proto_btavrcp = -1;
@@ -272,8 +273,9 @@ static dissector_handle_t btavrcp_handle;
#define STATUS_OK 0x04
-static wmem_tree_t *reassembling = NULL;
-static wmem_tree_t *timing = NULL;
+static wmem_tree_t *reassembling = NULL;
+static wmem_tree_t *timing = NULL;
+ wmem_tree_t *btavrcp_song_positions = NULL;
typedef struct _fragment {
guint start_frame_number;
@@ -307,7 +309,7 @@ typedef struct _timing_info {
guint32 opcode;
guint32 op;
guint32 op_arg;
- } timing_info_t;
+} timing_info_t;
static const value_string packet_type_vals[] = {
{ PACKET_TYPE_SINGLE, "Single" },
@@ -1592,6 +1594,27 @@ dissect_vendor_dependant(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
if (song_position == 0xFFFFFFFF) {
proto_item_append_text(pitem, " (NOT SELECTED)");
col_append_str(pinfo->cinfo, COL_INFO, " (NOT SELECTED)");
+ } else if (!pinfo->fd->flags.visited) {
+ btavrcp_song_position_data_t *song_position_data;
+
+ k_interface_id = interface_id;
+ k_adapter_id = adapter_id;
+ k_frame_number = pinfo->fd->num;
+
+ key[0].length = 1;
+ key[0].key = &k_interface_id;
+ key[1].length = 1;
+ key[1].key = &k_adapter_id;
+ key[2].length = 1;
+ key[2].key = &k_frame_number;
+ key[3].length = 0;
+ key[3].key = NULL;
+
+ song_position_data = wmem_new(wmem_file_scope(), btavrcp_song_position_data_t);
+ song_position_data->song_position = song_position;
+ song_position_data->used_in_frame = 0;
+
+ wmem_tree_insert32_array(btavrcp_song_positions, key, song_position_data);
}
break;
case EVENT_BATTERY_STATUS_CHANGED:
@@ -3162,8 +3185,9 @@ proto_register_btavrcp(void)
{ &ei_btavrcp_no_response, { "btavrcp.no_response", PI_PROTOCOL, PI_WARN, "No response", EXPFILL }},
};
- reassembling = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
- timing = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
+ reassembling = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
+ timing = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
+ btavrcp_song_positions = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
proto_btavrcp = proto_register_protocol("Bluetooth AVRCP Profile", "BT AVRCP", "btavrcp");
btavrcp_handle = new_register_dissector("btavrcp", dissect_btavrcp, proto_btavrcp);