diff options
-rw-r--r-- | tools/hcidump.c | 9 | ||||
-rw-r--r-- | tools/parser/hci.c | 41 | ||||
-rw-r--r-- | tools/parser/parser.h | 17 |
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 */ |