From 50df085bb61a812f2f7eeaa8c9d8e850c8508725 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Sat, 15 Sep 2001 07:20:39 +0000 Subject: [PATCH] hcidump: Support for filters in command line. --- tools/hcidump.c | 40 +++++++++++++++++++++++++++++++++++++--- tools/parser/parser.c | 8 +++++--- tools/parser/parser.h | 21 ++++++++++++++------- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/tools/hcidump.c b/tools/hcidump.c index a8939e214..09436c05d 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; iargc; 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 a4cd8a758..0c8865973 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 fa6a1c845..4e1058900 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); -- 2.47.3