Diff between 239941a891c4d2ee95919c88e23ce749f90ea1b2 and eae7ac26253066b9dfabb638943a484c99658032

Changed Files

File Additions Deletions Status
tools/hcidump.c +11 -5 modified
tools/parser/parser.c +41 -8 modified
tools/parser/parser.h +6 -4 modified

Full Patch

diff --git a/tools/hcidump.c b/tools/hcidump.c
index cf6003e..3977308 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
@@ -335,8 +335,9 @@ static void usage(void)
 	"  -w, --save-dump=file       Save dump to a file\n"
 	"  -r, --read-dump=file       Read dump from a file\n"
 	"  -t, --ts                   Display time stamps\n"
-	"  -x, --hex                  Dump data in hex\n"
 	"  -a, --ascii                Dump data in ascii\n"
+	"  -x, --hex                  Dump data in hex\n"
+	"  -X, --ext                  Dump data in hex and ascii\n"
 	"  -R, --raw                  Raw mode\n"
 	"  -C, --cmtp=psm             PSM for CMTP\n"
 	"  -H, --hcrp=psm             PSM for HCRP\n"
@@ -352,8 +353,9 @@ static struct option main_options[] = {
 	{ "save-dump",	1, 0, 'w' },
 	{ "read-dump",	1, 0, 'r' },
 	{ "ts",		0, 0, 't' },
-	{ "hex",	0, 0, 'x' },
 	{ "ascii",	0, 0, 'a' },
+	{ "hex",	0, 0, 'x' },
+	{ "ext",	0, 0, 'X' },
 	{ "raw",	0, 0, 'R' },
 	{ "cmtp",	1, 0, 'C' },
 	{ "hcrp",	1, 0, 'H' },
@@ -367,7 +369,7 @@ int main(int argc, char *argv[])
 
 	printf("HCIDump - HCI packet analyzer ver %s\n", VERSION);
 
-	while ((opt=getopt_long(argc, argv, "i:s:p:w:r:txaRC:H:h", main_options, NULL)) != -1) {
+	while ((opt=getopt_long(argc, argv, "i:s:p:w:r:taxXRC:H:h", main_options, NULL)) != -1) {
 		switch(opt) {
 		case 'i':
 			device = atoi(optarg + 3);
@@ -395,12 +397,16 @@ int main(int argc, char *argv[])
 			flags |= DUMP_TSTAMP;
 			break;
 
+		case 'a': 
+			flags |= DUMP_ASCII;
+			break;
+
 		case 'x':
 			flags |= DUMP_HEX;
 			break;
 
-		case 'a': 
-			flags |= DUMP_ASCII;
+		case 'X':
+			flags |= DUMP_EXT;
 			break;
 
 		case 'R': 
diff --git a/tools/parser/parser.c b/tools/parser/parser.c
index 008b8b5..4863bb0 100644
--- a/tools/parser/parser.c
+++ b/tools/parser/parser.c
@@ -97,10 +97,10 @@ uint32_t get_proto(uint16_t handle, uint16_t psm)
 	return (pos < 0) ? 0 : proto_table[pos].proto;
 }
 
-void hex_dump(int level, struct frame *frm, int num)
+void ascii_dump(int level, struct frame *frm, int num)
 {
 	unsigned char *buf = frm->ptr;
-	register int i,n;
+	register int i, n;
 
 	if ((num < 0) || (num > frm->len))
 		num = frm->len;
@@ -108,20 +108,20 @@ void hex_dump(int level, struct frame *frm, int num)
 	for (i = 0, n = 1; i < num; i++, n++) {
 		if (n == 1)
 			p_indent(level, frm);
-		printf("%2.2X ", buf[i]);
+		printf("%1c ", isprint(buf[i]) ? buf[i] : '.');
 		if (n == DUMP_WIDTH) {
 			printf("\n");
 			n = 0;
 		}
 	}
-	if (i && n!=1)
+	if (i && n != 1)
 		printf("\n");
 }
 
-void ascii_dump(int level, struct frame *frm, int num)
+void hex_dump(int level, struct frame *frm, int num)
 {
 	unsigned char *buf = frm->ptr;
-	register int i,n;
+	register int i, n;
 
 	if ((num < 0) || (num > frm->len))
 		num = frm->len;
@@ -129,16 +129,46 @@ void ascii_dump(int level, struct frame *frm, int num)
 	for (i = 0, n = 1; i < num; i++, n++) {
 		if (n == 1)
 			p_indent(level, frm);
-		printf("%1c ", isprint(buf[i]) ? buf[i] : '.');
+		printf("%2.2X ", buf[i]);
 		if (n == DUMP_WIDTH) {
 			printf("\n");
 			n = 0;
 		}
 	}
-	if (i && n!=1)
+	if (i && n != 1)
 		printf("\n");
 }
 
+void ext_dump(int level, struct frame *frm, int num)
+{
+	unsigned char *buf = frm->ptr;
+	register int i, n = 0, size;
+
+	if ((num < 0) || (num > frm->len))
+		num = frm->len;
+
+	while (num > 0) {
+		p_indent(level, frm);
+		printf("%04x: ", n);
+
+		size = num > 16 ? 16 : num;
+
+		for (i = 0; i < size; i++)
+			printf("%02x ", buf[i]);
+		for (i = 0; i < 16 - size; i++)
+			printf("   ");
+		printf("  ");
+
+		for (i = 0; i < size; i++)
+			printf("%1c", isprint(buf[i]) ? buf[i] : '.');
+		printf("\n");
+
+		buf  += size;
+		num  -= size;
+		n    += size;
+	}
+}
+
 void raw_ndump(int level, struct frame *frm, int num)
 {
 	if (!frm->len)
@@ -153,6 +183,9 @@ void raw_ndump(int level, struct frame *frm, int num)
 		hex_dump(level, frm, num);
 		break;
 
+	case DUMP_EXT:
+		ext_dump(level, frm, num);
+		break;
 	}
 }
 
diff --git a/tools/parser/parser.h b/tools/parser/parser.h
index e95a209..ba16ee9 100644
--- a/tools/parser/parser.h
+++ b/tools/parser/parser.h
@@ -44,11 +44,12 @@ struct frame {
 /* Parser flags */
 #define DUMP_WIDTH	20
 
-#define DUMP_HEX	0x01
-#define DUMP_ASCII	0x02
-#define DUMP_TYPE_MASK	(DUMP_HEX | DUMP_ASCII)
-#define DUMP_TSTAMP	0x04
+#define DUMP_ASCII	0x01
+#define DUMP_HEX	0x02
+#define DUMP_EXT	0x04
 #define DUMP_RAW	0x08
+#define DUMP_TSTAMP	0x10
+#define DUMP_TYPE_MASK	(DUMP_ASCII | DUMP_HEX | DUMP_EXT)
 
 /* Parser filter */
 #define FILT_HCI	0x0001
@@ -156,6 +157,7 @@ uint32_t get_proto(uint16_t handle, uint16_t psm);
 
 void ascii_dump(int level, struct frame *frm, int num);
 void hex_dump(int level, struct frame *frm, int num);
+void ext_dump(int level, struct frame *frm, int num);
 void raw_dump(int level, struct frame *frm);
 void raw_ndump(int level, struct frame *frm, int num);