diff --git a/tools/hcidump.c b/tools/hcidump.c
index a8939e2..09436c0 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
/* 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)
{ 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) {
dump_file = strdup(arg);
break;
+ case ARGP_KEY_ARGS:
+ parse_filter(state);
+ break;
+
default:
return ARGP_ERR_UNKNOWN;
}
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;
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
#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
* $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;
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);