Diff between d9548f909bacb8971fe0f5d16ad09bcac6a8ff2c and 50df085bb61a812f2f7eeaa8c9d8e850c8508725

Changed Files

File Additions Deletions Status
tools/hcidump.c +37 -3 modified
tools/parser/parser.c +5 -3 modified
tools/parser/parser.h +14 -7 modified

Full Patch

diff --git a/tools/hcidump.c b/tools/hcidump.c
index a8939e2..09436c0 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
@@ -50,8 +50,9 @@
 /* Default options */
 static int  device;
 static int  snap_len = SNAP_LEN;
-static int  mode  = PARSE;
+static int  mode = PARSE;
 static long flags; 
+static long filter; 
 static char *dump_file;
 
 static void process_frames(int dev, int sock, int file)
@@ -237,6 +238,31 @@ static struct argp_option options[] = {
 	{ 0 }
 };
 
+static struct {
+	char *name;
+	int  flag;
+} filters[] = {
+	{ "hci",    FILT_HCI    },
+	{ "l2cap",  FILT_L2CAP  },
+	{ "rfcomm", FILT_RFCOMM },
+	{ "sdp",    FILT_SDP    },
+	{ 0 }
+};
+
+static void parse_filter(struct argp_state *state)
+{
+	int i,n;
+	
+	for (i=state->next; i<state->argc; i++) {
+		for (n=0; filters[n].name; n++) {
+			if (!strcmp(filters[n].name, state->argv[i])) {
+				filter |= filters[n].flag;
+				break;
+			}
+		}
+	}
+}
+
 static error_t parse_opt(int key, char *arg, struct argp_state *state)
 {
 	switch (key) {
@@ -271,6 +297,10 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state)
 			dump_file = strdup(arg);
 			break;
 
+		case ARGP_KEY_ARGS:
+			parse_filter(state);
+			break;
+
 		default:
 			return ARGP_ERR_UNKNOWN;
 	}
@@ -290,10 +320,14 @@ int main(int argc, char *argv[])
 	
 	printf("HCIDump - HCI packet analyzer ver %s.\n", VERSION);
 
+	/* Default settings */
+	if (!filter)
+		filter = ~0L;
+
 	switch (mode) {
 	case RAW:
 	case PARSE:
-		init_parser(flags);
+		init_parser(flags, filter);
 		process_frames(device, open_socket(device), -1);
 		break;
 
@@ -302,7 +336,7 @@ int main(int argc, char *argv[])
 		break;
 
 	case READ:
-		init_parser(flags);
+		init_parser(flags, filter);
 		read_dump(open_file(dump_file, mode));
 		break;
 	}
diff --git a/tools/parser/parser.c b/tools/parser/parser.c
index a4cd8a7..0c88659 100644
--- a/tools/parser/parser.c
+++ b/tools/parser/parser.c
@@ -35,11 +35,13 @@
 
 #include "parser.h"
 
-static long parser_flags;
+long parser_flags;
+long parser_filter;
 
-void init_parser(long flags)
+void init_parser(long flags, long filter)
 {
-	parser_flags = flags;
+	parser_flags  = flags;
+	parser_filter = parser_filter; 
 }
 
 static inline void hex_dump(int level, unsigned char *buf, int len)
diff --git a/tools/parser/parser.h b/tools/parser/parser.h
index fa6a1c8..4e10589 100644
--- a/tools/parser/parser.h
+++ b/tools/parser/parser.h
@@ -23,12 +23,6 @@
  * $Id$
  */
 
-#define DUMP_WIDTH	20
-
-#define DUMP_HEX	0x01
-#define DUMP_ASCII	0x02
-#define DUMP_TYPE_MASK	(DUMP_HEX | DUMP_ASCII)
-
 struct frame {
 	void *data;
 	int  data_len;
@@ -39,7 +33,20 @@ struct frame {
 	long flags;
 };
 
-void init_parser(long flags);
+/* Parser flags */
+#define DUMP_WIDTH	20
+
+#define DUMP_HEX	0x01
+#define DUMP_ASCII	0x02
+#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
+
+void init_parser(long flags, long filter);
 
 void raw_dump(int level, struct frame *frm);
 void hci_dump(int level, struct frame *frm);