Diff between c79ba4784f96183711e4804b49feb70b27262772 and a1816b7953927bd37fa16d2973c06dccfda6f89a

Changed Files

File Additions Deletions Status
tools/hcidump.c +8 -1 modified
tools/parser/hci.c +31 -10 modified
tools/parser/parser.h +9 -8 modified

Full Patch

diff --git a/tools/hcidump.c b/tools/hcidump.c
index f6b1f40..ac5c2ba 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 ca4640f..2951780 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 42ed05b..1c4f80a 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 */