diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2013-05-02 16:28:46 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2013-05-02 16:31:23 +0200 |
commit | ec9690921c1b001d1c6307f04495606176ef89c7 (patch) | |
tree | 06e97343d4ed98381738f819c07c6241b7d37b34 | |
parent | 6e0c47e5c0bb995f58d9c13bf8f4405387ada8b3 (diff) | |
download | neard-ec9690921c1b001d1c6307f04495606176ef89c7.tar.gz neard-ec9690921c1b001d1c6307f04495606176ef89c7.tar.bz2 neard-ec9690921c1b001d1c6307f04495606176ef89c7.zip |
nfctool: sniffer: Color LLCP dumps
-rw-r--r-- | tools/nfctool/display.h | 8 | ||||
-rw-r--r-- | tools/nfctool/llcp-decode.c | 108 | ||||
-rw-r--r-- | tools/nfctool/nfctool.h | 4 |
3 files changed, 73 insertions, 47 deletions
diff --git a/tools/nfctool/display.h b/tools/nfctool/display.h index 21722d8..742eaea 100644 --- a/tools/nfctool/display.h +++ b/tools/nfctool/display.h @@ -46,4 +46,12 @@ do { \ use_color() ? COLOR_OFF : ""); \ } while (0) +#define print_indent_prefix(indent, color1, prefix, color2, fmt, args...) \ +do { \ + printf("%*c%s%s%s" fmt "%s\n", (indent), ' ', \ + use_color() ? (color1) : "", prefix, \ + use_color() ? (color2) : "", ## args, \ + use_color() ? COLOR_OFF : ""); \ +} while (0) + int num_columns(void); diff --git a/tools/nfctool/llcp-decode.c b/tools/nfctool/llcp-decode.c index 34530dd..faeeee1 100644 --- a/tools/nfctool/llcp-decode.c +++ b/tools/nfctool/llcp-decode.c @@ -139,6 +139,16 @@ static const gchar *llcp_param_str[] = { "Service Discovery Response" }; +#define llcp_printf_header(prefix, color, fmt, ...) print_indent_prefix(LLCP_HEADER_INDENT, \ + color, prefix, \ + LLCP_COLOR, fmt, ## __VA_ARGS__) + +#define llcp_printf_msg(fmt, ...) print_indent(LLCP_MSG_INDENT, \ + LLCP_COLOR, fmt, ## __VA_ARGS__) + +#define llcp_printf_error(fmt, ...) print_indent(LLCP_MSG_INDENT, \ + COLOR_ERROR, fmt, ## __VA_ARGS__) + #define llcp_get_param_str(param_type) llcp_param_str[param_type] #define llcp_get_param_len(param_type) llcp_param_length[param_type] @@ -155,14 +165,14 @@ static void llcp_print_params(struct sniffer_packet *packet) guint32 rmng; guint8 *param; guint8 param_len; - gchar *sn; + gchar *sn, param_str[64]; while (packet->llcp.data_len - offset >= 3) { param = packet->llcp.data + offset; rmng = packet->llcp.data_len - offset; if (param[0] < LLCP_PARAM_MIN || param[0] > LLCP_PARAM_MAX) { - print_error("Error decoding params"); + llcp_printf_error("Error decoding params"); return; } @@ -172,60 +182,59 @@ static void llcp_print_params(struct sniffer_packet *packet) param_len = param[1]; if (param_len != param[1] || rmng < 2u + param_len) { - print_error("Error decoding params"); + llcp_printf_error("Error decoding params"); return; } - printf(" %s: ", llcp_get_param_str(param[0])); - switch ((enum llcp_param_t)param[0]) { case LLCP_PARAM_VERSION: major = (param[2] & 0xF0) >> 4; minor = param[2] & 0x0F; - printf("%d.%d", major, minor); + sprintf(param_str, "%d.%d", major, minor); break; case LLCP_PARAM_MIUX: miux = ((param[2] & 0x07) << 8) | param[3]; - printf("%d", miux); + sprintf(param_str, "%d", miux); break; case LLCP_PARAM_WKS: wks = (param[2] << 8) | param[3]; - printf("0x%02hX", wks); + sprintf(param_str, "0x%02hX", wks); break; case LLCP_PARAM_LTO: - printf("%d", param[2]); + sprintf(param_str, "%d", param[2]); break; case LLCP_PARAM_RW: - printf("%d", param[2] & 0x0F); + sprintf(param_str, "%d", param[2] & 0x0F); break; case LLCP_PARAM_SN: sn = g_strndup((gchar *)param + 2, param_len); - printf("%s", sn); + sprintf(param_str, "%s", sn); g_free(sn); break; case LLCP_PARAM_OPT: - printf("0x%X", param[2] & 0x03); + sprintf(param_str, "0x%X", param[2] & 0x03); break; case LLCP_PARAM_SDREQ: tid = param[2]; sn = g_strndup((gchar *)param + 3, param_len - 1); - printf("TID:%d, SN:%s", tid, sn); + sprintf(param_str, "TID:%d, SN:%s", tid, sn); g_free(sn); break; case LLCP_PARAM_SDRES: - printf("TID:%d, SAP:%d", param[2], param[3] & 0x3F); + sprintf(param_str, "TID:%d, SAP:%d", param[2], param[3] & 0x3F); break; } - printf("\n"); + llcp_printf_msg("%s: %s", llcp_get_param_str(param[0]), + param_str); offset += 2 + param_len; } @@ -277,8 +286,8 @@ static int llcp_decode_packet(guint8 *data, guint32 data_len, static void llcp_print_sequence(struct sniffer_packet *packet) { - printf(" N(S):%d N(R):%d\n", - packet->llcp.send_seq, packet->llcp.recv_seq); + llcp_printf_msg("N(S):%d N(R):%d", + packet->llcp.send_seq, packet->llcp.recv_seq); } static int llcp_print_agf(struct sniffer_packet *packet, @@ -292,7 +301,7 @@ static int llcp_print_agf(struct sniffer_packet *packet, int err; if (packet->llcp.data_len < 2) { - print_error("Error parsing AGF PDU"); + llcp_printf_error("Error parsing AGF PDU"); return -EINVAL; } @@ -310,7 +319,7 @@ static int llcp_print_agf(struct sniffer_packet *packet, offset += 2; if (size == 0 || offset + size > packet->llcp.data_len) { - print_error("Error parsing AGF PDU"); + llcp_printf_error("Error parsing AGF PDU"); err = -EINVAL; goto exit; } @@ -326,14 +335,14 @@ static int llcp_print_agf(struct sniffer_packet *packet, memcpy(pdu + NFC_LLCP_RAW_HEADER_SIZE, packet->llcp.data + offset, size); - printf("-- AGF LLC PDU %02u:\n", count++); + llcp_printf_msg("-- AGF LLC PDU %02u:", count++); llcp_print_pdu(pdu, size + NFC_LLCP_RAW_HEADER_SIZE, timestamp); offset += size; } - printf("-- End of AGF LLC PDUs\n"); + llcp_printf_msg("-- End of AGF LLC PDUs\n"); err = 0; exit: @@ -385,7 +394,7 @@ static int llcp_print_dm(struct sniffer_packet *packet) break; } - printf(" Reason: %d (%s)\n", packet->llcp.data[0], reason); + llcp_printf_msg("Reason: %d (%s)", packet->llcp.data[0], reason); return 0; } @@ -400,38 +409,38 @@ static int llcp_print_i(struct sniffer_packet *packet) err = snep_print_pdu(packet); if (err != 0) - printf(" Error decoding SNEP frame\n"); + llcp_printf_error("Error decoding SNEP frame"); return err; } sniffer_print_hexdump(stdout, packet->llcp.data, packet->llcp.data_len, - 2, TRUE); + LLCP_MSG_INDENT, TRUE); return 0; } static int llcp_print_frmr(struct sniffer_packet *packet) { - guint8 val; + guint8 info, ptype; if (packet->llcp.data_len != 4) return -EINVAL; - val = packet->llcp.data[0]; - printf("W:%d ", (val & 0x80) >> 7); - printf("I:%d ", (val & 0x40) >> 6); - printf("R:%d ", (val & 0x20) >> 5); - printf("S:%d ", (val & 0x10) >> 4); - val = val & 0x0F; - if (val >= ARRAY_SIZE(llcp_ptype_str)) - val = ARRAY_SIZE(llcp_ptype_str) - 1; - printf("PTYPE:%s ", llcp_ptype_short_str[val]); - printf("SEQ: %d ", packet->llcp.data[1]); - printf("V(S): %d ", (packet->llcp.data[2] & 0xF0) >> 4); - printf("V(R): %d ", packet->llcp.data[2] & 0x0F); - printf("V(SA): %d ", (packet->llcp.data[3] & 0xF0) >> 4); - printf("V(RA): %d\n", packet->llcp.data[3] & 0x0F); + info = packet->llcp.data[0]; + ptype = info & 0x0F; + if (ptype >= ARRAY_SIZE(llcp_ptype_str)) + ptype = ARRAY_SIZE(llcp_ptype_str) - 1; + + llcp_printf_msg("W:%d I:%d R:%d S:%d PTYPE:%s SEQ: %d V(S):" + " %d V(R): %d V(SA): %d V(RA): %d", + (info & 0x80) >> 7, (info & 0x40) >> 6, + (info & 0x20) >> 5, (info & 0x10) >> 4, + llcp_ptype_short_str[ptype], packet->llcp.data[1], + (packet->llcp.data[2] & 0xF0) >> 4, + packet->llcp.data[2] & 0x0F, + (packet->llcp.data[3] & 0xF0) >> 4, + packet->llcp.data[3] & 0x0F); return 0; } @@ -441,6 +450,7 @@ int llcp_print_pdu(guint8 *data, guint32 data_len, struct timeval *timestamp) struct timeval msg_timestamp; struct sniffer_packet packet; gchar *direction_str, time_str[32]; + gchar *direction_color; int err; if (timestamp == NULL) @@ -456,16 +466,18 @@ int llcp_print_pdu(guint8 *data, guint32 data_len, struct timeval *timestamp) if (!opts.dump_symm && packet.llcp.ptype == LLCP_PTYPE_SYMM) return 0; - if (packet.direction == NFC_LLCP_DIRECTION_RX) + if (packet.direction == NFC_LLCP_DIRECTION_RX) { direction_str = ">>"; - else + direction_color = COLOR_RED; + } else { direction_str = "<<"; + direction_color = COLOR_GREEN; + } if (opts.show_timestamp != SNIFFER_SHOW_TIMESTAMP_NONE) { char prefix = ' '; if (opts.show_timestamp == SNIFFER_SHOW_TIMESTAMP_ABS) { - printf("ABSOLUTE\n"); msg_timestamp = *timestamp; } else { timersub(timestamp, &start_timestamp, &msg_timestamp); @@ -476,11 +488,12 @@ int llcp_print_pdu(guint8 *data, guint32 data_len, struct timeval *timestamp) msg_timestamp.tv_usec); } - printf("%s nfc%d: local:0x%02x remote:0x%02x %s\n", - direction_str, packet.adapter_idx, - packet.llcp.local_sap, packet.llcp.remote_sap, time_str); + llcp_printf_header(direction_str, direction_color, + " nfc%d: local:0x%02x remote:0x%02x %s", + packet.adapter_idx, packet.llcp.local_sap, + packet.llcp.remote_sap, time_str); - printf(" %s\n", llcp_ptype_str[packet.llcp.ptype]); + llcp_printf_msg("%s", llcp_ptype_str[packet.llcp.ptype]); switch (packet.llcp.ptype) { case LLCP_PTYPE_AGF: @@ -513,7 +526,8 @@ int llcp_print_pdu(guint8 *data, guint32 data_len, struct timeval *timestamp) default: sniffer_print_hexdump(stdout, packet.llcp.data, - packet.llcp.data_len, 2, TRUE); + packet.llcp.data_len, + LLCP_MSG_INDENT, TRUE); break; } diff --git a/tools/nfctool/nfctool.h b/tools/nfctool/nfctool.h index 1f9895b..9c4cf60 100644 --- a/tools/nfctool/nfctool.h +++ b/tools/nfctool/nfctool.h @@ -30,6 +30,10 @@ #define DBG(fmt, ...) #endif +#define LLCP_COLOR COLOR_CYAN +#define LLCP_HEADER_INDENT 0 +#define LLCP_MSG_INDENT 4 + #define SNEP_COLOR COLOR_YELLOW #define SNEP_HEADER_INDENT 4 #define SNEP_MSG_INDENT 6 |