diff --git a/tools/hcidump.c b/tools/hcidump.c
index 206dd09..35e73c0 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
{"snap-len", 's', "len", 0, "Snap len (in bytes)", 1 },
{"save-dump", 'w', "file", 0, "Save dump to a file", 2 },
{"read-dump", 'r', "file", 0, "Read dump from a file", 2 },
- {"hex", 'h', 0, 0, "Dump data in hex", 3 },
+ {"hex", 'x', 0, 0, "Dump data in hex", 3 },
{"ascii", 'a', 0, 0, "Dump data in ascii", 3 },
- {"raw", 'R', 0, 0, "Raw mode", 3 },
+ {"raw", 'R', 0, 0, "Raw mode", 4 },
{ 0 }
};
} filters[] = {
{ "hci", FILT_HCI },
{ "l2cap", FILT_L2CAP },
+ { "sco", FILT_SCO },
{ "rfcomm", FILT_RFCOMM },
{ "sdp", FILT_SDP },
{ 0 }
device = atoi(arg+3);
break;
- case 'h':
+ case 'x':
flags |= DUMP_HEX;
break;
diff --git a/tools/parser/hci.c b/tools/parser/hci.c
index 070fbcd..996082f 100644
--- a/tools/parser/hci.c
+++ b/tools/parser/hci.c
"Disconn Complete",
"Auth Complete",
"Remote Name Req Complete",
- "Encryp Change",
+ "Encrypt Change",
"Change Connection Link Key Complete",
"Master Link Key Complete",
"Read Remote Supported Features",
raw_dump(level, frm);
}
+static inline void sco_dump(int level, struct frame *frm)
+{
+ hci_sco_hdr *hdr = (void *) frm->ptr;
+ __u16 handle = __le16_to_cpu(hdr->handle);
+
+ if (!p_filter(FILT_SCO)) {
+ p_indent(level, frm->in);
+ printf("SCO data: handle 0x%4.4x dlen %d\n",
+ acl_handle(handle), hdr->dlen);
+ level++;
+
+ frm->ptr += HCI_SCO_HDR_SIZE;
+ frm->len -= HCI_SCO_HDR_SIZE;
+ raw_dump(level, frm);
+ }
+}
+
void hci_dump(int level, struct frame *frm)
{
__u8 type = *(__u8 *)frm->ptr;
acl_dump(level, frm);
break;
+ case HCI_SCODATA_PKT:
+ sco_dump(level, frm);
+ break;
+
default:
if (p_filter(FILT_HCI))
break;
diff --git a/tools/parser/parser.h b/tools/parser/parser.h
index d5b1f26..b3351cd 100644
--- a/tools/parser/parser.h
+++ b/tools/parser/parser.h
#define DUMP_TYPE_MASK (DUMP_HEX | DUMP_ASCII)
/* Parser filter */
-#define FILT_HCI 0x01
-#define FILT_L2CAP 0x02
-#define FILT_RFCOMM 0x04
-#define FILT_SDP 0x08
+#define FILT_HCI 0x0001
+#define FILT_L2CAP 0x0002
+#define FILT_RFCOMM 0x0004
+#define FILT_SDP 0x0008
+#define FILT_SCO 0x0010
struct parser_t {
unsigned long flags;
diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c
index 0a7c6c5..5c29ba4 100644
--- a/tools/parser/sdp.c
+++ b/tools/parser/sdp.c
printf("aid(s)");
if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) {
- while (len - frm->len < n1 ) {
+ while (len - frm->len <= n1 ) {
/* Print AttributeID */
if (parse_de_hdr(frm, &n2) == SDP_DE_UINT) {
switch(n2) {
attr_id_range = get_u32(frm);
printf(" 0x%x--0x%x",
(attr_id_range >> 16),
- (attr_id_range & 0x00FF));
+ (attr_id_range & 0xFFFF));
break;
}
} else {
return;
}
- if (hdr->pid != SDP_ERROR_RSP)
- {
+ if (hdr->pid != SDP_ERROR_RSP) {
/* Parse ContinuationState */
if (*(__u8*) frm->ptr) {
p_indent(++level, frm->in);