From a8fced66bee715b0f440cfb6fe2164c8bb27a2e3 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Fri, 21 Dec 2001 17:35:48 +0000 Subject: [PATCH] hcidump: SCO support. Minor fixes. --- tools/hcidump.c | 7 ++++--- tools/parser/hci.c | 23 ++++++++++++++++++++++- tools/parser/parser.h | 9 +++++---- tools/parser/sdp.c | 7 +++---- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/tools/hcidump.c b/tools/hcidump.c index 206dd0990..35e73c09e 100644 --- a/tools/hcidump.c +++ b/tools/hcidump.c @@ -233,9 +233,9 @@ 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 }, - {"hex", 'h', 0, 0, "Dump data in hex", 3 }, + {"hex", 'x', 0, 0, "Dump data in hex", 3 }, {"ascii", 'a', 0, 0, "Dump data in ascii", 3 }, - {"raw", 'R', 0, 0, "Raw mode", 3 }, + {"raw", 'R', 0, 0, "Raw mode", 4 }, { 0 } }; @@ -245,6 +245,7 @@ static struct { } filters[] = { { "hci", FILT_HCI }, { "l2cap", FILT_L2CAP }, + { "sco", FILT_SCO }, { "rfcomm", FILT_RFCOMM }, { "sdp", FILT_SDP }, { 0 } @@ -271,7 +272,7 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) device = atoi(arg+3); break; - case 'h': + case 'x': flags |= DUMP_HEX; break; diff --git a/tools/parser/hci.c b/tools/parser/hci.c index 070fbcd91..996082fa6 100644 --- a/tools/parser/hci.c +++ b/tools/parser/hci.c @@ -47,7 +47,7 @@ char *event_map[] = { "Disconn Complete", "Auth Complete", "Remote Name Req Complete", - "Encryp Change", + "Encrypt Change", "Change Connection Link Key Complete", "Master Link Key Complete", "Read Remote Supported Features", @@ -329,6 +329,23 @@ static inline void acl_dump(int level, struct frame *frm) raw_dump(level, frm); } +static inline void sco_dump(int level, struct frame *frm) +{ + hci_sco_hdr *hdr = (void *) frm->ptr; + __u16 handle = __le16_to_cpu(hdr->handle); + + if (!p_filter(FILT_SCO)) { + p_indent(level, frm->in); + printf("SCO data: handle 0x%4.4x dlen %d\n", + acl_handle(handle), hdr->dlen); + level++; + + frm->ptr += HCI_SCO_HDR_SIZE; + frm->len -= HCI_SCO_HDR_SIZE; + raw_dump(level, frm); + } +} + void hci_dump(int level, struct frame *frm) { __u8 type = *(__u8 *)frm->ptr; @@ -348,6 +365,10 @@ void hci_dump(int level, struct frame *frm) acl_dump(level, frm); break; + case HCI_SCODATA_PKT: + sco_dump(level, frm); + break; + default: if (p_filter(FILT_HCI)) break; diff --git a/tools/parser/parser.h b/tools/parser/parser.h index d5b1f2641..b3351cd4e 100644 --- a/tools/parser/parser.h +++ b/tools/parser/parser.h @@ -41,10 +41,11 @@ struct frame { #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 +#define FILT_HCI 0x0001 +#define FILT_L2CAP 0x0002 +#define FILT_RFCOMM 0x0004 +#define FILT_SDP 0x0008 +#define FILT_SCO 0x0010 struct parser_t { unsigned long flags; diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c index 0a7c6c563..5c29ba480 100644 --- a/tools/parser/sdp.c +++ b/tools/parser/sdp.c @@ -361,7 +361,7 @@ static inline void print_attr_id_list(int level, struct frame *frm) printf("aid(s)"); if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { - while (len - frm->len < n1 ) { + while (len - frm->len <= n1 ) { /* Print AttributeID */ if (parse_de_hdr(frm, &n2) == SDP_DE_UINT) { switch(n2) { @@ -373,7 +373,7 @@ static inline void print_attr_id_list(int level, struct frame *frm) attr_id_range = get_u32(frm); printf(" 0x%x--0x%x", (attr_id_range >> 16), - (attr_id_range & 0x00FF)); + (attr_id_range & 0xFFFF)); break; } } else { @@ -582,8 +582,7 @@ void sdp_dump(int level, struct frame *frm) return; } - if (hdr->pid != SDP_ERROR_RSP) - { + if (hdr->pid != SDP_ERROR_RSP) { /* Parse ContinuationState */ if (*(__u8*) frm->ptr) { p_indent(++level, frm->in); -- 2.47.3