From: Luiz Augusto von Dentz Date: Mon, 13 Aug 2012 11:11:31 +0000 (+0300) Subject: hcidump: Add initial support for browsing channel X-Git-Tag: android-x86-4.4-r3~9597 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=43332c110ce577e3807504862a8b400d42778164;p=android-x86%2Fexternal-bluetooth-bluez.git hcidump: Add initial support for browsing channel --- diff --git a/tools/parser/avctp.c b/tools/parser/avctp.c index 2da4c095c..4b52f0bbf 100644 --- a/tools/parser/avctp.c +++ b/tools/parser/avctp.c @@ -50,7 +50,7 @@ static char *pt2str(uint8_t hdr) } } -void avctp_dump(int level, struct frame *frm) +void avctp_dump(int level, struct frame *frm, uint16_t psm) { uint8_t hdr; uint16_t pid; @@ -65,7 +65,7 @@ void avctp_dump(int level, struct frame *frm) pt2str(hdr), hdr & 0x0c, hdr >> 4, pid); if (pid == SDP_UUID_AV_REMOTE || pid == SDP_UUID_AV_REMOTE_TARGET) - avrcp_dump(level + 1, frm); + avrcp_dump(level + 1, frm, psm); else raw_dump(level + 1, frm); } diff --git a/tools/parser/avrcp.c b/tools/parser/avrcp.c index 9c83907c3..678f0df31 100644 --- a/tools/parser/avrcp.c +++ b/tools/parser/avrcp.c @@ -1502,13 +1502,34 @@ static const char *subunit2str(uint8_t subunit) } } -void avrcp_dump(int level, struct frame *frm) +static void avrcp_browsing_dump(int level, struct frame *frm) +{ + uint8_t pduid; + uint16_t len; + + pduid = get_u8(frm); + len = get_u16(frm); + + printf("AVRCP: %s: len 0x%04x\n", pdu2str(pduid), len); + + if (len != frm->len) { + p_indent(level, frm); + printf("PDU Malformed\n"); + raw_dump(level, frm); + return; + } + + switch (pduid) { + default: + raw_dump(level, frm); + } +} + +static void avrcp_control_dump(int level, struct frame *frm) { uint8_t ctype, address, subunit, opcode, company[3]; int i; - p_indent(level, frm); - ctype = get_u8(frm); address = get_u8(frm); opcode = get_u8(frm); @@ -1557,3 +1578,19 @@ void avrcp_dump(int level, struct frame *frm) raw_dump(level, frm); } } + +void avrcp_dump(int level, struct frame *frm, uint16_t psm) +{ + p_indent(level, frm); + + switch (psm) { + case 0x17: + avrcp_control_dump(level, frm); + break; + case 0x1B: + avrcp_browsing_dump(level, frm); + break; + default: + raw_dump(level, frm); + } +} diff --git a/tools/parser/l2cap.c b/tools/parser/l2cap.c index 862cc8b54..9b2834d9f 100644 --- a/tools/parser/l2cap.c +++ b/tools/parser/l2cap.c @@ -1489,8 +1489,9 @@ static void l2cap_parse(int level, struct frame *frm) break; case 0x17: + case 0x1B: if (!p_filter(FILT_AVCTP)) - avctp_dump(level, frm); + avctp_dump(level, frm, psm); else raw_dump(level + 1, frm); break; diff --git a/tools/parser/parser.h b/tools/parser/parser.h index 1130a5ff9..c712d42c9 100644 --- a/tools/parser/parser.h +++ b/tools/parser/parser.h @@ -233,8 +233,8 @@ void cmtp_dump(int level, struct frame *frm); 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); -void avrcp_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 att_dump(int level, struct frame *frm); void smp_dump(int level, struct frame *frm); void sap_dump(int level, struct frame *frm);