diff --git a/tools/parser/avctp.c b/tools/parser/avctp.c
index 2da4c09..4b52f0b 100644
--- a/tools/parser/avctp.c
+++ b/tools/parser/avctp.c
}
}
-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;
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 9c83907..678f0df 100644
--- a/tools/parser/avrcp.c
+++ b/tools/parser/avrcp.c
}
}
-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);
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 862cc8b..9b2834d 100644
--- a/tools/parser/l2cap.c
+++ b/tools/parser/l2cap.c
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 1130a5f..c712d42 100644
--- a/tools/parser/parser.h
+++ b/tools/parser/parser.h
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);