summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/hcidump.c9
-rw-r--r--tools/parser/hci.c41
-rw-r--r--tools/parser/parser.h17
3 files changed, 48 insertions, 19 deletions
diff --git a/tools/hcidump.c b/tools/hcidump.c
index f6b1f403b..ac5c2ba9a 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
@@ -647,6 +647,7 @@ static void usage(void)
" -A, --audio=file Extract SCO audio data\n"
" -B, --btsnoop Use BTSnoop file format\n"
" -V, --verbose Verbose decoding\n"
+ " -Y, --novendor No vendor commands or events\n"
" -h, --help Give this help list\n"
" --usage Give a short usage message\n"
);
@@ -672,6 +673,8 @@ static struct option main_options[] = {
{ "audio", 1, 0, 'A' },
{ "btsnoop", 0, 0, 'B' },
{ "verbose", 0, 0, 'V' },
+ { "novendor", 0, 0, 'Y' },
+ { "nopermcheck", 0, 0, 'Z' },
{ "help", 0, 0, 'h' },
{ 0 }
};
@@ -684,7 +687,7 @@ int main(int argc, char *argv[])
printf("HCI sniffer - Bluetooth packet analyzer ver %s\n", VERSION);
- while ((opt=getopt_long(argc, argv, "i:l:p:m:w:r:s:n:taxXRC:H:O:A:BVZh", main_options, NULL)) != -1) {
+ while ((opt=getopt_long(argc, argv, "i:l:p:m:w:r:s:n:taxXRC:H:O:A:BVYZh", main_options, NULL)) != -1) {
switch(opt) {
case 'i':
if (strcasecmp(optarg, "none") && strcasecmp(optarg, "system"))
@@ -785,6 +788,10 @@ int main(int argc, char *argv[])
flags |= DUMP_VERBOSE;
break;
+ case 'Y':
+ flags |= DUMP_NOVENDOR;
+ break;
+
case 'Z':
permcheck = 0;
break;
diff --git a/tools/parser/hci.c b/tools/parser/hci.c
index ca4640fc4..295178066 100644
--- a/tools/parser/hci.c
+++ b/tools/parser/hci.c
@@ -994,17 +994,21 @@ static inline void command_dump(int level, struct frame *frm)
if (p_filter(FILT_HCI))
return;
- p_indent(level, frm);
+ if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
+ return;
+ p_indent(level, frm);
printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
opcode2str(opcode), ogf, ocf, hdr->plen);
frm->ptr += HCI_COMMAND_HDR_SIZE;
frm->len -= HCI_COMMAND_HDR_SIZE;
- if (ogf == OGF_VENDOR_CMD && ocf == 0 && get_manufacturer() == 10) {
- csr_dump(level + 1, frm);
- return;
+ if (ogf == OGF_VENDOR_CMD) {
+ if (ocf == 0 && get_manufacturer() == 10) {
+ csr_dump(level + 1, frm);
+ return;
+ }
}
if (!(parser.flags & DUMP_VERBOSE)) {
@@ -1687,6 +1691,9 @@ static inline void cmd_complete_dump(int level, struct frame *frm)
uint16_t ogf = cmd_opcode_ogf(opcode);
uint16_t ocf = cmd_opcode_ocf(opcode);
+ if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
+ return;
+
p_indent(level, frm);
printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
opcode2str(opcode), ogf, ocf, evt->ncmd);
@@ -1864,11 +1871,15 @@ static inline void cmd_status_dump(int level, struct frame *frm)
{
evt_cmd_status *evt = frm->ptr;
uint16_t opcode = btohs(evt->opcode);
+ uint16_t ogf = cmd_opcode_ogf(opcode);
+ uint16_t ocf = cmd_opcode_ocf(opcode);
+
+ if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
+ return;
p_indent(level, frm);
printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
- opcode2str(opcode), cmd_opcode_ogf(opcode),
- cmd_opcode_ocf(opcode), evt->status, evt->ncmd);
+ opcode2str(opcode), ogf, ocf, evt->status, evt->ncmd);
if (evt->status > 0) {
p_indent(level, frm);
@@ -2386,23 +2397,30 @@ static inline void event_dump(int level, struct frame *frm)
if (p_filter(FILT_HCI))
return;
- p_indent(level, frm);
-
if (event <= EVENT_NUM) {
+ p_indent(level, frm);
printf("HCI Event: %s (0x%2.2x) plen %d\n",
- event_str[hdr->evt], hdr->evt, hdr->plen);
+ event_str[hdr->evt], hdr->evt, hdr->plen);
} else if (hdr->evt == EVT_TESTING) {
+ p_indent(level, frm);
printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
} else if (hdr->evt == EVT_VENDOR) {
+ if (parser.flags & DUMP_NOVENDOR)
+ return;
+
+ p_indent(level, frm);
printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
+
if (get_manufacturer() == 10) {
frm->ptr += HCI_EVENT_HDR_SIZE;
frm->len -= HCI_EVENT_HDR_SIZE;
csr_dump(level + 1, frm);
return;
}
- } else
+ } else {
+ p_indent(level, frm);
printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
+ }
frm->ptr += HCI_EVENT_HDR_SIZE;
frm->len -= HCI_EVENT_HDR_SIZE;
@@ -2605,6 +2623,9 @@ static inline void vendor_dump(int level, struct frame *frm)
return;
}
+ if (parser.flags & DUMP_NOVENDOR)
+ return;
+
if (get_manufacturer() == 12) {
bpa_dump(level, frm);
return;
diff --git a/tools/parser/parser.h b/tools/parser/parser.h
index 42ed05bb7..1c4f80ab9 100644
--- a/tools/parser/parser.h
+++ b/tools/parser/parser.h
@@ -51,14 +51,15 @@ struct frame {
/* Parser flags */
#define DUMP_WIDTH 20
-#define DUMP_ASCII 0x01
-#define DUMP_HEX 0x02
-#define DUMP_EXT 0x04
-#define DUMP_RAW 0x08
-#define DUMP_BPA 0x10
-#define DUMP_BTSNOOP 0x20
-#define DUMP_VERBOSE 0x40
-#define DUMP_TSTAMP 0x80
+#define DUMP_ASCII 0x0001
+#define DUMP_HEX 0x0002
+#define DUMP_EXT 0x0004
+#define DUMP_RAW 0x0008
+#define DUMP_BPA 0x0010
+#define DUMP_TSTAMP 0x0100
+#define DUMP_VERBOSE 0x0200
+#define DUMP_BTSNOOP 0x1000
+#define DUMP_NOVENDOR 0x2000
#define DUMP_TYPE_MASK (DUMP_ASCII | DUMP_HEX | DUMP_EXT)
/* Parser filter */