This adds new command:
   testpmd> set format hex
which decodes packet in hex.

Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
---
 app/test-pmd/cmdline.c                      | 40 +++++++++++++++
 app/test-pmd/config.c                       | 11 +++++
 app/test-pmd/testpmd.c                      |  1 +
 app/test-pmd/testpmd.h                      |  7 +++
 app/test-pmd/util.c                         | 54 ++++++++++++++++-----
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 13 +++++
 6 files changed, 115 insertions(+), 11 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 7c6ab191de..37cce4868e 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -305,6 +305,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set output (filename)\n"
                        "    Set the packet debug log file\n\n"
 
+                       "set format (verbose|hex)\n"
+                       "    Set the format of packet log\\n"
+
                        "set log global|(type) (level)\n"
                        "    Set the log level.\n\n"
 
@@ -3893,6 +3896,42 @@ static cmdline_parse_inst_t cmd_set_output = {
        },
 };
 
+/* *** SET FORMAT OF PACKET LOG */
+struct cmd_set_format_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t format;
+       cmdline_fixed_string_t value;
+};
+
+static void
+cmd_set_format_parsed(void *parsed_result,
+                     __rte_unused struct cmdline *cl,
+                     __rte_unused void *data)
+{
+       struct cmd_set_format_result *res = parsed_result;
+
+       set_output_format(res->value);
+}
+
+static cmdline_parse_token_string_t cmd_set_format_set =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_format_result, set, "set");
+static cmdline_parse_token_string_t cmd_set_format_output =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_format_result, format, 
"format");
+static cmdline_parse_token_string_t cmd_set_format_value =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_format_result, value, 
"verbose#hex");
+
+static cmdline_parse_inst_t cmd_set_format = {
+       .f = cmd_set_format_parsed,
+       .data = NULL,
+       .help_str = "set format verbose|hex",
+       .tokens = {
+               (void *)&cmd_set_format_set,
+               (void *)&cmd_set_format_output,
+               (void *)&cmd_set_format_value,
+               NULL,
+       },
+};
+
 /* *** SET LOG LEVEL CONFIGURATION *** */
 
 struct cmd_set_log_result {
@@ -13207,6 +13246,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_numbers,
        (cmdline_parse_inst_t *)&cmd_set_log,
        (cmdline_parse_inst_t *)&cmd_set_output,
+       (cmdline_parse_inst_t *)&cmd_set_format,
        (cmdline_parse_inst_t *)&cmd_set_rxoffs,
        (cmdline_parse_inst_t *)&cmd_set_rxpkts,
        (cmdline_parse_inst_t *)&cmd_set_rxhdrs,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index bfc5a1898b..f30bdfc7ff 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -6268,6 +6268,17 @@ set_verbose_level(uint16_t vb_level)
        configure_rxtx_dump_callbacks(verbose_level);
 }
 
+void
+set_output_format(const char *mode)
+{
+       if (!strcmp(mode, "verbose"))
+               output_format = OUTPUT_MODE_VERBOSE;
+       else if (!strcmp(mode, "hex"))
+               output_format = OUTPUT_MODE_HEX;
+       else
+               fprintf(stderr, "Unknown output format '%s'\n", mode);
+}
+
 void
 set_output_file(const char *filename)
 {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 7790ba6ce0..f4fd51e46f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -100,6 +100,7 @@
 
 uint16_t verbose_level = 0; /**< Silent by default. */
 RTE_ATOMIC(FILE *) output_file; /**< log to console by default. */
+enum output_mode output_format; /**< default to original mode. */
 int testpmd_logtype; /**< Log type for testpmd logs */
 
 /* use main core for command line ? */
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index d92cb743dd..94e8f59ef0 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -488,6 +488,11 @@ enum dcb_mode_enable
        DCB_ENABLED
 };
 
+enum output_mode {
+       OUTPUT_MODE_VERBOSE = 0,
+       OUTPUT_MODE_HEX,
+};
+
 extern uint8_t xstats_hide_zero; /**< Hide zero values for xstats display */
 
 /* globals used for configuration */
@@ -495,6 +500,7 @@ extern uint8_t record_core_cycles; /**< Enables measurement 
of CPU cycles */
 extern uint8_t record_burst_stats; /**< Enables display of RX and TX bursts */
 extern uint16_t verbose_level; /**< Drives messages being displayed, if any. */
 extern RTE_ATOMIC(FILE *) output_file; /**< Where packet data is written */
+extern enum output_mode output_format; /**< Format of packet decode */
 extern int testpmd_logtype; /**< Log type for testpmd logs */
 extern uint8_t  interactive;
 extern uint8_t  auto_start;
@@ -1104,6 +1110,7 @@ void set_xstats_hide_zero(uint8_t on_off);
 void set_record_core_cycles(uint8_t on_off);
 void set_record_burst_stats(uint8_t on_off);
 void set_verbose_level(uint16_t vb_level);
+void set_output_format(const char *mode);
 void set_output_file(const char *filename);
 void set_rx_pkt_segments(unsigned int *seg_lengths, unsigned int nb_segs);
 void set_rx_pkt_hdrs(unsigned int *seg_protos, unsigned int nb_segs);
diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c
index 2446687090..130821fddb 100644
--- a/app/test-pmd/util.c
+++ b/app/test-pmd/util.c
@@ -16,6 +16,7 @@
 #include "testpmd.h"
 
 #define MAX_STRING_LEN 8192
+#define MAX_DUMP_LEN   1024
 
 #define MKDUMPSTR(buf, buf_size, cur_len, ...) \
 do { \
@@ -67,9 +68,9 @@ get_timestamp(const struct rte_mbuf *mbuf)
                        timestamp_dynfield_offset, rte_mbuf_timestamp_t *);
 }
 
-static inline void
-dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
-             uint16_t nb_pkts, int is_rx)
+static void
+dump_pkt_verbose(FILE *outf, uint16_t port_id, uint16_t queue,
+                struct rte_mbuf *pkts[], uint16_t nb_pkts, int is_rx)
 {
        struct rte_mbuf  *mb;
        const struct rte_ether_hdr *eth_hdr;
@@ -89,14 +90,6 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct 
rte_mbuf *pkts[],
        size_t buf_size = MAX_STRING_LEN;
        size_t cur_len = 0;
        uint64_t restore_info_dynflag;
-       FILE *outf;
-
-       if (!nb_pkts)
-               return;
-
-       outf = rte_atomic_load_explicit(&output_file, rte_memory_order_relaxed);
-       if (!outf)
-               return;
 
        restore_info_dynflag = rte_flow_restore_info_dynflag();
        MKDUMPSTR(print_buf, buf_size, cur_len,
@@ -303,6 +296,45 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct 
rte_mbuf *pkts[],
                        fprintf(outf, "%s", print_buf);
                cur_len = 0;
        }
+}
+
+static void
+dump_pkt_hex(FILE *outf, uint16_t port_id, uint16_t queue,
+            struct rte_mbuf *pkts[], uint16_t nb_pkts, int is_rx)
+{
+       fprintf(outf, "port %u/queue %u: %s %u packets\n", port_id, queue,
+                 is_rx ? "received" : "sent", (unsigned int) nb_pkts);
+
+       for (uint16_t i = 0; i < nb_pkts; i++) {
+               rte_pktmbuf_dump(outf, pkts[i], MAX_DUMP_LEN);
+               fprintf(outf, "\n");
+       }
+}
+
+
+static void
+dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
+             uint16_t nb_pkts, int is_rx)
+{
+       FILE *outf;
+
+       if (!nb_pkts)
+               return;
+
+       outf = rte_atomic_load_explicit(&output_file, rte_memory_order_relaxed);
+       if (unlikely(!outf))
+               return;
+
+       switch (output_format) {
+       case OUTPUT_MODE_VERBOSE:
+               dump_pkt_verbose(outf, port_id, queue, pkts, nb_pkts, is_rx);
+               return;
+       case OUTPUT_MODE_HEX:
+               dump_pkt_hex(outf, port_id, queue, pkts, nb_pkts, is_rx);
+               break;
+       default:
+               return;
+       }
        fflush(outf);
 }
 
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 579432e5c7..9406af3225 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -672,6 +672,19 @@ Redirect the debug log::
 
   testpmd> set output /tmp/packet.log
 
+set format
+~~~~~~~~~~
+
+Chose the output format for packet debug log::
+
+   testpmd> set format verbose|hex
+
+Available formats are:
+
+* ``verbose`` print the packet meta data information
+* ``hex`` print the mbuf flags and data in hex
+
+
 set verbose
 ~~~~~~~~~~~
 
-- 
2.45.2

Reply via email to