* [RFC hcidump 2/8] AVRCP: Fix parsing SetBrowsedPlayer as AV/C pdu
2012-08-15 13:32 [RFC hcidump 1/8] AVRCP: Add initial support for browsing channel Luiz Augusto von Dentz
@ 2012-08-15 13:32 ` Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 3/8] AVRCP: Add parsing for GetFolderItems PDU Luiz Augusto von Dentz
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2012-08-15 13:32 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
As per AVRCP specification 1.4 page 32 the command type of
SetBrowsedPlayer is Browsing, so move it to browsing channel.
In addition to that pass the avctp header to avrcp_dump as it is
required to identify if the frame is a command or response.
---
parser/avctp.c | 2 +-
parser/avrcp.c | 18 +++++++++---------
parser/parser.h | 2 +-
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/parser/avctp.c b/parser/avctp.c
index 5d913cf..aca1b75 100644
--- a/parser/avctp.c
+++ b/parser/avctp.c
@@ -65,7 +65,7 @@ void avctp_dump(int level, struct frame *frm, uint16_t psm)
pt2str(hdr), hdr & 0x0c, hdr >> 4, pid);
if (pid == SDP_UUID_AV_REMOTE || pid == SDP_UUID_AV_REMOTE_TARGET)
- avrcp_dump(level + 1, frm, psm);
+ avrcp_dump(level + 1, frm, hdr, psm);
else
raw_dump(level + 1, frm);
}
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 46efec9..5179501 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -1264,8 +1264,8 @@ response:
printf("Status: 0x%02x (%s)\n", status, error2str(status));
}
-static void avrcp_set_browsed_player(int level, struct frame *frm,
- uint8_t ctype, uint16_t len)
+static void avrcp_set_browsed_player_dump(int level, struct frame *frm,
+ uint8_t hdr, uint16_t len)
{
uint32_t items;
uint16_t id, uids, charset;
@@ -1273,7 +1273,7 @@ static void avrcp_set_browsed_player(int level, struct frame *frm,
p_indent(level, frm);
- if (ctype > AVC_CTYPE_GENERAL_INQUIRY)
+ if (hdr & 0x02)
goto response;
if (len < 2) {
@@ -1406,9 +1406,6 @@ static void avrcp_pdu_dump(int level, struct frame *frm, uint8_t ctype)
case AVRCP_SET_ADDRESSED_PLAYER:
avrcp_set_addressed_player(level + 1, frm, ctype, len);
break;
- case AVRCP_SET_BROWSED_PLAYER:
- avrcp_set_browsed_player(level + 1, frm, ctype, len);
- break;
default:
raw_dump(level, frm);
}
@@ -1502,7 +1499,7 @@ static const char *subunit2str(uint8_t subunit)
}
}
-static void avrcp_browsing_dump(int level, struct frame *frm)
+static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
{
uint8_t pduid;
uint16_t len;
@@ -1520,6 +1517,9 @@ static void avrcp_browsing_dump(int level, struct frame *frm)
}
switch (pduid) {
+ case AVRCP_SET_BROWSED_PLAYER:
+ avrcp_set_browsed_player_dump(level + 1, frm, hdr, len);
+ break;
default:
raw_dump(level, frm);
}
@@ -1579,7 +1579,7 @@ static void avrcp_control_dump(int level, struct frame *frm)
}
}
-void avrcp_dump(int level, struct frame *frm, uint16_t psm)
+void avrcp_dump(int level, struct frame *frm, uint8_t hdr, uint16_t psm)
{
p_indent(level, frm);
@@ -1588,7 +1588,7 @@ void avrcp_dump(int level, struct frame *frm, uint16_t psm)
avrcp_control_dump(level, frm);
break;
case 0x1B:
- avrcp_browsing_dump(level, frm);
+ avrcp_browsing_dump(level, frm, hdr);
break;
default:
raw_dump(level, frm);
diff --git a/parser/parser.h b/parser/parser.h
index c712d42..f8f7009 100644
--- a/parser/parser.h
+++ b/parser/parser.h
@@ -234,7 +234,7 @@ void hidp_dump(int level, struct frame *frm);
void hcrp_dump(int level, struct frame *frm);
void avdtp_dump(int level, struct frame *frm);
void avctp_dump(int level, struct frame *frm, uint16_t psm);
-void avrcp_dump(int level, struct frame *frm, uint16_t psm);
+void avrcp_dump(int level, struct frame *frm, uint8_t hdr, uint16_t psm);
void att_dump(int level, struct frame *frm);
void smp_dump(int level, struct frame *frm);
void sap_dump(int level, struct frame *frm);
--
1.7.11.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC hcidump 3/8] AVRCP: Add parsing for GetFolderItems PDU
2012-08-15 13:32 [RFC hcidump 1/8] AVRCP: Add initial support for browsing channel Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 2/8] AVRCP: Fix parsing SetBrowsedPlayer as AV/C pdu Luiz Augusto von Dentz
@ 2012-08-15 13:32 ` Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 4/8] AVRCP: Add parsing for ChangePath PDU Luiz Augusto von Dentz
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2012-08-15 13:32 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
parser/avrcp.c | 389 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 389 insertions(+)
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 5179501..9ceb507 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -31,6 +31,7 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
+#include <inttypes.h>
#include "parser/parser.h"
@@ -179,6 +180,12 @@
#define AVRCP_PLAY_STATUS_REV_SEEK 0x04
#define AVRCP_PLAY_STATUS_ERROR 0xFF
+/* media scope */
+#define AVRCP_MEDIA_PLAYER_LIST 0x00
+#define AVRCP_MEDIA_PLAYER_VFS 0x01
+#define AVRCP_MEDIA_SEARCH 0x02
+#define AVRCP_MEDIA_NOW_PLAYING 0x03
+
static struct avrcp_continuing {
uint16_t num;
uint16_t size;
@@ -1207,6 +1214,7 @@ response:
uid = get_u16(frm);
printf("PlayerID: 0x%04x (%u)\n", uid, uid);
+
p_indent(level, frm);
uid = get_u16(frm);
@@ -1499,6 +1507,384 @@ static const char *subunit2str(uint8_t subunit)
}
}
+static const char *scope2str(uint8_t scope)
+{
+ switch (scope) {
+ case AVRCP_MEDIA_PLAYER_LIST:
+ return "Media Player List";
+ case AVRCP_MEDIA_PLAYER_VFS:
+ return "Media Player Virtual Filesystem";
+ case AVRCP_MEDIA_SEARCH:
+ return "Search";
+ case AVRCP_MEDIA_NOW_PLAYING:
+ return "Now Playing";
+ default:
+ return "Unknown";
+ }
+}
+
+static const char *playertype2str(uint8_t type)
+{
+ switch (type & 0x0F) {
+ case 0x01:
+ return "Audio";
+ case 0x02:
+ return "Video";
+ case 0x03:
+ return "Audio, Video";
+ case 0x04:
+ return "Audio Broadcasting";
+ case 0x05:
+ return "Audio, Audio Broadcasting";
+ case 0x06:
+ return "Video, Audio Broadcasting";
+ case 0x07:
+ return "Audio, Video, Audio Broadcasting";
+ case 0x08:
+ return "Video Broadcasting";
+ case 0x09:
+ return "Audio, Video Broadcasting";
+ case 0x0A:
+ return "Video, Video Broadcasting";
+ case 0x0B:
+ return "Audio, Video, Video Broadcasting";
+ case 0x0C:
+ return "Audio Broadcasting, Video Broadcasting";
+ case 0x0D:
+ return "Audio, Audio Broadcasting, Video Broadcasting";
+ case 0x0E:
+ return "Video, Audio Broadcasting, Video Broadcasting";
+ case 0x0F:
+ return "Audio, Video, Audio Broadcasting, Video Broadcasting";
+ }
+
+ return "None";
+}
+
+static const char *playersubtype2str(uint32_t subtype)
+{
+ switch (subtype & 0x03) {
+ case 0x01:
+ return "Audio Book";
+ case 0x02:
+ return "Podcast";
+ case 0x03:
+ return "Audio Book, Podcast";
+ }
+
+ return "None";
+}
+
+static void avrcp_media_player_item_dump(int level, struct frame *frm,
+ uint16_t len)
+{
+ uint16_t id, charset;
+ uint8_t type, status, namelen;
+ uint32_t subtype;
+ uint64_t features[2];
+
+ p_indent(level, frm);
+
+ if (len < 28) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ id = get_u16(frm);
+ printf("PlayerID: 0x%04x (%u)\n", id, id);
+
+ p_indent(level, frm);
+
+ type = get_u8(frm);
+ printf("PlayerType: 0x%04x (%s)\n", type, playertype2str(type));
+
+ p_indent(level, frm);
+
+ subtype = get_u32(frm);
+ printf("PlayerSubtype: 0x%08x (%s)\n", subtype,
+ playersubtype2str(subtype));
+
+ p_indent(level, frm);
+
+ status = get_u8(frm);
+ printf("PlayStatus: 0x%02x (%s)\n", status, playstatus2str(status));
+
+ p_indent(level, frm);
+
+ get_u128(frm, &features[0], &features[1]);
+ printf("Features: 0x%16" PRIx64 "%16" PRIx64 "\n", features[1],
+ features[0]);
+
+ p_indent(level, frm);
+
+ charset = get_u16(frm);
+ printf("CharsetID: 0x%04x (%s)\n", charset, charset2str(charset));
+
+ p_indent(level, frm);
+
+ namelen = get_u8(frm);
+ printf("NameLength: 0x%02x (%u)\n", namelen, namelen);
+
+ p_indent(level, frm);
+
+ printf("Name: ");
+ for (; namelen > 0; namelen--) {
+ uint8_t c = get_u8(frm);
+ printf("%1c", isprint(c) ? c : '.');
+ }
+ printf("\n");
+}
+
+static const char *foldertype2str(uint8_t type)
+{
+ switch (type) {
+ case 0x00:
+ return "Mixed";
+ case 0x01:
+ return "Titles";
+ case 0x02:
+ return "Albuns";
+ case 0x03:
+ return "Artists";
+ case 0x04:
+ return "Genres";
+ case 0x05:
+ return "Playlists";
+ case 0x06:
+ return "Years";
+ }
+
+ return "Reserved";
+}
+
+static void avrcp_folder_item_dump(int level, struct frame *frm, uint16_t len)
+{
+ uint8_t type, playable, namelen;
+ uint16_t charset;
+ uint64_t uid;
+
+ p_indent(level, frm);
+
+ if (len < 14) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ uid = get_u64(frm);
+ printf("FolderUID: 0x%16" PRIx64 " (%" PRIu64 ")\n", uid, uid);
+
+ p_indent(level, frm);
+
+ type = get_u8(frm);
+ printf("FolderType: 0x%02x (%s)\n", type, foldertype2str(type));
+
+ p_indent(level, frm);
+
+ playable = get_u8(frm);
+ printf("IsPlayable: 0x%02x (%s)\n", playable,
+ playable & 0x01 ? "True" : "False");
+
+ p_indent(level, frm);
+
+ charset = get_u16(frm);
+ printf("CharsetID: 0x%04x (%s)\n", charset, charset2str(charset));
+
+ p_indent(level, frm);
+
+ namelen = get_u8(frm);
+ printf("NameLength: 0x%02x (%u)\n", namelen, namelen);
+
+ p_indent(level, frm);
+
+ printf("Name: ");
+ for (; namelen > 0; namelen--) {
+ uint8_t c = get_u8(frm);
+ printf("%1c", isprint(c) ? c : '.');
+ }
+ printf("\n");
+}
+
+static const char *elementtype2str(uint8_t type)
+{
+ switch (type) {
+ case 0x00:
+ return "Audio";
+ case 0x01:
+ return "Video";
+ }
+
+ return "Reserved";
+}
+
+static void avrcp_media_element_item_dump(int level, struct frame *frm,
+ uint16_t len)
+{
+ uint64_t uid;
+ uint16_t charset;
+ uint8_t type, namelen, count;
+
+ if (len < 14) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ uid = get_u64(frm);
+ printf("ElementUID: 0x%16" PRIx64 " (%" PRIu64 ")\n", uid, uid);
+
+ p_indent(level, frm);
+
+ type = get_u8(frm);
+ printf("ElementType: 0x%02x (%s)\n", type, elementtype2str(type));
+
+ p_indent(level, frm);
+
+ charset = get_u16(frm);
+ printf("CharsetID: 0x%04x (%s)\n", charset, charset2str(charset));
+
+ p_indent(level, frm);
+
+ namelen = get_u8(frm);
+ printf("NameLength: 0x%02x (%u)\n", namelen, namelen);
+
+ p_indent(level, frm);
+
+ printf("Name: ");
+ for (; namelen > 0; namelen--) {
+ uint8_t c = get_u8(frm);
+ printf("%1c", isprint(c) ? c : '.');
+ }
+ printf("\n");
+
+ p_indent(level, frm);
+
+ count = get_u8(frm);
+ printf("AttributeCount: 0x%02x (%u)\n", count, count);
+
+ for (; count > 0; count--) {
+ uint32_t attr;
+
+ p_indent(level, frm);
+
+ attr = get_u32(frm);
+ printf("AttributeID: 0x%08x (%s)\n", attr, mediattr2str(attr));
+
+ p_indent(level, frm);
+
+ charset = get_u16(frm);
+ printf("CharsetID: 0x%04x (%s)\n", charset,
+ charset2str(charset));
+
+ p_indent(level, frm);
+
+ namelen = get_u8(frm);
+ printf("AttributeLength: 0x%02x (%u)\n", namelen, namelen);
+
+ p_indent(level, frm);
+
+ printf("AttributeValue: ");
+ for (; namelen > 0; namelen--) {
+ uint8_t c = get_u8(frm);
+ printf("%1c", isprint(c) ? c : '.');
+ }
+ printf("\n");
+ }
+}
+
+static void avrcp_get_folder_items_dump(int level, struct frame *frm,
+ uint8_t hdr, uint16_t len)
+{
+ uint8_t scope, count, status;
+ uint32_t start, end;
+ uint16_t uid, num;
+
+ p_indent(level, frm);
+
+ if (hdr & 0x02)
+ goto response;
+
+ if (len < 10) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ scope = get_u8(frm);
+ printf("Scope: 0x%02x (%s)\n", scope, scope2str(scope));
+
+ p_indent(level, frm);
+
+ start = get_u32(frm);
+ printf("StartItem: 0x%08x (%u)\n", start, start);
+
+ p_indent(level, frm);
+
+ end = get_u32(frm);
+ printf("EndItem: 0x%08x (%u)\n", end, end);
+
+ p_indent(level, frm);
+
+ count = get_u8(frm);
+ printf("AttributeCount: 0x%02x (%u)\n", count, count);
+
+ for (; count > 0; count--) {
+ uint32_t attr;
+
+ p_indent(level, frm);
+
+ attr = get_u32(frm);
+ printf("AttributeID: 0x%08x (%s)\n", attr, mediattr2str(attr));
+ }
+
+ return;
+
+response:
+ status = get_u8(frm);
+ printf("Status: 0x%02x (%s)\n", status, error2str(status));
+
+ if (len == 1)
+ return;
+
+ p_indent(level, frm);
+
+ uid = get_u16(frm);
+ printf("UIDCounter: 0x%04x (%u)\n", uid, uid);
+
+ p_indent(level, frm);
+
+ num = get_u16(frm);
+ printf("Number of Items: 0x%04x (%u)\n", num, num);
+
+ for (; num > 0; num--) {
+ uint8_t type;
+ uint16_t len;
+
+ p_indent(level, frm);
+
+ type = get_u8(frm);
+ len = get_u16(frm);
+ switch (type) {
+ case 0x01:
+ printf("Item: 0x01 (Media Player)) ");
+ printf("Length: 0x%04x (%u)\n", len, len);
+ avrcp_media_player_item_dump(level, frm, len);
+ break;
+ case 0x02:
+ printf("Item: 0x02 (Folder) ");
+ printf("Length: 0x%04x (%u)\n", len, len);
+ avrcp_folder_item_dump(level, frm, len);
+ break;
+ case 0x03:
+ printf("Item: 0x03 (Media Element) ");
+ printf("Length: 0x%04x (%u)\n", len, len);
+ avrcp_media_element_item_dump(level, frm, len);
+ break;
+ }
+ }
+}
+
static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
{
uint8_t pduid;
@@ -1520,6 +1906,9 @@ static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
case AVRCP_SET_BROWSED_PLAYER:
avrcp_set_browsed_player_dump(level + 1, frm, hdr, len);
break;
+ case AVRCP_GET_FOLDER_ITEMS:
+ avrcp_get_folder_items_dump(level + 1, frm, hdr, len);
+ break;
default:
raw_dump(level, frm);
}
--
1.7.11.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC hcidump 4/8] AVRCP: Add parsing for ChangePath PDU
2012-08-15 13:32 [RFC hcidump 1/8] AVRCP: Add initial support for browsing channel Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 2/8] AVRCP: Fix parsing SetBrowsedPlayer as AV/C pdu Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 3/8] AVRCP: Add parsing for GetFolderItems PDU Luiz Augusto von Dentz
@ 2012-08-15 13:32 ` Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 5/8] AVRCP: Add parsing for GetItemAttributes PDU Luiz Augusto von Dentz
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2012-08-15 13:32 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
parser/avrcp.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 9ceb507..7059cb8 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -1885,6 +1885,65 @@ response:
}
}
+static const char *dir2str(uint8_t dir)
+{
+ switch (dir) {
+ case 0x00:
+ return "Folder Up";
+ case 0x01:
+ return "Folder Down";
+ }
+
+ return "Reserved";
+}
+
+static void avrcp_change_path_dump(int level, struct frame *frm, uint8_t hdr,
+ uint16_t len)
+{
+ uint64_t uid;
+ uint32_t items;
+ uint16_t uidcounter;
+ uint8_t dir, status;
+
+ p_indent(level, frm);
+
+ if (hdr & 0x02)
+ goto response;
+
+ if (len < 11) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ uidcounter = get_u16(frm);
+ printf("UIDCounter: 0x%04x (%u)\n", uidcounter, uidcounter);
+
+ p_indent(level, frm);
+
+ dir = get_u8(frm);
+ printf("Direction: 0x%02x (%s)\n", dir, dir2str(dir));
+
+ p_indent(level, frm);
+
+ uid = get_u64(frm);
+ printf("FolderUID: 0x%16" PRIx64 " (%" PRIu64 ")\n", uid, uid);
+
+ return;
+
+response:
+ status = get_u8(frm);
+ printf("Status: 0x%02x (%s)\n", status, error2str(status));
+
+ if (len == 1)
+ return;
+
+ p_indent(level, frm);
+
+ items = get_u32(frm);
+ printf("Number of Items: 0x%04x (%u)", items, items);
+}
+
static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
{
uint8_t pduid;
@@ -1909,6 +1968,9 @@ static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
case AVRCP_GET_FOLDER_ITEMS:
avrcp_get_folder_items_dump(level + 1, frm, hdr, len);
break;
+ case AVRCP_CHANGE_PATH:
+ avrcp_change_path_dump(level + 1, frm, hdr, len);
+ break;
default:
raw_dump(level, frm);
}
--
1.7.11.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC hcidump 5/8] AVRCP: Add parsing for GetItemAttributes PDU
2012-08-15 13:32 [RFC hcidump 1/8] AVRCP: Add initial support for browsing channel Luiz Augusto von Dentz
` (2 preceding siblings ...)
2012-08-15 13:32 ` [RFC hcidump 4/8] AVRCP: Add parsing for ChangePath PDU Luiz Augusto von Dentz
@ 2012-08-15 13:32 ` Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 6/8] AVRCP: Add parsing for PlayItem PDU Luiz Augusto von Dentz
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2012-08-15 13:32 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
parser/avrcp.c | 129 ++++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 101 insertions(+), 28 deletions(-)
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 7059cb8..046368c 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -1718,6 +1718,41 @@ static const char *elementtype2str(uint8_t type)
return "Reserved";
}
+static void avrcp_attribute_entry_list_dump(int level, struct frame *frm,
+ uint8_t count)
+{
+ for (; count > 0; count--) {
+ uint32_t attr;
+ uint16_t charset;
+ uint8_t len;
+
+ p_indent(level, frm);
+
+ attr = get_u32(frm);
+ printf("AttributeID: 0x%08x (%s)\n", attr, mediattr2str(attr));
+
+ p_indent(level, frm);
+
+ charset = get_u16(frm);
+ printf("CharsetID: 0x%04x (%s)\n", charset,
+ charset2str(charset));
+
+ p_indent(level, frm);
+
+ len = get_u8(frm);
+ printf("AttributeLength: 0x%02x (%u)\n", len, len);
+
+ p_indent(level, frm);
+
+ printf("AttributeValue: ");
+ for (; len > 0; len--) {
+ uint8_t c = get_u8(frm);
+ printf("%1c", isprint(c) ? c : '.');
+ }
+ printf("\n");
+ }
+}
+
static void avrcp_media_element_item_dump(int level, struct frame *frm,
uint16_t len)
{
@@ -1763,34 +1798,7 @@ static void avrcp_media_element_item_dump(int level, struct frame *frm,
count = get_u8(frm);
printf("AttributeCount: 0x%02x (%u)\n", count, count);
- for (; count > 0; count--) {
- uint32_t attr;
-
- p_indent(level, frm);
-
- attr = get_u32(frm);
- printf("AttributeID: 0x%08x (%s)\n", attr, mediattr2str(attr));
-
- p_indent(level, frm);
-
- charset = get_u16(frm);
- printf("CharsetID: 0x%04x (%s)\n", charset,
- charset2str(charset));
-
- p_indent(level, frm);
-
- namelen = get_u8(frm);
- printf("AttributeLength: 0x%02x (%u)\n", namelen, namelen);
-
- p_indent(level, frm);
-
- printf("AttributeValue: ");
- for (; namelen > 0; namelen--) {
- uint8_t c = get_u8(frm);
- printf("%1c", isprint(c) ? c : '.');
- }
- printf("\n");
- }
+ avrcp_attribute_entry_list_dump(level, frm, count);
}
static void avrcp_get_folder_items_dump(int level, struct frame *frm,
@@ -1944,6 +1952,68 @@ response:
printf("Number of Items: 0x%04x (%u)", items, items);
}
+static void avrcp_get_item_attributes_dump(int level, struct frame *frm,
+ uint8_t hdr, uint16_t len)
+{
+ uint64_t uid;
+ uint32_t uidcounter;
+ uint8_t scope, count, status;
+
+ p_indent(level, frm);
+
+ if (hdr & 0x02)
+ goto response;
+
+ if (len < 12) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ scope = get_u8(frm);
+ printf("Scope: 0x%02x (%s)\n", scope, scope2str(scope));
+
+ p_indent(level, frm);
+
+ uid = get_u64(frm);
+ printf("UID: 0x%16" PRIx64 " (%" PRIu64 ")\n", uid, uid);
+
+ p_indent(level, frm);
+
+ uidcounter = get_u16(frm);
+ printf("UIDCounter: 0x%04x (%u)\n", uidcounter, uidcounter);
+
+ p_indent(level, frm);
+
+ count = get_u32(frm);
+ printf("AttributeCount: 0x%04x (%u)", count, count);
+
+ for (; count > 0; count--) {
+ uint32_t attr;
+
+ p_indent(level, frm);
+
+ attr = get_u32(frm);
+ printf("AttributeID: 0x%08x (%s)\n", attr, mediattr2str(attr));
+ }
+
+ return;
+
+response:
+ status = get_u8(frm);
+ printf("Status: 0x%02x (%s)\n", status, error2str(status));
+
+ if (len == 1)
+ return;
+
+ p_indent(level, frm);
+
+ count = get_u32(frm);
+ printf("AttributeCount: 0x%04x (%u)", count, count);
+
+ avrcp_attribute_entry_list_dump(level, frm, count);
+}
+
static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
{
uint8_t pduid;
@@ -1971,6 +2041,9 @@ static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
case AVRCP_CHANGE_PATH:
avrcp_change_path_dump(level + 1, frm, hdr, len);
break;
+ case AVRCP_GET_ITEM_ATTRIBUTES:
+ avrcp_get_item_attributes_dump(level + 1, frm, hdr, len);
+ break;
default:
raw_dump(level, frm);
}
--
1.7.11.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC hcidump 6/8] AVRCP: Add parsing for PlayItem PDU
2012-08-15 13:32 [RFC hcidump 1/8] AVRCP: Add initial support for browsing channel Luiz Augusto von Dentz
` (3 preceding siblings ...)
2012-08-15 13:32 ` [RFC hcidump 5/8] AVRCP: Add parsing for GetItemAttributes PDU Luiz Augusto von Dentz
@ 2012-08-15 13:32 ` Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 7/8] AVRCP: Add parsing for Search PDU Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 8/8] AVRCP: Add parsing for AddToNowPlaying PDU Luiz Augusto von Dentz
6 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2012-08-15 13:32 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
parser/avrcp.c | 73 +++++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 57 insertions(+), 16 deletions(-)
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 046368c..47dfc9b 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -1342,6 +1342,60 @@ response:
}
}
+static const char *scope2str(uint8_t scope)
+{
+ switch (scope) {
+ case AVRCP_MEDIA_PLAYER_LIST:
+ return "Media Player List";
+ case AVRCP_MEDIA_PLAYER_VFS:
+ return "Media Player Virtual Filesystem";
+ case AVRCP_MEDIA_SEARCH:
+ return "Search";
+ case AVRCP_MEDIA_NOW_PLAYING:
+ return "Now Playing";
+ default:
+ return "Unknown";
+ }
+}
+
+static void avrcp_play_item_dump(int level, struct frame *frm,
+ uint8_t ctype, uint16_t len)
+{
+ uint64_t uid;
+ uint32_t uidcounter;
+ uint8_t scope, status;
+
+ p_indent(level, frm);
+
+ if (ctype > AVC_CTYPE_GENERAL_INQUIRY)
+ goto response;
+
+ if (len < 13) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ scope = get_u8(frm);
+ printf("Scope: 0x%02x (%s)", scope, scope2str(scope));
+
+ p_indent(level, frm);
+
+ uid = get_u64(frm);
+ printf("UID: 0x%16" PRIx64 " (%" PRIu64 ")\n", uid, uid);
+
+ p_indent(level, frm);
+
+ uidcounter = get_u16(frm);
+ printf("UIDCounter: 0x%04x (%u)\n", uidcounter, uidcounter);
+
+ return;
+
+response:
+ status = get_u8(frm);
+ printf("Status: 0x%02x (%s)\n", status, error2str(status));
+}
+
static void avrcp_pdu_dump(int level, struct frame *frm, uint8_t ctype)
{
uint8_t pduid, pt;
@@ -1414,6 +1468,9 @@ static void avrcp_pdu_dump(int level, struct frame *frm, uint8_t ctype)
case AVRCP_SET_ADDRESSED_PLAYER:
avrcp_set_addressed_player(level + 1, frm, ctype, len);
break;
+ case AVRCP_PLAY_ITEM:
+ avrcp_play_item_dump(level + 1, frm, ctype, len);
+ break;
default:
raw_dump(level, frm);
}
@@ -1507,22 +1564,6 @@ static const char *subunit2str(uint8_t subunit)
}
}
-static const char *scope2str(uint8_t scope)
-{
- switch (scope) {
- case AVRCP_MEDIA_PLAYER_LIST:
- return "Media Player List";
- case AVRCP_MEDIA_PLAYER_VFS:
- return "Media Player Virtual Filesystem";
- case AVRCP_MEDIA_SEARCH:
- return "Search";
- case AVRCP_MEDIA_NOW_PLAYING:
- return "Now Playing";
- default:
- return "Unknown";
- }
-}
-
static const char *playertype2str(uint8_t type)
{
switch (type & 0x0F) {
--
1.7.11.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC hcidump 7/8] AVRCP: Add parsing for Search PDU
2012-08-15 13:32 [RFC hcidump 1/8] AVRCP: Add initial support for browsing channel Luiz Augusto von Dentz
` (4 preceding siblings ...)
2012-08-15 13:32 ` [RFC hcidump 6/8] AVRCP: Add parsing for PlayItem PDU Luiz Augusto von Dentz
@ 2012-08-15 13:32 ` Luiz Augusto von Dentz
2012-08-15 13:32 ` [RFC hcidump 8/8] AVRCP: Add parsing for AddToNowPlaying PDU Luiz Augusto von Dentz
6 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2012-08-15 13:32 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
parser/avrcp.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 47dfc9b..1fb085c 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -2055,6 +2055,60 @@ response:
avrcp_attribute_entry_list_dump(level, frm, count);
}
+static void avrcp_search_dump(int level, struct frame *frm, uint8_t hdr,
+ uint16_t len)
+{
+ uint32_t uidcounter, items;
+ uint16_t charset;
+ uint8_t namelen, status;
+
+ p_indent(level, frm);
+
+ if (hdr & 0x02)
+ goto response;
+
+ if (len < 3) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ charset = get_u16(frm);
+ printf("CharsetID: 0x%04x (%s)\n", charset, charset2str(charset));
+
+ p_indent(level, frm);
+
+ namelen = get_u8(frm);
+ printf("Length: 0x%02x (%u)\n", namelen, namelen);
+
+ p_indent(level, frm);
+
+ printf("String: ");
+ for (; namelen > 0; namelen--) {
+ uint8_t c = get_u8(frm);
+ printf("%1c", isprint(c) ? c : '.');
+ }
+
+ return;
+
+response:
+ status = get_u8(frm);
+ printf("Status: 0x%02x (%s)\n", status, error2str(status));
+
+ if (len == 1)
+ return;
+
+ p_indent(level, frm);
+
+ uidcounter = get_u16(frm);
+ printf("UIDCounter: 0x%04x (%u)\n", uidcounter, uidcounter);
+
+ p_indent(level, frm);
+
+ items = get_u32(frm);
+ printf("Number of Items: 0x%04x (%u)", items, items);
+}
+
static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
{
uint8_t pduid;
@@ -2085,6 +2139,9 @@ static void avrcp_browsing_dump(int level, struct frame *frm, uint8_t hdr)
case AVRCP_GET_ITEM_ATTRIBUTES:
avrcp_get_item_attributes_dump(level + 1, frm, hdr, len);
break;
+ case AVRCP_SEARCH:
+ avrcp_search_dump(level + 1, frm, hdr, len);
+ break;
default:
raw_dump(level, frm);
}
--
1.7.11.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC hcidump 8/8] AVRCP: Add parsing for AddToNowPlaying PDU
2012-08-15 13:32 [RFC hcidump 1/8] AVRCP: Add initial support for browsing channel Luiz Augusto von Dentz
` (5 preceding siblings ...)
2012-08-15 13:32 ` [RFC hcidump 7/8] AVRCP: Add parsing for Search PDU Luiz Augusto von Dentz
@ 2012-08-15 13:32 ` Luiz Augusto von Dentz
6 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2012-08-15 13:32 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
parser/avrcp.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 1fb085c..6948689 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -1396,6 +1396,44 @@ response:
printf("Status: 0x%02x (%s)\n", status, error2str(status));
}
+static void avrcp_add_to_now_playing_dump(int level, struct frame *frm,
+ uint8_t ctype, uint16_t len)
+{
+ uint64_t uid;
+ uint32_t uidcounter;
+ uint8_t scope, status;
+
+ p_indent(level, frm);
+
+ if (ctype > AVC_CTYPE_GENERAL_INQUIRY)
+ goto response;
+
+ if (len < 11) {
+ printf("PDU Malformed\n");
+ raw_dump(level, frm);
+ return;
+ }
+
+ scope = get_u8(frm);
+ printf("Scope: 0x%02x (%s)\n", scope, scope2str(scope));
+
+ p_indent(level, frm);
+
+ uid = get_u64(frm);
+ printf("UID: 0x%16" PRIx64 " (%" PRIu64 ")\n", uid, uid);
+
+ p_indent(level, frm);
+
+ uidcounter = get_u16(frm);
+ printf("UIDCounter: 0x%04x (%u)\n", uidcounter, uidcounter);
+
+ return;
+
+response:
+ status = get_u8(frm);
+ printf("Status: 0x%02x (%s)\n", status, error2str(status));
+}
+
static void avrcp_pdu_dump(int level, struct frame *frm, uint8_t ctype)
{
uint8_t pduid, pt;
@@ -1471,6 +1509,9 @@ static void avrcp_pdu_dump(int level, struct frame *frm, uint8_t ctype)
case AVRCP_PLAY_ITEM:
avrcp_play_item_dump(level + 1, frm, ctype, len);
break;
+ case AVRCP_ADD_TO_NOW_PLAYING:
+ avrcp_add_to_now_playing_dump(level + 1, frm, ctype, len);
+ break;
default:
raw_dump(level, frm);
}
--
1.7.11.2
^ permalink raw reply related [flat|nested] 8+ messages in thread