diff --git a/tools/hcidump.c b/tools/hcidump.c
index cf6003e..3977308 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
" -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"
{ "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' },
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);
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
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;
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;
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)
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
/* 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
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);