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 9E0B8459B0; Tue, 17 Sep 2024 05:32:02 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AB090402CF; Tue, 17 Sep 2024 05:31:36 +0200 (CEST) Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) by mails.dpdk.org (Postfix) with ESMTP id D7971402C0 for ; Tue, 17 Sep 2024 05:31:31 +0200 (CEST) Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-20696938f86so41908375ad.3 for ; Mon, 16 Sep 2024 20:31:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1726543891; x=1727148691; 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=QTjPDP1Gko84z0Rh5gbgEAadfclbotJyIHslSFcB3iScPA+mB3co4HKlsHAqjuSGCr +pY1qwc9A7aazD4QCQUumgsyPdtukq/zogwu+8A9CpGA4vFnAFD3hfd//JWV8Wi77LWG JjAa+FAtWCkY1UzJEbriLXHXliBM6IHrIF/85q52gnDbHUt18MAjEqpBA1uHfBQUI0cQ xSEZTOwI1WIIBcTDaS1ohdwKvb9vAfLVt2a0qpswtmmIF7WUtUvo7GgQExdipS+XBMwG xUVBYZh6V+a+ks4erC4iKBxiY8na+FBqUs1U23FwcorSOgGNgIeL6xfg/2FNfNrO6yTc pJFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726543891; x=1727148691; 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=BOOeG/3AIRekxJ1zxlZgeezStFp1xkX4224KE5ODfaf8oDkhe/b19rNwjE/S6UnOhu EquGbQj4J02hd4hSYkei0mY5D58+ZukLfnBEb/PtuoYygYjuX27/R01guS2cABrrBr8T GTjD/GPAfwndHgNPTN0JoCdcmd70G7lDR9fZECRk67IaSmK2l8KKZ75z4tvBvFbL2TKC GH6zGme7f7f/Tf4bmbaaiH/4fKDmOG0js29M1MPrQEg8jRF9KY6aGd9IbIk0eCIt7orS djAyA4EhDgk0P3zl9LKy4B2j0aCK3gFJbtu2yjQNINtmf3RsDWrTPJw+XRiFfLIa47gC GxjA== X-Gm-Message-State: AOJu0YxJ37Kx5K7mdFbBRTIlbPRMcsldbk1YHUXqK1fuxiTNc5MDjfAE 4OitBmag+8kBEK4ZfLg15oN5OzCTJYDlaKEuel7+yvTJ6FHTchnxwDjPbk3hVTnwJZ9rqmF1Spc U X-Google-Smtp-Source: AGHT+IHwq2vGToan3Q985LaITn4VTUWbt94f+epzXjE6T1wEuoDsTSRmySHmIwI9fxKe6x1YAh7PSQ== X-Received: by 2002:a17:902:c411:b0:206:b7b8:1f0e with SMTP id d9443c01a7336-2076e319544mr257740825ad.1.1726543890985; Mon, 16 Sep 2024 20:31:30 -0700 (PDT) Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2079473d05dsm42647735ad.287.2024.09.16.20.31.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Sep 2024 20:31:30 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger , Aman Singh Subject: [PATCH v8 4/7] test-pmd: add option to redirect packet log Date: Mon, 16 Sep 2024 20:28:01 -0700 Message-ID: <20240917033117.66346-5-stephen@networkplumber.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240917033117.66346-1-stephen@networkplumber.org> References: <20240312220129.70667-1-stephen@networkplumber.org> <20240917033117.66346-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