From 2a233e5e2663813a01d58cbe06e9dd77ca8e33d0 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Mon, 4 Feb 2002 06:15:35 +0000 Subject: [PATCH] hcidump: Time stamp support --- tools/hcidump.c | 22 ++++++++++++++++++++-- tools/parser/hci.c | 10 +++++----- tools/parser/l2cap.c | 7 ++++--- tools/parser/parser.h | 23 ++++++++++++++--------- tools/parser/rfcomm.c | 6 +++--- tools/parser/sdp.c | 8 ++++---- 6 files changed, 50 insertions(+), 26 deletions(-) diff --git a/tools/hcidump.c b/tools/hcidump.c index 35e73c09e..fe78301d9 100644 --- a/tools/hcidump.c +++ b/tools/hcidump.c @@ -51,8 +51,8 @@ static int device; static int snap_len = SNAP_LEN; static int mode = PARSE; -static long flags; -static long filter; +static long flags; +static long filter; static char *dump_file; static void process_frames(int dev, int sock, int file) @@ -104,6 +104,9 @@ static void process_frames(int dev, int sock, int file) case HCI_CMSG_DIR: frm.in = *((int *)CMSG_DATA(cmsg)); break; + case HCI_CMSG_TSTAMP: + frm.ts = *((struct timeval *)CMSG_DATA(cmsg)); + break; } cmsg = CMSG_NXTHDR(&msg, cmsg); } @@ -123,6 +126,8 @@ static void process_frames(int dev, int sock, int file) /* Save dump */ dh->len = __cpu_to_le16(frm.data_len); dh->in = frm.in; + dh->ts_sec = __cpu_to_le32(frm.ts.tv_sec); + dh->ts_usec = __cpu_to_le32(frm.ts.tv_usec); if (write_n(file, buf, frm.data_len + DUMP_HDR_SIZE) < 0) { perror("Write error"); exit(1); @@ -162,6 +167,8 @@ static void read_dump(int file) frm.ptr = frm.data; frm.len = frm.data_len; frm.in = dh.in; + frm.ts.tv_sec = __le32_to_cpu(dh.ts_sec); + frm.ts.tv_usec = __le32_to_cpu(dh.ts_usec); parse(&frm); } @@ -205,6 +212,12 @@ static int open_socket(int dev) exit(1); } + opt = 1; + if (setsockopt(s, SOL_HCI, HCI_TIME_STAMP, &opt, sizeof(opt)) < 0) { + perror("Can't enable time stamp"); + exit(1); + } + /* Setup filter */ flt.type_mask = ~0; // All packet types flt.event_mask[0] = ~0L; // All events @@ -233,6 +246,7 @@ static struct argp_option options[] = { {"snap-len", 's', "len", 0, "Snap len (in bytes)", 1 }, {"save-dump", 'w', "file", 0, "Save dump to a file", 2 }, {"read-dump", 'r', "file", 0, "Read dump from a file", 2 }, + {"ts", 't', 0, 0, "Display time stamps", 2 }, {"hex", 'x', 0, 0, "Dump data in hex", 3 }, {"ascii", 'a', 0, 0, "Dump data in ascii", 3 }, {"raw", 'R', 0, 0, "Raw mode", 4 }, @@ -284,6 +298,10 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) snap_len = atoi(arg); break; + case 't': + flags |= DUMP_TSTAMP; + break; + case 'R': flags |= DUMP_HEX; mode = RAW; diff --git a/tools/parser/hci.c b/tools/parser/hci.c index 996082fa6..6b2441870 100644 --- a/tools/parser/hci.c +++ b/tools/parser/hci.c @@ -272,7 +272,7 @@ static inline void command_dump(int level, struct frame *frm) break; } - p_indent(level, frm->in); + p_indent(level, frm); printf("HCI Command: %s(0x%2.2x|0x%4.4x) plen %d\n", cmd, ogf, ocf, hdr->plen); @@ -290,7 +290,7 @@ static inline void event_dump(int level, struct frame *frm) if (p_filter(FILT_HCI)) return; - p_indent(level, frm->in); + p_indent(level, frm); if (hdr->evt <= EVENT_NUM) printf("HCI Event: %s(0x%2.2x) plen %d\n", @@ -312,7 +312,7 @@ static inline void acl_dump(int level, struct frame *frm) __u8 flags = acl_flags(handle); if (!p_filter(FILT_HCI)) { - p_indent(level, frm->in); + p_indent(level, frm); printf("ACL data: handle 0x%4.4x flags 0x%2.2x dlen %d\n", acl_handle(handle), flags, dlen); level++; @@ -335,7 +335,7 @@ static inline void sco_dump(int level, struct frame *frm) __u16 handle = __le16_to_cpu(hdr->handle); if (!p_filter(FILT_SCO)) { - p_indent(level, frm->in); + p_indent(level, frm); printf("SCO data: handle 0x%4.4x dlen %d\n", acl_handle(handle), hdr->dlen); level++; @@ -373,7 +373,7 @@ void hci_dump(int level, struct frame *frm) if (p_filter(FILT_HCI)) break; - p_indent(level, frm->in); + p_indent(level, frm); printf("Unknown: type 0x%2.2x len %d\n", type, frm->len); raw_dump(level, frm); break; diff --git a/tools/parser/l2cap.c b/tools/parser/l2cap.c index a35a6c3b6..8d7364163 100644 --- a/tools/parser/l2cap.c +++ b/tools/parser/l2cap.c @@ -313,7 +313,7 @@ static void l2cap_parse(int level, struct frame *frm) frm->len -= L2CAP_CMD_HDR_SIZE; if (!p_filter(FILT_L2CAP)) { - p_indent(level, frm->in); + p_indent(level, frm); printf("L2CAP(s): "); } @@ -381,7 +381,7 @@ static void l2cap_parse(int level, struct frame *frm) psm = btohs(*(__u16*)frm->ptr); frm->len -= 2; - p_indent(level, frm->in); + p_indent(level, frm); printf("L2CAP(c): cid 0x%x len %d psm %d\n", cid, dlen, psm); raw_dump(level, frm); } else { @@ -389,7 +389,7 @@ static void l2cap_parse(int level, struct frame *frm) __u16 psm = get_psm(!frm->in, cid); if (!p_filter(FILT_L2CAP)) { - p_indent(level, frm->in); + p_indent(level, frm); printf("L2CAP(d): cid 0x%x len %d [psm %d]\n", cid, dlen, psm); level++; @@ -453,6 +453,7 @@ void l2cap_dump(int level, struct frame *frm) fr->len = frm->len; fr->ptr = fr->data; fr->in = frm->in; + fr->ts = frm->ts; } else { if (!(fr = get_frame(frm->handle))) { fprintf(stderr, "Not enough connetion handles\n"); diff --git a/tools/parser/parser.h b/tools/parser/parser.h index b3351cd4e..dae3a0f9b 100644 --- a/tools/parser/parser.h +++ b/tools/parser/parser.h @@ -24,13 +24,14 @@ */ struct frame { - void *data; - int data_len; - void *ptr; - int len; - int in; - int handle; - long flags; + void *data; + int data_len; + void *ptr; + int len; + int in; + int handle; + long flags; + struct timeval ts; }; /* Parser flags */ @@ -39,6 +40,7 @@ struct frame { #define DUMP_HEX 0x01 #define DUMP_ASCII 0x02 #define DUMP_TYPE_MASK (DUMP_HEX | DUMP_ASCII) +#define DUMP_TSTAMP 0x04 /* Parser filter */ #define FILT_HCI 0x0001 @@ -62,7 +64,7 @@ static inline int p_filter(unsigned long f) return !(parser.filter & f); } -static inline void p_indent(int level, int in) +static inline void p_indent(int level, struct frame *f) { if (level < 0) { parser.state = 0; @@ -70,7 +72,10 @@ static inline void p_indent(int level, int in) } if (!parser.state) { - printf("%c ", (in ? '>' : '<')); + if (parser.flags & DUMP_TSTAMP) + printf("%ld.%ld ", f->ts.tv_sec, f->ts.tv_usec); + + printf("%c ", (f->in ? '>' : '<')); parser.state = 1; } else printf(" "); diff --git a/tools/parser/rfcomm.c b/tools/parser/rfcomm.c index 1751526d0..f50e6321a 100644 --- a/tools/parser/rfcomm.c +++ b/tools/parser/rfcomm.c @@ -203,7 +203,7 @@ static inline void mcc_frame(int level, struct frame *frm, long_frame_head *head frm->ptr += hdr_size; frm->len -= hdr_size; - p_indent(level, frm->in); + p_indent(level, frm); printf("RFCOMM(s): "); switch (mcc_head.type.type) { @@ -247,7 +247,7 @@ static inline void uih_frame(int level, struct frame *frm, long_frame_head *head if (!head->addr.server_chn) { mcc_frame(level, frm, head); } else { - p_indent(level, frm->in); + p_indent(level, frm); printf("RFCOMM(d): UIH: "); print_rfcomm_hdr(head, frm->ptr, frm->len); printf("\n"); @@ -281,7 +281,7 @@ void rfcomm_dump(int level, struct frame *frm) if (ctr_type == UIH) { uih_frame(level, frm, &head); } else { - p_indent(level, frm->in); + p_indent(level, frm); printf("RFCOMM(s): "); switch (ctr_type) { diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c index 5c29ba480..0b04facdc 100644 --- a/tools/parser/sdp.c +++ b/tools/parser/sdp.c @@ -329,7 +329,7 @@ static inline void print_srv_srch_pat(int level, struct frame *frm) int n1; int n2; - p_indent(level, frm->in); + p_indent(level, frm); printf("pat"); if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { @@ -357,7 +357,7 @@ static inline void print_attr_id_list(int level, struct frame *frm) int n2; int len = frm->len; - p_indent(level, frm->in); + p_indent(level, frm); printf("aid(s)"); if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { @@ -552,7 +552,7 @@ void sdp_dump(int level, struct frame *frm) frm->ptr += SDP_PDU_HDR_SIZE; frm->len -= SDP_PDU_HDR_SIZE; - p_indent(level, frm->in); + p_indent(level, frm); switch (hdr->pid) { case SDP_ERROR_RSP: @@ -585,7 +585,7 @@ void sdp_dump(int level, struct frame *frm) if (hdr->pid != SDP_ERROR_RSP) { /* Parse ContinuationState */ if (*(__u8*) frm->ptr) { - p_indent(++level, frm->in); + p_indent(++level, frm); printf("cont "); raw_dump(0, frm); } -- 2.47.3