From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 05B8E45A50; Sat, 28 Sep 2024 18:21:25 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2A09140613; Sat, 28 Sep 2024 18:20:55 +0200 (CEST) Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) by mails.dpdk.org (Postfix) with ESMTP id 5EE5B402C8 for ; Sat, 28 Sep 2024 18:20:50 +0200 (CEST) Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-718f4fd89e5so2814684b3a.0 for ; Sat, 28 Sep 2024 09:20:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1727540449; x=1728145249; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=O6Xx/H0JwscimkFLB8e/6q8o2cT/mQLbTHMXxbBoTU8=; b=ek2jYrvRk7zShY+F2eaE6CfiRhTJ44Qrfjq2XAT+LQOnsueA1DvjYSNZRDfFual7EL Xv6MrFRpjMW2904Z3lV5AD6LeKH6zTXkvPMLFKzIszSQJd6ac/5Z558/5T92dK62KcAC Mrys5hd+EF/iTtSsoTQSKdgIh31tegXI6Dr1CfpzKeC/bB5mZudEXTB6CDMLMa+zXQ0a w9AGNqgdxUWIvOyxEGdRd0g8bdCs8SKczp+kvu9LTil/MA2r2IJMrim1I2xthxZl5uaL HBBlZupofMPWqTE+W/BPC3RAeSOiX8FQAMn5u+Du69BYRPWGslmgT54lq9O1xPeInRNj bqow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727540449; x=1728145249; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=O6Xx/H0JwscimkFLB8e/6q8o2cT/mQLbTHMXxbBoTU8=; b=XG7nsNyFQiOc6z56lOugNbZoYO1y7Nd789rZcfxbTZmYTkImhwykvh453zQxuyzLO1 KcPP6yvsl2oVjzxubIuTrvzxJekh972Hv1xZJSy6gEGGmLBqY7ZX8FJTKOrtVi0DFNjt jmEjOgVnFcAmXZWUsrK2E47Nqnl/8s8cXF7UridJGPZBbn+cAep1WNHnKP7RiN2oWUf0 BcuM/uDLqyisrQXxt8+y6ADYrExqEzvRCsXDdJrjUfa2/CXlNqq21Q5t33lfe4W018df qmLBZDzXCjRdjjnh8xzPxc78kRZ6bb2eV7AC5MHQzPceyvbOC+R4kdziStfrjb0kwMs+ /WqQ== X-Gm-Message-State: AOJu0Yziohs5X/9xgf7kw52v3UGtxI6xmRbsmxdKFXskrNAQw/8T3aF9 SOjvud0sCqgmWwmHgtAxhMSuNduVIwKfq96yCK4RW/EH1kYt4s0UKO0kaWnT5awCccOMcwpliZg u X-Google-Smtp-Source: AGHT+IHfBRYiFt1PYdYL2qLUeK73YQ2AYkQMVfLiV7bBdiqCakgiIU/lJtu8EwDwqpVrDYLgn5lPsQ== X-Received: by 2002:a05:6a00:3cce:b0:714:2533:1b82 with SMTP id d2e1a72fcca58-71b260776d3mr12227639b3a.23.1727540449460; Sat, 28 Sep 2024 09:20:49 -0700 (PDT) Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7e6db2b9407sm2969107a12.23.2024.09.28.09.20.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Sep 2024 09:20:48 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger , Aman Singh Subject: [PATCH v9 5/8] test-pmd: add option to redirect packet log Date: Sat, 28 Sep 2024 09:18:35 -0700 Message-ID: <20240928162035.849326-6-stephen@networkplumber.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240928162035.849326-1-stephen@networkplumber.org> References: <20240312220129.70667-1-stephen@networkplumber.org> <20240928162035.849326-1-stephen@networkplumber.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org When running tests in interactive mode, it is useful to be able to redirect the packet decode (verbose output) into a file. Signed-off-by: Stephen Hemminger --- app/test-pmd/cmdline.c | 41 +++++++++++++++++++++ app/test-pmd/config.c | 23 ++++++++++++ app/test-pmd/testpmd.c | 3 ++ app/test-pmd/testpmd.h | 3 ++ app/test-pmd/util.c | 11 +++++- doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 ++++ 6 files changed, 86 insertions(+), 2 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index b7759e38a8..7c6ab191de 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -302,6 +302,9 @@ static void cmd_help_long_parsed(void *parsed_result, "set verbose (level)\n" " Set the debug verbosity level X.\n\n" + "set output (filename)\n" + " Set the packet debug log file\n\n" + "set log global|(type) (level)\n" " Set the log level.\n\n" @@ -3853,6 +3856,43 @@ static cmdline_parse_inst_t cmd_set_numbers = { }, }; + +/* *** SET OUTPUT FILENAME *** */ +struct cmd_set_output_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t output; + cmdline_fixed_string_t filename; +}; + +static void +cmd_set_output_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_output_result *res = parsed_result; + + set_output_file(res->filename); +} + +static cmdline_parse_token_string_t cmd_set_output_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_output_result, set, "set"); +static cmdline_parse_token_string_t cmd_set_output_output = + TOKEN_STRING_INITIALIZER(struct cmd_set_output_result, output, "output"); +static cmdline_parse_token_string_t cmd_set_output_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_output_result, filename, NULL); + +static cmdline_parse_inst_t cmd_set_output = { + .f = cmd_set_output_parsed, + .data = NULL, + .help_str = "set output ", + .tokens = { + (void *)&cmd_set_output_set, + (void *)&cmd_set_output_output, + (void *)&cmd_set_output_name, + NULL, + }, +}; + /* *** SET LOG LEVEL CONFIGURATION *** */ struct cmd_set_log_result { @@ -13166,6 +13206,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = { (cmdline_parse_inst_t *)&cmd_reset, (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_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 6f0beafa27..bfc5a1898b 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -6268,6 +6268,29 @@ set_verbose_level(uint16_t vb_level) configure_rxtx_dump_callbacks(verbose_level); } +void +set_output_file(const char *filename) +{ + FILE *outf, *oldf; + + if (!strcmp(filename, "-")) { + outf = stdout; + } else { + outf = fopen(filename, "a"); + if (outf == NULL) { + perror(filename); + return; + } + } + + oldf = rte_atomic_exchange_explicit(&output_file, outf, rte_memory_order_seq_cst); + if (oldf != NULL && oldf != stdout) { + /* make sure other threads are not mid print */ + rte_delay_us_sleep(US_PER_S/10); + fclose(oldf); + } +} + void vlan_extend_set(portid_t port_id, int on) { diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index b1401136e4..7790ba6ce0 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -99,6 +99,7 @@ #define EXTBUF_ZONE_SIZE (RTE_PGSIZE_2M - 4 * RTE_CACHE_LINE_SIZE) uint16_t verbose_level = 0; /**< Silent by default. */ +RTE_ATOMIC(FILE *) output_file; /**< log to console by default. */ int testpmd_logtype; /**< Log type for testpmd logs */ /* use main core for command line ? */ @@ -4543,6 +4544,8 @@ main(int argc, char** argv) rte_exit(EXIT_FAILURE, "Cannot register log type"); rte_log_set_level(testpmd_logtype, RTE_LOG_DEBUG); + output_file = stdout; + diag = rte_eal_init(argc, argv); if (diag < 0) rte_exit(EXIT_FAILURE, "Cannot init EAL: %s\n", diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 9facd7f281..d92cb743dd 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -493,6 +494,7 @@ extern uint8_t xstats_hide_zero; /**< Hide zero values for xstats display */ 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 int testpmd_logtype; /**< Log type for testpmd logs */ extern uint8_t interactive; extern uint8_t auto_start; @@ -1102,6 +1104,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_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); void show_rx_pkt_hdrs(void); diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c index bf9b639d95..2446687090 100644 --- a/app/test-pmd/util.c +++ b/app/test-pmd/util.c @@ -89,9 +89,15 @@ 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, "port %u/queue %u: %s %u packets\n", port_id, queue, @@ -292,11 +298,12 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], MKDUMPSTR(print_buf, buf_size, cur_len, "INVALID mbuf: %s\n", reason); if (cur_len >= buf_size) - printf("%s ...\n", print_buf); + fprintf(outf, "%s ...\n", print_buf); else - printf("%s", print_buf); + fprintf(outf, "%s", print_buf); cur_len = 0; } + fflush(outf); } uint16_t diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index f00ab07605..579432e5c7 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -665,6 +665,13 @@ Reset forwarding to the default configuration:: testpmd> set default +set output +~~~~~~~~~~ + +Redirect the debug log:: + + testpmd> set output /tmp/packet.log + set verbose ~~~~~~~~~~~ -- 2.45.2