Diff between f4655cc3892fbe903b4a2a7f9a1d1e7681b38cd0 and a8fced66bee715b0f440cfb6fe2164c8bb27a2e3

Changed Files

File Additions Deletions Status
tools/hcidump.c +4 -3 modified
tools/parser/hci.c +22 -1 modified
tools/parser/parser.h +5 -4 modified
tools/parser/sdp.c +3 -4 modified

Full Patch

diff --git a/tools/hcidump.c b/tools/hcidump.c
index 206dd09..35e73c0 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 070fbcd..996082f 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 d5b1f26..b3351cd 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 0a7c6c5..5c29ba4 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);