From patchwork Thu Mar 14 09:17:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 138366 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B83C543CB2; Thu, 14 Mar 2024 10:17:25 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A6ACA42E48; Thu, 14 Mar 2024 10:17:25 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 5AFF342E37 for ; Thu, 14 Mar 2024 10:17:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1710407844; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sEFUCO/F42NtY/vP4wZercjn+NcEQ/Q6WU0dpOHJWOA=; b=Jb0dEwXN6vl9cIR8bV1zcjjYO18mEhsmmxCkuz8nJlj+A44LZXAwqMBWcjY/ovm8C88jab CCjnhhqgC8pRPiKsvssZ79VM8QBM/7rZrAK9jL4Y+VMswvX92jyDajLdJyC6Z8xDqfbIia 9gkJwU/laDvPKnaSz83kyITV1xhIGss= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-646-A32ry_C0NdCTmqw2m6L3Kw-1; Thu, 14 Mar 2024 05:17:18 -0400 X-MC-Unique: A32ry_C0NdCTmqw2m6L3Kw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id BE241800269; Thu, 14 Mar 2024 09:17:17 +0000 (UTC) Received: from dmarchan.redhat.com (unknown [10.45.225.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id 70AA22024517; Thu, 14 Mar 2024 09:17:16 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: stable@dpdk.org, Ferruh Yigit , Aman Singh , Yuying Zhang , Pablo de Lara , Jingjing Wu Subject: [PATCH v2 1/6] app/testpmd: fix stats-period option check Date: Thu, 14 Mar 2024 10:17:02 +0100 Message-ID: <20240314091708.1542769-2-david.marchand@redhat.com> In-Reply-To: <20240314091708.1542769-1-david.marchand@redhat.com> References: <20240308144841.3615262-1-david.marchand@redhat.com> <20240314091708.1542769-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 Rather than silently ignore an invalid value, raise an error for stats-period user input. Fixes: cfea1f3048d1 ("app/testpmd: print statistics periodically") Cc: stable@dpdk.org Signed-off-by: David Marchand Acked-by: Ferruh Yigit --- app/test-pmd/parameters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index 11b0cce577..d715750bb8 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -776,7 +776,7 @@ launch_args_parse(int argc, char** argv) n = strtoul(optarg, &end, 10); if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0')) - break; + rte_exit(EXIT_FAILURE, "Invalid stats-period value\n"); stats_period = n; break; From patchwork Thu Mar 14 09:17:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 138368 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8AB0243CB2; Thu, 14 Mar 2024 10:17:38 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 33E4C42E75; Thu, 14 Mar 2024 10:17:33 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 7F73942E5C for ; Thu, 14 Mar 2024 10:17:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1710407851; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2TdlOofA2p+MeWwk5ntnmBB256rQfEQw1vqMqu762mU=; b=ZH2/uDMiCQBnCzGe3xIN8KPXxyW64yky1cWwqXPtp5AVSQBKLJnq6VudRvV+RESF4dBMbh B5AqVIaDOQ3FyoVU4a+mPTMwdl5yNT+ZQ4Ng8xjOzxotmYpj7eu7DO+bgTNrBkzTT4GEbZ IqP/ROsQSGTNeoCsBird5MHS/keZYDQ= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-686-P7QU9OQ7N46WvylJPzkfQA-1; Thu, 14 Mar 2024 05:17:22 -0400 X-MC-Unique: P7QU9OQ7N46WvylJPzkfQA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 919A7851783; Thu, 14 Mar 2024 09:17:21 +0000 (UTC) Received: from dmarchan.redhat.com (unknown [10.45.225.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id AE2342166B4F; Thu, 14 Mar 2024 09:17:19 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: stable@dpdk.org, Aman Singh , Yuying Zhang , Bernard Iremonger , Andrew Rybchenko , Ivan Ilchenko Subject: [PATCH v2 2/6] app/testpmd: fix burst option parsing Date: Thu, 14 Mar 2024 10:17:03 +0100 Message-ID: <20240314091708.1542769-3-david.marchand@redhat.com> In-Reply-To: <20240314091708.1542769-1-david.marchand@redhat.com> References: <20240308144841.3615262-1-david.marchand@redhat.com> <20240314091708.1542769-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 rte_eth_dev_info_get() is not supposed to fail for a valid port_id, but for the theoretical case when it would fail, raise an error rather than skip subsequent options. Fixes: 6f51deb903b2 ("app/testpmd: check status of getting ethdev info") Cc: stable@dpdk.org Signed-off-by: David Marchand Acked-by: Ferruh Yigit --- Changes since v1: - switched to a dedicated error message, --- app/test-pmd/parameters.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index d715750bb8..3414a0d38c 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -1128,7 +1128,9 @@ launch_args_parse(int argc, char** argv) 0, &dev_info); if (ret != 0) - return; + rte_exit(EXIT_FAILURE, "Failed to get driver " + "recommended burst size, please provide a " + "value between 1 and %d\n", MAX_PKT_BURST); rec_nb_pkts = dev_info .default_rxportconf.burst_size; From patchwork Thu Mar 14 09:17:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 138367 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 67A1443CB2; Thu, 14 Mar 2024 10:17:32 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C9E3442E6A; Thu, 14 Mar 2024 10:17:31 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 13BBF42E62 for ; Thu, 14 Mar 2024 10:17:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1710407849; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5osJIglxlv+2JBjL59M7DN3gmxYf0EIJUxx+Ps8jgXQ=; b=YNPK6eHZy1PL1BT/HqdJg+EgxteYWbH7gi6bCVFXj+Tt+fyb0VUDqUh1gWurifiCTTM1cX M5OxE0X7iHQu/E/WZjP9GkKMloAex5fXF7Hh85zcewxEV7Yp1T7BquZjSQdAhbuTVbbQeZ 8jk7SWC61HDOWNUFGw+OhPh66MOsO4Y= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-54-eYsierN9MzuueXcJ7B0C1Q-1; Thu, 14 Mar 2024 05:17:25 -0400 X-MC-Unique: eYsierN9MzuueXcJ7B0C1Q-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AF54838035AF; Thu, 14 Mar 2024 09:17:24 +0000 (UTC) Received: from dmarchan.redhat.com (unknown [10.45.225.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id A6918492BD0; Thu, 14 Mar 2024 09:17:23 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: stable@dpdk.org, Aman Singh , Yuying Zhang , Ferruh Yigit Subject: [PATCH v2 3/6] app/testpmd: fix error message for invalid option Date: Thu, 14 Mar 2024 10:17:04 +0100 Message-ID: <20240314091708.1542769-4-david.marchand@redhat.com> In-Reply-To: <20240314091708.1542769-1-david.marchand@redhat.com> References: <20240308144841.3615262-1-david.marchand@redhat.com> <20240314091708.1542769-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 """ The variable optind is the index of the next element to be processed in argv. The system initializes this value to 1. The caller can reset it to 1 to restart scanning of the same argv, or when scanning a new argument vector. """ Hence, if an invalid option is passed through testpmd cmdline, getopt returns '?' and increments optind to the next index in argv for a subsequent call. The message should log the previous index. Fixes: 8fad2e5ab2c5 ("app/testpmd: report invalid command line parameter") Cc: stable@dpdk.org Signed-off-by: David Marchand Acked-by: Ferruh Yigit --- app/test-pmd/parameters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index 3414a0d38c..a4c09e2a2b 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -1497,7 +1497,7 @@ launch_args_parse(int argc, char** argv) break; default: usage(argv[0]); - fprintf(stderr, "Invalid option: %s\n", argv[optind]); + fprintf(stderr, "Invalid option: %s\n", argv[optind - 1]); rte_exit(EXIT_FAILURE, "Command line is incomplete or incorrect\n"); break; From patchwork Thu Mar 14 09:17:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 138369 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0EDF343CB2; Thu, 14 Mar 2024 10:17:45 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7EE6C42E7E; Thu, 14 Mar 2024 10:17:34 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id D961142E6D for ; Thu, 14 Mar 2024 10:17:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1710407851; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L/18u6ae0kli5zs6MT0v2c7m3+DYgVhOaeTySpFiNQA=; b=gVbtdul39JoYTxr1FnR+YA1EZq0eqBlZ8Nh0bk0H2v/QUgWlxH5MCuABWYODerLKWmIn80 QOOC7eGrNvS9ElmoGMQujj2EC/mOhU+Q5F0ckUu+drT7iKsouV+gKF0nydCpYOv6riN5Ch W4WgoprBnAgZYqLIXigTe82/icD6cbo= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-446-rYa23I8MPSOhm0F__TwvhA-1; Thu, 14 Mar 2024 05:17:27 -0400 X-MC-Unique: rYa23I8MPSOhm0F__TwvhA-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 69ECD1884973; Thu, 14 Mar 2024 09:17:27 +0000 (UTC) Received: from dmarchan.redhat.com (unknown [10.45.225.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id A5054C017A0; Thu, 14 Mar 2024 09:17:26 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: Aman Singh , Yuying Zhang Subject: [PATCH v2 4/6] app/testpmd: enhance queue count check Date: Thu, 14 Mar 2024 10:17:05 +0100 Message-ID: <20240314091708.1542769-5-david.marchand@redhat.com> In-Reply-To: <20240314091708.1542769-1-david.marchand@redhat.com> References: <20240308144841.3615262-1-david.marchand@redhat.com> <20240314091708.1542769-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 Checking the number of rxq/txq in the middle of option parsing is confusing. Besides, a check on nb_rxq / nb_txq check already exists after option parsing. Only keep this latter check and make testpmd quit in this case. Signed-off-by: David Marchand Acked-by: Ferruh Yigit --- Changes since v1: - moved the check and termination out of argument parsing, --- app/test-pmd/parameters.c | 4 ---- app/test-pmd/testpmd.c | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index a4c09e2a2b..fc5cf3a195 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -1098,10 +1098,6 @@ launch_args_parse(int argc, char** argv) n + nb_rxq, get_allowed_max_nb_rxq(&pid)); } - if (!nb_rxq && !nb_txq) { - rte_exit(EXIT_FAILURE, "Either rx or tx queues should " - "be non-zero\n"); - } if (!strcmp(lgopts[opt_idx].name, "hairpin-mode")) { char *end = NULL; unsigned int n; diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 9e4e99e53b..81d905d759 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -4619,8 +4619,7 @@ main(int argc, char** argv) } if (!nb_rxq && !nb_txq) - fprintf(stderr, - "Warning: Either rx or tx queues should be non-zero\n"); + rte_exit(EXIT_FAILURE, "Either rx or tx queues should be non-zero\n"); if (nb_rxq > 1 && nb_rxq > nb_txq) fprintf(stderr, From patchwork Thu Mar 14 09:17:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 138370 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 53B4343CB2; Thu, 14 Mar 2024 10:17:51 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F0F7542E89; Thu, 14 Mar 2024 10:17:40 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mails.dpdk.org (Postfix) with ESMTP id 4F6EE42E7B for ; Thu, 14 Mar 2024 10:17:36 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1710407855; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nz5/ICh3Od5It+bfsDClPohIfdKdMDyMCYj1DfOpJvk=; b=I9NoCfGZaBwji8rciiizhd4NEtT6rYeIprQL0VdMgqvjlXBp20owC+bIqYlADgU5KL+Hms dfScBEsPMHKJaTWJmguoqHG3MsjHmqkCSPrX3WyQdRQoOFSLNT1OktKGUY+TCO56pNzSAc Fn/jJbukfuLl6bGEJkI13MvJls+fgbA= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-599-TQ_7SpimNlelcC0V7X4giw-1; Thu, 14 Mar 2024 05:17:30 -0400 X-MC-Unique: TQ_7SpimNlelcC0V7X4giw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2E8EE1C07583; Thu, 14 Mar 2024 09:17:30 +0000 (UTC) Received: from dmarchan.redhat.com (unknown [10.45.225.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id 681C33C21; Thu, 14 Mar 2024 09:17:29 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: Aman Singh , Yuying Zhang Subject: [PATCH v2 5/6] app/testpmd: remove dead code for disabling cmdline library Date: Thu, 14 Mar 2024 10:17:06 +0100 Message-ID: <20240314091708.1542769-6-david.marchand@redhat.com> In-Reply-To: <20240314091708.1542769-1-david.marchand@redhat.com> References: <20240308144841.3615262-1-david.marchand@redhat.com> <20240314091708.1542769-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 The cmdline library is always enabled with meson. Remove traces of a time when it may have been possible to disable it. Signed-off-by: David Marchand Acked-by: Ferruh Yigit --- app/test-pmd/parameters.c | 19 +------------------ app/test-pmd/testpmd.c | 5 +---- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index fc5cf3a195..a69639b6fb 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -45,10 +45,8 @@ usage(char* progname) { printf("\nUsage: %s [EAL options] -- [testpmd options]\n\n", progname); -#ifdef RTE_LIB_CMDLINE printf(" --interactive: run in interactive mode.\n"); printf(" --cmdline-file: execute cli commands before startup.\n"); -#endif printf(" --auto-start: start forwarding on init " "[always when non-interactive].\n"); printf(" --help: display this message and quit.\n"); @@ -95,12 +93,10 @@ usage(char* progname) printf(" --max-pkt-len=N: set the maximum size of packet to N bytes.\n"); printf(" --max-lro-pkt-size=N: set the maximum LRO aggregated packet " "size to N bytes.\n"); -#ifdef RTE_LIB_CMDLINE printf(" --eth-peers-configfile=name: config file with ethernet addresses " "of peer ports.\n"); printf(" --eth-peer=X,M:M:M:M:M:M: set the MAC address of the X peer " "port (0 <= X < %d).\n", RTE_MAX_ETHPORTS); -#endif printf(" --disable-crc-strip: disable CRC stripping by hardware.\n"); printf(" --enable-scatter: enable scattered Rx.\n"); printf(" --enable-lro: enable large receive offload.\n"); @@ -210,7 +206,6 @@ usage(char* progname) " 0x01 - hairpin ports loop, 0x00 - hairpin port self\n"); } -#ifdef RTE_LIB_CMDLINE static int init_peer_eth_addrs(const char *config_filename) { @@ -240,7 +235,6 @@ init_peer_eth_addrs(const char *config_filename) nb_peer_eth_addrs = (portid_t) i; return 0; } -#endif /* * Parse the coremask given as argument (hexadecimal string) and set @@ -610,13 +604,11 @@ launch_args_parse(int argc, char** argv) static struct option lgopts[] = { { "help", 0, 0, 0 }, -#ifdef RTE_LIB_CMDLINE { "interactive", 0, 0, 0 }, { "cmdline-file", 1, 0, 0 }, { "auto-start", 0, 0, 0 }, { "eth-peers-configfile", 1, 0, 0 }, { "eth-peer", 1, 0, 0 }, -#endif { "tx-first", 0, 0, 0 }, { "stats-period", 1, 0, 0 }, { "display-xstats", 1, 0, 0 }, @@ -725,20 +717,13 @@ launch_args_parse(int argc, char** argv) argvopt = argv; -#ifdef RTE_LIB_CMDLINE -#define SHORTOPTS "i" -#else -#define SHORTOPTS "" -#endif - while ((opt = getopt_long(argc, argvopt, SHORTOPTS "ah", + while ((opt = getopt_long(argc, argvopt, "iah", lgopts, &opt_idx)) != EOF) { switch (opt) { -#ifdef RTE_LIB_CMDLINE case 'i': printf("Interactive-mode selected\n"); interactive = 1; break; -#endif case 'a': printf("Auto-start selected\n"); auto_start = 1; @@ -749,7 +734,6 @@ launch_args_parse(int argc, char** argv) usage(argv[0]); exit(EXIT_SUCCESS); } -#ifdef RTE_LIB_CMDLINE if (!strcmp(lgopts[opt_idx].name, "interactive")) { printf("Interactive-mode selected\n"); interactive = 1; @@ -817,7 +801,6 @@ launch_args_parse(int argc, char** argv) port_end); nb_peer_eth_addrs++; } -#endif if (!strcmp(lgopts[opt_idx].name, "tx-ip")) { struct in_addr in; char *end; diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 81d905d759..70ea257fda 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -4700,7 +4700,6 @@ main(int argc, char** argv) if (record_core_cycles) rte_lcore_register_usage_cb(lcore_usage_callback); -#ifdef RTE_LIB_CMDLINE if (init_cmdline() != 0) rte_exit(EXIT_FAILURE, "Could not initialise cmdline context.\n"); @@ -4714,9 +4713,7 @@ main(int argc, char** argv) start_packet_forwarding(0); } prompt(); - } else -#endif - { + } else { printf("No commandline core given, start packet forwarding\n"); start_packet_forwarding(tx_first); if (stats_period != 0) { From patchwork Thu Mar 14 09:17:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 138371 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 25CFE43CB2; Thu, 14 Mar 2024 10:17:57 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 401A842E91; Thu, 14 Mar 2024 10:17:42 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id BD24E42E5D for ; Thu, 14 Mar 2024 10:17:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1710407857; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QWpAwiWnNk3VQYRTwxEX+54YTKUYo2M68JVL0LZNfUc=; b=dca5KqM8JIOAl+1gE8Ne456P3chNl/gI9gNsQ6YOMfL6zC7ykoHsXgwzSQJiNxCZroLdz9 SXh6rB6dDFacGij3tHPw/Y51lE3dNiUIhRGyQEtTiZzlYtHxB06gbvmQE8kQWrIgE0e6ts R9tH7OZyNn2ely9hJoQKaVC5rv4B8ds= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-206-P1QWft2APci6tjR5rByKpg-1; Thu, 14 Mar 2024 05:17:33 -0400 X-MC-Unique: P1QWft2APci6tjR5rByKpg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 76647851785; Thu, 14 Mar 2024 09:17:33 +0000 (UTC) Received: from dmarchan.redhat.com (unknown [10.45.225.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1F6603C24; Thu, 14 Mar 2024 09:17:31 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: Aman Singh , Yuying Zhang Subject: [PATCH v2 6/6] app/testpmd: enhance getopt_long usage Date: Thu, 14 Mar 2024 10:17:07 +0100 Message-ID: <20240314091708.1542769-7-david.marchand@redhat.com> In-Reply-To: <20240314091708.1542769-1-david.marchand@redhat.com> References: <20240308144841.3615262-1-david.marchand@redhat.com> <20240314091708.1542769-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 This is a cleanup similar to previous ones in EAL and examples. Instead of using strcmp for every long options while getopt_long already did such parsing, rely on getopt_long return value. Note for reviewers: this patch is best reviewed once applied locally and displayed with git show -w. Signed-off-by: David Marchand Acked-by: Ferruh Yigit --- Changes since v1: - removed useless comments in options enum definitions, - constified long_options, - added macros to shorten long options array definitions, - removed unneeded argvopt, --- app/test-pmd/parameters.c | 1924 +++++++++++++++++++++---------------- 1 file changed, 1083 insertions(+), 841 deletions(-) diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index a69639b6fb..c13f7564bf 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -40,6 +40,344 @@ #include "testpmd.h" +enum { +#define TESTPMD_OPT_AUTO_START "auto-start" + TESTPMD_OPT_AUTO_START_NUM = 'a', +#define TESTPMD_OPT_HELP "help" + TESTPMD_OPT_HELP_NUM = 'h', +#define TESTPMD_OPT_INTERACTIVE "interactive" + TESTPMD_OPT_INTERACTIVE_NUM = 'i', + + TESTPMD_OPT_LONG_MIN_NUM = 256, +#define TESTPMD_OPT_CMDLINE_FILE "cmdline-file" + TESTPMD_OPT_CMDLINE_FILE_NUM, +#define TESTPMD_OPT_ETH_PEERS_CONFIGFILE "eth-peers-configfile" + TESTPMD_OPT_ETH_PEERS_CONFIGFILE_NUM, +#define TESTPMD_OPT_ETH_PEER "eth-peer" + TESTPMD_OPT_ETH_PEER_NUM, +#define TESTPMD_OPT_TX_FIRST "tx-first" + TESTPMD_OPT_TX_FIRST_NUM, +#define TESTPMD_OPT_STATS_PERIOD "stats-period" + TESTPMD_OPT_STATS_PERIOD_NUM, +#define TESTPMD_OPT_DISPLAY_XSTATS "display-xstats" + TESTPMD_OPT_DISPLAY_XSTATS_NUM, +#define TESTPMD_OPT_NB_CORES "nb-cores" + TESTPMD_OPT_NB_CORES_NUM, +#define TESTPMD_OPT_NB_PORTS "nb-ports" + TESTPMD_OPT_NB_PORTS_NUM, +#define TESTPMD_OPT_COREMASK "coremask" + TESTPMD_OPT_COREMASK_NUM, +#define TESTPMD_OPT_PORTMASK "portmask" + TESTPMD_OPT_PORTMASK_NUM, +#define TESTPMD_OPT_PORTLIST "portlist" + TESTPMD_OPT_PORTLIST_NUM, +#define TESTPMD_OPT_NUMA "numa" + TESTPMD_OPT_NUMA_NUM, +#define TESTPMD_OPT_NO_NUMA "no-numa" + TESTPMD_OPT_NO_NUMA_NUM, +#define TESTPMD_OPT_MP_ANON "mp-anon" + TESTPMD_OPT_MP_ANON_NUM, +#define TESTPMD_OPT_PORT_NUMA_CONFIG "port-numa-config" + TESTPMD_OPT_PORT_NUMA_CONFIG_NUM, +#define TESTPMD_OPT_RING_NUMA_CONFIG "ring-numa-config" + TESTPMD_OPT_RING_NUMA_CONFIG_NUM, +#define TESTPMD_OPT_SOCKET_NUM "socket-num" + TESTPMD_OPT_SOCKET_NUM_NUM, +#define TESTPMD_OPT_MBUF_SIZE "mbuf-size" + TESTPMD_OPT_MBUF_SIZE_NUM, +#define TESTPMD_OPT_TOTAL_NUM_MBUFS "total-num-mbufs" + TESTPMD_OPT_TOTAL_NUM_MBUFS_NUM, +#define TESTPMD_OPT_MAX_PKT_LEN "max-pkt-len" + TESTPMD_OPT_MAX_PKT_LEN_NUM, +#define TESTPMD_OPT_MAX_LRO_PKT_SIZE "max-lro-pkt-size" + TESTPMD_OPT_MAX_LRO_PKT_SIZE_NUM, +#define TESTPMD_OPT_LATENCYSTATS "latencystats" + TESTPMD_OPT_LATENCYSTATS_NUM, +#define TESTPMD_OPT_BITRATE_STATS "bitrate-stats" + TESTPMD_OPT_BITRATE_STATS_NUM, +#define TESTPMD_OPT_DISABLE_CRC_STRIP "disable-crc-strip" + TESTPMD_OPT_DISABLE_CRC_STRIP_NUM, +#define TESTPMD_OPT_ENABLE_LRO "enable-lro" + TESTPMD_OPT_ENABLE_LRO_NUM, +#define TESTPMD_OPT_ENABLE_RX_CKSUM "enable-rx-cksum" + TESTPMD_OPT_ENABLE_RX_CKSUM_NUM, +#define TESTPMD_OPT_ENABLE_RX_TIMESTAMP "enable-rx-timestamp" + TESTPMD_OPT_ENABLE_RX_TIMESTAMP_NUM, +#define TESTPMD_OPT_ENABLE_SCATTER "enable-scatter" + TESTPMD_OPT_ENABLE_SCATTER_NUM, +#define TESTPMD_OPT_ENABLE_HW_VLAN "enable-hw-vlan" + TESTPMD_OPT_ENABLE_HW_VLAN_NUM, +#define TESTPMD_OPT_ENABLE_HW_VLAN_FILTER "enable-hw-vlan-filter" + TESTPMD_OPT_ENABLE_HW_VLAN_FILTER_NUM, +#define TESTPMD_OPT_ENABLE_HW_VLAN_STRIP "enable-hw-vlan-strip" + TESTPMD_OPT_ENABLE_HW_VLAN_STRIP_NUM, +#define TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND "enable-hw-vlan-extend" + TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND_NUM, +#define TESTPMD_OPT_ENABLE_HW_QINQ_STRIP "enable-hw-qinq-strip" + TESTPMD_OPT_ENABLE_HW_QINQ_STRIP_NUM, +#define TESTPMD_OPT_ENABLE_DROP_EN "enable-drop-en" + TESTPMD_OPT_ENABLE_DROP_EN_NUM, +#define TESTPMD_OPT_DISABLE_RSS "disable-rss" + TESTPMD_OPT_DISABLE_RSS_NUM, +#define TESTPMD_OPT_PORT_TOPOLOGY "port-topology" + TESTPMD_OPT_PORT_TOPOLOGY_NUM, +#define TESTPMD_OPT_FORWARD_MODE "forward-mode" + TESTPMD_OPT_FORWARD_MODE_NUM, +#define TESTPMD_OPT_RSS_IP "rss-ip" + TESTPMD_OPT_RSS_IP_NUM, +#define TESTPMD_OPT_RSS_UDP "rss-udp" + TESTPMD_OPT_RSS_UDP_NUM, +#define TESTPMD_OPT_RSS_LEVEL_OUTER "rss-level-outer" + TESTPMD_OPT_RSS_LEVEL_OUTER_NUM, +#define TESTPMD_OPT_RSS_LEVEL_INNER "rss-level-inner" + TESTPMD_OPT_RSS_LEVEL_INNER_NUM, +#define TESTPMD_OPT_RXQ "rxq" + TESTPMD_OPT_RXQ_NUM, +#define TESTPMD_OPT_TXQ "txq" + TESTPMD_OPT_TXQ_NUM, +#define TESTPMD_OPT_RXD "rxd" + TESTPMD_OPT_RXD_NUM, +#define TESTPMD_OPT_TXD "txd" + TESTPMD_OPT_TXD_NUM, +#define TESTPMD_OPT_HAIRPINQ "hairpinq" + TESTPMD_OPT_HAIRPINQ_NUM, +#define TESTPMD_OPT_HAIRPIN_MODE "hairpin-mode" + TESTPMD_OPT_HAIRPIN_MODE_NUM, +#define TESTPMD_OPT_BURST "burst" + TESTPMD_OPT_BURST_NUM, +#define TESTPMD_OPT_FLOWGEN_CLONES "flowgen-clones" + TESTPMD_OPT_FLOWGEN_CLONES_NUM, +#define TESTPMD_OPT_FLOWGEN_FLOWS "flowgen-flows" + TESTPMD_OPT_FLOWGEN_FLOWS_NUM, +#define TESTPMD_OPT_MBCACHE "mbcache" + TESTPMD_OPT_MBCACHE_NUM, +#define TESTPMD_OPT_TXPT "txpt" + TESTPMD_OPT_TXPT_NUM, +#define TESTPMD_OPT_TXHT "txht" + TESTPMD_OPT_TXHT_NUM, +#define TESTPMD_OPT_TXWT "txwt" + TESTPMD_OPT_TXWT_NUM, +#define TESTPMD_OPT_TXFREET "txfreet" + TESTPMD_OPT_TXFREET_NUM, +#define TESTPMD_OPT_TXRST "txrst" + TESTPMD_OPT_TXRST_NUM, +#define TESTPMD_OPT_RXPT "rxpt" + TESTPMD_OPT_RXPT_NUM, +#define TESTPMD_OPT_RXHT "rxht" + TESTPMD_OPT_RXHT_NUM, +#define TESTPMD_OPT_RXWT "rxwt" + TESTPMD_OPT_RXWT_NUM, +#define TESTPMD_OPT_RXFREET "rxfreet" + TESTPMD_OPT_RXFREET_NUM, +#define TESTPMD_OPT_NO_FLUSH_RX "no-flush-rx" + TESTPMD_OPT_NO_FLUSH_RX_NUM, +#define TESTPMD_OPT_FLOW_ISOLATE_ALL "flow-isolate-all" + TESTPMD_OPT_FLOW_ISOLATE_ALL_NUM, +#define TESTPMD_OPT_DISABLE_FLOW_FLUSH "disable-flow-flush" + TESTPMD_OPT_DISABLE_FLOW_FLUSH_NUM, +#define TESTPMD_OPT_RXOFFS "rxoffs" + TESTPMD_OPT_RXOFFS_NUM, +#define TESTPMD_OPT_RXPKTS "rxpkts" + TESTPMD_OPT_RXPKTS_NUM, +#define TESTPMD_OPT_RXHDRS "rxhdrs" + TESTPMD_OPT_RXHDRS_NUM, +#define TESTPMD_OPT_TXPKTS "txpkts" + TESTPMD_OPT_TXPKTS_NUM, +#define TESTPMD_OPT_MULTI_RX_MEMPOOL "multi-rx-mempool" + TESTPMD_OPT_MULTI_RX_MEMPOOL_NUM, +#define TESTPMD_OPT_TXONLY_MULTI_FLOW "txonly-multi-flow" + TESTPMD_OPT_TXONLY_MULTI_FLOW_NUM, +#define TESTPMD_OPT_RXQ_SHARE "rxq-share" + TESTPMD_OPT_RXQ_SHARE_NUM, +#define TESTPMD_OPT_ETH_LINK_SPEED "eth-link-speed" + TESTPMD_OPT_ETH_LINK_SPEED_NUM, +#define TESTPMD_OPT_DISABLE_LINK_CHECK "disable-link-check" + TESTPMD_OPT_DISABLE_LINK_CHECK_NUM, +#define TESTPMD_OPT_DISABLE_DEVICE_START "disable-device-start" + TESTPMD_OPT_DISABLE_DEVICE_START_NUM, +#define TESTPMD_OPT_NO_LSC_INTERRUPT "no-lsc-interrupt" + TESTPMD_OPT_NO_LSC_INTERRUPT_NUM, +#define TESTPMD_OPT_NO_RMV_INTERRUPT "no-rmv-interrupt" + TESTPMD_OPT_NO_RMV_INTERRUPT_NUM, +#define TESTPMD_OPT_PRINT_EVENT "print-event" + TESTPMD_OPT_PRINT_EVENT_NUM, +#define TESTPMD_OPT_MASK_EVENT "mask-event" + TESTPMD_OPT_MASK_EVENT_NUM, +#define TESTPMD_OPT_TX_OFFLOADS "tx-offloads" + TESTPMD_OPT_TX_OFFLOADS_NUM, +#define TESTPMD_OPT_RX_OFFLOADS "rx-offloads" + TESTPMD_OPT_RX_OFFLOADS_NUM, +#define TESTPMD_OPT_HOT_PLUG "hot-plug" + TESTPMD_OPT_HOT_PLUG_NUM, +#define TESTPMD_OPT_VXLAN_GPE_PORT "vxlan-gpe-port" + TESTPMD_OPT_VXLAN_GPE_PORT_NUM, +#define TESTPMD_OPT_GENEVE_PARSED_PORT "geneve-parsed-port" + TESTPMD_OPT_GENEVE_PARSED_PORT_NUM, +#define TESTPMD_OPT_MLOCKALL "mlockall" + TESTPMD_OPT_MLOCKALL_NUM, +#define TESTPMD_OPT_NO_MLOCKALL "no-mlockall" + TESTPMD_OPT_NO_MLOCKALL_NUM, +#define TESTPMD_OPT_MP_ALLOC "mp-alloc" + TESTPMD_OPT_MP_ALLOC_NUM, +#define TESTPMD_OPT_TX_IP "tx-ip" + TESTPMD_OPT_TX_IP_NUM, +#define TESTPMD_OPT_TX_UDP "tx-udp" + TESTPMD_OPT_TX_UDP_NUM, +#define TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE "noisy-tx-sw-buffer-size" + TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE_NUM, +#define TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME "noisy-tx-sw-buffer-flushtime" + TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME_NUM, +#define TESTPMD_OPT_NOISY_LKUP_MEMORY "noisy-lkup-memory" + TESTPMD_OPT_NOISY_LKUP_MEMORY_NUM, +#define TESTPMD_OPT_NOISY_LKUP_NUM_WRITES "noisy-lkup-num-writes" + TESTPMD_OPT_NOISY_LKUP_NUM_WRITES_NUM, +#define TESTPMD_OPT_NOISY_LKUP_NUM_READS "noisy-lkup-num-reads" + TESTPMD_OPT_NOISY_LKUP_NUM_READS_NUM, +#define TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES "noisy-lkup-num-reads-writes" + TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES_NUM, +#define TESTPMD_OPT_NOISY_FORWARD_MODE "noisy-forward-mode" + TESTPMD_OPT_NOISY_FORWARD_MODE_NUM, +#define TESTPMD_OPT_NO_IOVA_CONTIG "no-iova-contig" + TESTPMD_OPT_NO_IOVA_CONTIG_NUM, +#define TESTPMD_OPT_RX_MQ_MODE "rx-mq-mode" + TESTPMD_OPT_RX_MQ_MODE_NUM, +#define TESTPMD_OPT_RECORD_CORE_CYCLES "record-core-cycles" + TESTPMD_OPT_RECORD_CORE_CYCLES_NUM, +#define TESTPMD_OPT_RECORD_BURST_STATS "record-burst-stats" + TESTPMD_OPT_RECORD_BURST_STATS_NUM, +#define TESTPMD_OPT_NUM_PROCS "num-procs" + TESTPMD_OPT_NUM_PROCS_NUM, +#define TESTPMD_OPT_PROC_ID "proc-id" + TESTPMD_OPT_PROC_ID_NUM, + + TESTPMD_OPT_LONG_MAX_NUM +}; + +static const char short_options[] = { + "a" /* auto-start */ + "h" /* help */ + "i" /* interactive */ +}; + +#define NO_ARG(opt) { opt, no_argument, NULL, opt ## _NUM } +#define REQUIRED_ARG(opt) { opt, required_argument, NULL, opt ## _NUM } +#define OPTIONAL_ARG(opt) { opt, optional_argument, NULL, opt ## _NUM } +static const struct option long_options[] = { + NO_ARG(TESTPMD_OPT_AUTO_START), + NO_ARG(TESTPMD_OPT_HELP), + NO_ARG(TESTPMD_OPT_INTERACTIVE), + REQUIRED_ARG(TESTPMD_OPT_CMDLINE_FILE), + REQUIRED_ARG(TESTPMD_OPT_ETH_PEERS_CONFIGFILE), + REQUIRED_ARG(TESTPMD_OPT_ETH_PEER), + NO_ARG(TESTPMD_OPT_TX_FIRST), + REQUIRED_ARG(TESTPMD_OPT_STATS_PERIOD), + REQUIRED_ARG(TESTPMD_OPT_DISPLAY_XSTATS), + REQUIRED_ARG(TESTPMD_OPT_NB_CORES), + REQUIRED_ARG(TESTPMD_OPT_NB_PORTS), + REQUIRED_ARG(TESTPMD_OPT_COREMASK), + REQUIRED_ARG(TESTPMD_OPT_PORTMASK), + REQUIRED_ARG(TESTPMD_OPT_PORTLIST), + NO_ARG(TESTPMD_OPT_NUMA), + NO_ARG(TESTPMD_OPT_NO_NUMA), + NO_ARG(TESTPMD_OPT_MP_ANON), /* deprecated */ + REQUIRED_ARG(TESTPMD_OPT_PORT_NUMA_CONFIG), + REQUIRED_ARG(TESTPMD_OPT_RING_NUMA_CONFIG), + REQUIRED_ARG(TESTPMD_OPT_SOCKET_NUM), + REQUIRED_ARG(TESTPMD_OPT_MBUF_SIZE), + REQUIRED_ARG(TESTPMD_OPT_TOTAL_NUM_MBUFS), + REQUIRED_ARG(TESTPMD_OPT_MAX_PKT_LEN), + REQUIRED_ARG(TESTPMD_OPT_MAX_LRO_PKT_SIZE), +#ifdef RTE_LIB_LATENCYSTATS + REQUIRED_ARG(TESTPMD_OPT_LATENCYSTATS), +#endif +#ifdef RTE_LIB_BITRATESTATS + REQUIRED_ARG(TESTPMD_OPT_BITRATE_STATS), +#endif + NO_ARG(TESTPMD_OPT_DISABLE_CRC_STRIP), + NO_ARG(TESTPMD_OPT_ENABLE_LRO), + NO_ARG(TESTPMD_OPT_ENABLE_RX_CKSUM), + NO_ARG(TESTPMD_OPT_ENABLE_RX_TIMESTAMP), + NO_ARG(TESTPMD_OPT_ENABLE_SCATTER), + NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN), + NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN_FILTER), + NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN_STRIP), + NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND), + NO_ARG(TESTPMD_OPT_ENABLE_HW_QINQ_STRIP), + NO_ARG(TESTPMD_OPT_ENABLE_DROP_EN), + NO_ARG(TESTPMD_OPT_DISABLE_RSS), + REQUIRED_ARG(TESTPMD_OPT_PORT_TOPOLOGY), + REQUIRED_ARG(TESTPMD_OPT_FORWARD_MODE), + NO_ARG(TESTPMD_OPT_RSS_IP), + NO_ARG(TESTPMD_OPT_RSS_UDP), + NO_ARG(TESTPMD_OPT_RSS_LEVEL_OUTER), + NO_ARG(TESTPMD_OPT_RSS_LEVEL_INNER), + REQUIRED_ARG(TESTPMD_OPT_RXQ), + REQUIRED_ARG(TESTPMD_OPT_TXQ), + REQUIRED_ARG(TESTPMD_OPT_RXD), + REQUIRED_ARG(TESTPMD_OPT_TXD), + REQUIRED_ARG(TESTPMD_OPT_HAIRPINQ), + REQUIRED_ARG(TESTPMD_OPT_HAIRPIN_MODE), + REQUIRED_ARG(TESTPMD_OPT_BURST), + REQUIRED_ARG(TESTPMD_OPT_FLOWGEN_CLONES), + REQUIRED_ARG(TESTPMD_OPT_FLOWGEN_FLOWS), + REQUIRED_ARG(TESTPMD_OPT_MBCACHE), + REQUIRED_ARG(TESTPMD_OPT_TXPT), + REQUIRED_ARG(TESTPMD_OPT_TXHT), + REQUIRED_ARG(TESTPMD_OPT_TXWT), + REQUIRED_ARG(TESTPMD_OPT_TXFREET), + REQUIRED_ARG(TESTPMD_OPT_TXRST), + REQUIRED_ARG(TESTPMD_OPT_RXPT), + REQUIRED_ARG(TESTPMD_OPT_RXHT), + REQUIRED_ARG(TESTPMD_OPT_RXWT), + REQUIRED_ARG(TESTPMD_OPT_RXFREET), + NO_ARG(TESTPMD_OPT_NO_FLUSH_RX), + NO_ARG(TESTPMD_OPT_FLOW_ISOLATE_ALL), + NO_ARG(TESTPMD_OPT_DISABLE_FLOW_FLUSH), + REQUIRED_ARG(TESTPMD_OPT_RXOFFS), + REQUIRED_ARG(TESTPMD_OPT_RXPKTS), + REQUIRED_ARG(TESTPMD_OPT_RXHDRS), + REQUIRED_ARG(TESTPMD_OPT_TXPKTS), + NO_ARG(TESTPMD_OPT_MULTI_RX_MEMPOOL), + NO_ARG(TESTPMD_OPT_TXONLY_MULTI_FLOW), + OPTIONAL_ARG(TESTPMD_OPT_RXQ_SHARE), + REQUIRED_ARG(TESTPMD_OPT_ETH_LINK_SPEED), + NO_ARG(TESTPMD_OPT_DISABLE_LINK_CHECK), + NO_ARG(TESTPMD_OPT_DISABLE_DEVICE_START), + NO_ARG(TESTPMD_OPT_NO_LSC_INTERRUPT), + NO_ARG(TESTPMD_OPT_NO_RMV_INTERRUPT), + REQUIRED_ARG(TESTPMD_OPT_PRINT_EVENT), + REQUIRED_ARG(TESTPMD_OPT_MASK_EVENT), + REQUIRED_ARG(TESTPMD_OPT_TX_OFFLOADS), + REQUIRED_ARG(TESTPMD_OPT_RX_OFFLOADS), + NO_ARG(TESTPMD_OPT_HOT_PLUG), + REQUIRED_ARG(TESTPMD_OPT_VXLAN_GPE_PORT), + REQUIRED_ARG(TESTPMD_OPT_GENEVE_PARSED_PORT), +#ifndef RTE_EXEC_ENV_WINDOWS + NO_ARG(TESTPMD_OPT_MLOCKALL), + NO_ARG(TESTPMD_OPT_NO_MLOCKALL), +#endif + REQUIRED_ARG(TESTPMD_OPT_MP_ALLOC), + REQUIRED_ARG(TESTPMD_OPT_TX_IP), + REQUIRED_ARG(TESTPMD_OPT_TX_UDP), + REQUIRED_ARG(TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE), + REQUIRED_ARG(TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME), + REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_MEMORY), + REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_NUM_WRITES), + REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_NUM_READS), + REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES), + REQUIRED_ARG(TESTPMD_OPT_NOISY_FORWARD_MODE), + NO_ARG(TESTPMD_OPT_NO_IOVA_CONTIG), + REQUIRED_ARG(TESTPMD_OPT_RX_MQ_MODE), + NO_ARG(TESTPMD_OPT_RECORD_CORE_CYCLES), + NO_ARG(TESTPMD_OPT_RECORD_BURST_STATS), + REQUIRED_ARG(TESTPMD_OPT_NUM_PROCS), + REQUIRED_ARG(TESTPMD_OPT_PROC_ID), + { 0, 0, NULL, 0 } +}; +#undef NO_ARG +#undef REQUIRED_ARG +#undef OPTIONAL_ARG + static void usage(char* progname) { @@ -587,11 +925,7 @@ parse_link_speed(int n) void launch_args_parse(int argc, char** argv) { -#define PARAM_PROC_ID "proc-id" -#define PARAM_NUM_PROCS "num-procs" - int n, opt; - char **argvopt; int opt_idx; portid_t pid; enum { TX, RX }; @@ -602,123 +936,8 @@ launch_args_parse(int argc, char** argv) uint16_t rec_nb_pkts; int ret; - static struct option lgopts[] = { - { "help", 0, 0, 0 }, - { "interactive", 0, 0, 0 }, - { "cmdline-file", 1, 0, 0 }, - { "auto-start", 0, 0, 0 }, - { "eth-peers-configfile", 1, 0, 0 }, - { "eth-peer", 1, 0, 0 }, - { "tx-first", 0, 0, 0 }, - { "stats-period", 1, 0, 0 }, - { "display-xstats", 1, 0, 0 }, - { "nb-cores", 1, 0, 0 }, - { "nb-ports", 1, 0, 0 }, - { "coremask", 1, 0, 0 }, - { "portmask", 1, 0, 0 }, - { "portlist", 1, 0, 0 }, - { "numa", 0, 0, 0 }, - { "no-numa", 0, 0, 0 }, - { "mp-anon", 0, 0, 0 }, /* deprecated */ - { "port-numa-config", 1, 0, 0 }, - { "ring-numa-config", 1, 0, 0 }, - { "socket-num", 1, 0, 0 }, - { "mbuf-size", 1, 0, 0 }, - { "total-num-mbufs", 1, 0, 0 }, - { "max-pkt-len", 1, 0, 0 }, - { "max-lro-pkt-size", 1, 0, 0 }, -#ifdef RTE_LIB_LATENCYSTATS - { "latencystats", 1, 0, 0 }, -#endif -#ifdef RTE_LIB_BITRATESTATS - { "bitrate-stats", 1, 0, 0 }, -#endif - { "disable-crc-strip", 0, 0, 0 }, - { "enable-lro", 0, 0, 0 }, - { "enable-rx-cksum", 0, 0, 0 }, - { "enable-rx-timestamp", 0, 0, 0 }, - { "enable-scatter", 0, 0, 0 }, - { "enable-hw-vlan", 0, 0, 0 }, - { "enable-hw-vlan-filter", 0, 0, 0 }, - { "enable-hw-vlan-strip", 0, 0, 0 }, - { "enable-hw-vlan-extend", 0, 0, 0 }, - { "enable-hw-qinq-strip", 0, 0, 0 }, - { "enable-drop-en", 0, 0, 0 }, - { "disable-rss", 0, 0, 0 }, - { "port-topology", 1, 0, 0 }, - { "forward-mode", 1, 0, 0 }, - { "rss-ip", 0, 0, 0 }, - { "rss-udp", 0, 0, 0 }, - { "rss-level-outer", 0, 0, 0 }, - { "rss-level-inner", 0, 0, 0 }, - { "rxq", 1, 0, 0 }, - { "txq", 1, 0, 0 }, - { "rxd", 1, 0, 0 }, - { "txd", 1, 0, 0 }, - { "hairpinq", 1, 0, 0 }, - { "hairpin-mode", 1, 0, 0 }, - { "burst", 1, 0, 0 }, - { "flowgen-clones", 1, 0, 0 }, - { "flowgen-flows", 1, 0, 0 }, - { "mbcache", 1, 0, 0 }, - { "txpt", 1, 0, 0 }, - { "txht", 1, 0, 0 }, - { "txwt", 1, 0, 0 }, - { "txfreet", 1, 0, 0 }, - { "txrst", 1, 0, 0 }, - { "rxpt", 1, 0, 0 }, - { "rxht", 1, 0, 0 }, - { "rxwt", 1, 0, 0 }, - { "rxfreet", 1, 0, 0 }, - { "no-flush-rx", 0, 0, 0 }, - { "flow-isolate-all", 0, 0, 0 }, - { "disable-flow-flush", 0, 0, 0 }, - { "rxoffs", 1, 0, 0 }, - { "rxpkts", 1, 0, 0 }, - { "rxhdrs", 1, 0, 0 }, - { "txpkts", 1, 0, 0 }, - { "multi-rx-mempool", 0, 0, 0 }, - { "txonly-multi-flow", 0, 0, 0 }, - { "rxq-share", 2, 0, 0 }, - { "eth-link-speed", 1, 0, 0 }, - { "disable-link-check", 0, 0, 0 }, - { "disable-device-start", 0, 0, 0 }, - { "no-lsc-interrupt", 0, 0, 0 }, - { "no-rmv-interrupt", 0, 0, 0 }, - { "print-event", 1, 0, 0 }, - { "mask-event", 1, 0, 0 }, - { "tx-offloads", 1, 0, 0 }, - { "rx-offloads", 1, 0, 0 }, - { "hot-plug", 0, 0, 0 }, - { "vxlan-gpe-port", 1, 0, 0 }, - { "geneve-parsed-port", 1, 0, 0 }, -#ifndef RTE_EXEC_ENV_WINDOWS - { "mlockall", 0, 0, 0 }, - { "no-mlockall", 0, 0, 0 }, -#endif - { "mp-alloc", 1, 0, 0 }, - { "tx-ip", 1, 0, 0 }, - { "tx-udp", 1, 0, 0 }, - { "noisy-forward-mode", 1, 0, 0 }, - { "noisy-tx-sw-buffer-size", 1, 0, 0 }, - { "noisy-tx-sw-buffer-flushtime", 1, 0, 0 }, - { "noisy-lkup-memory", 1, 0, 0 }, - { "noisy-lkup-num-writes", 1, 0, 0 }, - { "noisy-lkup-num-reads", 1, 0, 0 }, - { "noisy-lkup-num-reads-writes", 1, 0, 0 }, - { "no-iova-contig", 0, 0, 0 }, - { "rx-mq-mode", 1, 0, 0 }, - { "record-core-cycles", 0, 0, 0 }, - { "record-burst-stats", 0, 0, 0 }, - { PARAM_NUM_PROCS, 1, 0, 0 }, - { PARAM_PROC_ID, 1, 0, 0 }, - { 0, 0, 0, 0 }, - }; - - argvopt = argv; - - while ((opt = getopt_long(argc, argvopt, "iah", - lgopts, &opt_idx)) != EOF) { + while ((opt = getopt_long(argc, argv, short_options, long_options, + &opt_idx)) != EOF) { switch (opt) { case 'i': printf("Interactive-mode selected\n"); @@ -728,751 +947,774 @@ launch_args_parse(int argc, char** argv) printf("Auto-start selected\n"); auto_start = 1; break; + case 'h': + usage(argv[0]); + exit(EXIT_SUCCESS); + break; + case TESTPMD_OPT_CMDLINE_FILE_NUM: + printf("CLI commands to be read from %s\n", + optarg); + strlcpy(cmdline_filename, optarg, + sizeof(cmdline_filename)); + break; + case TESTPMD_OPT_TX_FIRST_NUM: + printf("Ports to start sending a burst of " + "packets first\n"); + tx_first = 1; + break; + case TESTPMD_OPT_STATS_PERIOD_NUM: { + char *end = NULL; + unsigned int n; - case 0: /*long options */ - if (!strcmp(lgopts[opt_idx].name, "help")) { - usage(argv[0]); - exit(EXIT_SUCCESS); - } - if (!strcmp(lgopts[opt_idx].name, "interactive")) { - printf("Interactive-mode selected\n"); - interactive = 1; - } - if (!strcmp(lgopts[opt_idx].name, "cmdline-file")) { - printf("CLI commands to be read from %s\n", - optarg); - strlcpy(cmdline_filename, optarg, - sizeof(cmdline_filename)); - } - if (!strcmp(lgopts[opt_idx].name, "auto-start")) { - printf("Auto-start selected\n"); - auto_start = 1; - } - if (!strcmp(lgopts[opt_idx].name, "tx-first")) { - printf("Ports to start sending a burst of " - "packets first\n"); - tx_first = 1; - } - if (!strcmp(lgopts[opt_idx].name, "stats-period")) { - char *end = NULL; - unsigned int n; - - n = strtoul(optarg, &end, 10); - if ((optarg[0] == '\0') || (end == NULL) || - (*end != '\0')) - rte_exit(EXIT_FAILURE, "Invalid stats-period value\n"); - - stats_period = n; - break; - } - if (!strcmp(lgopts[opt_idx].name, "display-xstats")) { - char rc; - - rc = parse_xstats_list(optarg, &xstats_display, - &xstats_display_num); - if (rc != 0) - rte_exit(EXIT_FAILURE, - "Failed to parse display-xstats argument: %d\n", - rc); - } - if (!strcmp(lgopts[opt_idx].name, - "eth-peers-configfile")) { - if (init_peer_eth_addrs(optarg) != 0) - rte_exit(EXIT_FAILURE, - "Cannot open logfile\n"); - } - if (!strcmp(lgopts[opt_idx].name, "eth-peer")) { - char *port_end; - - errno = 0; - n = strtoul(optarg, &port_end, 10); - if (errno != 0 || port_end == optarg || *port_end++ != ',') - rte_exit(EXIT_FAILURE, - "Invalid eth-peer: %s", optarg); - if (n >= RTE_MAX_ETHPORTS) - rte_exit(EXIT_FAILURE, - "eth-peer: port %d >= RTE_MAX_ETHPORTS(%d)\n", - n, RTE_MAX_ETHPORTS); - - if (rte_ether_unformat_addr(port_end, - &peer_eth_addrs[n]) < 0) - rte_exit(EXIT_FAILURE, - "Invalid ethernet address: %s\n", - port_end); - nb_peer_eth_addrs++; - } - if (!strcmp(lgopts[opt_idx].name, "tx-ip")) { - struct in_addr in; - char *end; - - end = strchr(optarg, ','); - if (end == optarg || !end) - rte_exit(EXIT_FAILURE, - "Invalid tx-ip: %s", optarg); + n = strtoul(optarg, &end, 10); + if ((optarg[0] == '\0') || (end == NULL) || + (*end != '\0')) + rte_exit(EXIT_FAILURE, "Invalid stats-period value\n"); - *end++ = 0; - if (inet_pton(AF_INET, optarg, &in) == 0) - rte_exit(EXIT_FAILURE, - "Invalid source IP address: %s\n", - optarg); - tx_ip_src_addr = rte_be_to_cpu_32(in.s_addr); + stats_period = n; + break; + } + case TESTPMD_OPT_DISPLAY_XSTATS_NUM: { + char rc; + + rc = parse_xstats_list(optarg, &xstats_display, + &xstats_display_num); + if (rc != 0) + rte_exit(EXIT_FAILURE, + "Failed to parse display-xstats argument: %d\n", + rc); + break; + } + case TESTPMD_OPT_ETH_PEERS_CONFIGFILE_NUM: + if (init_peer_eth_addrs(optarg) != 0) + rte_exit(EXIT_FAILURE, + "Cannot open logfile\n"); + break; + case TESTPMD_OPT_ETH_PEER_NUM: { + char *port_end; - if (inet_pton(AF_INET, end, &in) == 0) - rte_exit(EXIT_FAILURE, - "Invalid destination IP address: %s\n", - optarg); - tx_ip_dst_addr = rte_be_to_cpu_32(in.s_addr); - } - if (!strcmp(lgopts[opt_idx].name, "tx-udp")) { - char *end = NULL; - - errno = 0; - n = strtoul(optarg, &end, 10); - if (errno != 0 || end == optarg || - n > UINT16_MAX || - !(*end == '\0' || *end == ',')) - rte_exit(EXIT_FAILURE, - "Invalid UDP port: %s\n", - optarg); - tx_udp_src_port = n; - if (*end == ',') { - char *dst = end + 1; - - n = strtoul(dst, &end, 10); - if (errno != 0 || end == dst || - n > UINT16_MAX || *end) - rte_exit(EXIT_FAILURE, - "Invalid destination UDP port: %s\n", - dst); - tx_udp_dst_port = n; - } else { - tx_udp_dst_port = n; - } + errno = 0; + n = strtoul(optarg, &port_end, 10); + if (errno != 0 || port_end == optarg || *port_end++ != ',') + rte_exit(EXIT_FAILURE, + "Invalid eth-peer: %s", optarg); + if (n >= RTE_MAX_ETHPORTS) + rte_exit(EXIT_FAILURE, + "eth-peer: port %d >= RTE_MAX_ETHPORTS(%d)\n", + n, RTE_MAX_ETHPORTS); + + if (rte_ether_unformat_addr(port_end, + &peer_eth_addrs[n]) < 0) + rte_exit(EXIT_FAILURE, + "Invalid ethernet address: %s\n", + port_end); + nb_peer_eth_addrs++; + break; + } + case TESTPMD_OPT_TX_IP_NUM: { + struct in_addr in; + char *end; + + end = strchr(optarg, ','); + if (end == optarg || !end) + rte_exit(EXIT_FAILURE, + "Invalid tx-ip: %s", optarg); + + *end++ = 0; + if (inet_pton(AF_INET, optarg, &in) == 0) + rte_exit(EXIT_FAILURE, + "Invalid source IP address: %s\n", + optarg); + tx_ip_src_addr = rte_be_to_cpu_32(in.s_addr); + + if (inet_pton(AF_INET, end, &in) == 0) + rte_exit(EXIT_FAILURE, + "Invalid destination IP address: %s\n", + optarg); + tx_ip_dst_addr = rte_be_to_cpu_32(in.s_addr); + break; + } + case TESTPMD_OPT_TX_UDP_NUM: { + char *end = NULL; - } - if (!strcmp(lgopts[opt_idx].name, "nb-ports")) { - n = atoi(optarg); - if (n > 0 && n <= nb_ports) - nb_fwd_ports = n; - else - rte_exit(EXIT_FAILURE, - "Invalid port %d\n", n); - } - if (!strcmp(lgopts[opt_idx].name, "nb-cores")) { - n = atoi(optarg); - if (n > 0 && n <= nb_lcores) - nb_fwd_lcores = (uint8_t) n; - else + errno = 0; + n = strtoul(optarg, &end, 10); + if (errno != 0 || end == optarg || + n > UINT16_MAX || + !(*end == '\0' || *end == ',')) + rte_exit(EXIT_FAILURE, + "Invalid UDP port: %s\n", + optarg); + tx_udp_src_port = n; + if (*end == ',') { + char *dst = end + 1; + + n = strtoul(dst, &end, 10); + if (errno != 0 || end == dst || + n > UINT16_MAX || *end) rte_exit(EXIT_FAILURE, - "nb-cores should be > 0 and <= %d\n", - nb_lcores); + "Invalid destination UDP port: %s\n", + dst); + tx_udp_dst_port = n; + } else { + tx_udp_dst_port = n; } - if (!strcmp(lgopts[opt_idx].name, "coremask")) - parse_fwd_coremask(optarg); - if (!strcmp(lgopts[opt_idx].name, "portmask")) - parse_fwd_portmask(optarg); - if (!strcmp(lgopts[opt_idx].name, "portlist")) - parse_fwd_portlist(optarg); - if (!strcmp(lgopts[opt_idx].name, "no-numa")) - numa_support = 0; - if (!strcmp(lgopts[opt_idx].name, "numa")) - numa_support = 1; - if (!strcmp(lgopts[opt_idx].name, "mp-anon")) { + break; + } + case TESTPMD_OPT_NB_PORTS_NUM: + n = atoi(optarg); + if (n > 0 && n <= nb_ports) + nb_fwd_ports = n; + else + rte_exit(EXIT_FAILURE, + "Invalid port %d\n", n); + break; + case TESTPMD_OPT_NB_CORES_NUM: + n = atoi(optarg); + if (n > 0 && n <= nb_lcores) + nb_fwd_lcores = (uint8_t) n; + else + rte_exit(EXIT_FAILURE, + "nb-cores should be > 0 and <= %d\n", + nb_lcores); + break; + case TESTPMD_OPT_COREMASK_NUM: + parse_fwd_coremask(optarg); + break; + case TESTPMD_OPT_PORTMASK_NUM: + parse_fwd_portmask(optarg); + break; + case TESTPMD_OPT_PORTLIST_NUM: + parse_fwd_portlist(optarg); + break; + case TESTPMD_OPT_NO_NUMA_NUM: + numa_support = 0; + break; + case TESTPMD_OPT_NUMA_NUM: + numa_support = 1; + break; + case TESTPMD_OPT_MP_ANON_NUM: + mp_alloc_type = MP_ALLOC_ANON; + break; + case TESTPMD_OPT_MP_ALLOC_NUM: + if (!strcmp(optarg, "native")) + mp_alloc_type = MP_ALLOC_NATIVE; + else if (!strcmp(optarg, "anon")) mp_alloc_type = MP_ALLOC_ANON; + else if (!strcmp(optarg, "xmem")) + mp_alloc_type = MP_ALLOC_XMEM; + else if (!strcmp(optarg, "xmemhuge")) + mp_alloc_type = MP_ALLOC_XMEM_HUGE; + else if (!strcmp(optarg, "xbuf")) + mp_alloc_type = MP_ALLOC_XBUF; + else + rte_exit(EXIT_FAILURE, + "mp-alloc %s invalid - must be: " + "native, anon, xmem or xmemhuge\n", + optarg); + break; + case TESTPMD_OPT_PORT_NUMA_CONFIG_NUM: + if (parse_portnuma_config(optarg)) + rte_exit(EXIT_FAILURE, + "invalid port-numa configuration\n"); + break; + case TESTPMD_OPT_RING_NUMA_CONFIG_NUM: + if (parse_ringnuma_config(optarg)) + rte_exit(EXIT_FAILURE, + "invalid ring-numa configuration\n"); + break; + case TESTPMD_OPT_SOCKET_NUM_NUM: + n = atoi(optarg); + if (!new_socket_id((uint8_t)n)) { + socket_num = (uint8_t)n; + } else { + print_invalid_socket_id_error(); + rte_exit(EXIT_FAILURE, + "Invalid socket id"); } - if (!strcmp(lgopts[opt_idx].name, "mp-alloc")) { - if (!strcmp(optarg, "native")) - mp_alloc_type = MP_ALLOC_NATIVE; - else if (!strcmp(optarg, "anon")) - mp_alloc_type = MP_ALLOC_ANON; - else if (!strcmp(optarg, "xmem")) - mp_alloc_type = MP_ALLOC_XMEM; - else if (!strcmp(optarg, "xmemhuge")) - mp_alloc_type = MP_ALLOC_XMEM_HUGE; - else if (!strcmp(optarg, "xbuf")) - mp_alloc_type = MP_ALLOC_XBUF; - else - rte_exit(EXIT_FAILURE, - "mp-alloc %s invalid - must be: " - "native, anon, xmem or xmemhuge\n", - optarg); - } - if (!strcmp(lgopts[opt_idx].name, "port-numa-config")) { - if (parse_portnuma_config(optarg)) - rte_exit(EXIT_FAILURE, - "invalid port-numa configuration\n"); - } - if (!strcmp(lgopts[opt_idx].name, "ring-numa-config")) - if (parse_ringnuma_config(optarg)) - rte_exit(EXIT_FAILURE, - "invalid ring-numa configuration\n"); - if (!strcmp(lgopts[opt_idx].name, "socket-num")) { - n = atoi(optarg); - if (!new_socket_id((uint8_t)n)) { - socket_num = (uint8_t)n; - } else { - print_invalid_socket_id_error(); - rte_exit(EXIT_FAILURE, - "Invalid socket id"); - } - } - if (!strcmp(lgopts[opt_idx].name, "mbuf-size")) { - unsigned int mb_sz[MAX_SEGS_BUFFER_SPLIT]; - unsigned int nb_segs, i; - - nb_segs = parse_item_list(optarg, "mbuf-size", - MAX_SEGS_BUFFER_SPLIT, mb_sz, 0); - if (nb_segs <= 0) - rte_exit(EXIT_FAILURE, - "bad mbuf-size\n"); - for (i = 0; i < nb_segs; i++) { - if (mb_sz[i] <= 0 || mb_sz[i] > 0xFFFF) - rte_exit(EXIT_FAILURE, - "mbuf-size should be " - "> 0 and < 65536\n"); - mbuf_data_size[i] = (uint16_t) mb_sz[i]; - } - mbuf_data_size_n = nb_segs; - } - if (!strcmp(lgopts[opt_idx].name, "total-num-mbufs")) { - n = atoi(optarg); - if (n > MIN_TOTAL_NUM_MBUFS) - param_total_num_mbufs = (unsigned)n; - else - rte_exit(EXIT_FAILURE, - "total-num-mbufs should be > %d\n", - MIN_TOTAL_NUM_MBUFS); - } - if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) { - n = atoi(optarg); - if (n >= RTE_ETHER_MIN_LEN) - max_rx_pkt_len = n; - else + break; + case TESTPMD_OPT_MBUF_SIZE_NUM: { + unsigned int mb_sz[MAX_SEGS_BUFFER_SPLIT]; + unsigned int nb_segs, i; + + nb_segs = parse_item_list(optarg, "mbuf-size", + MAX_SEGS_BUFFER_SPLIT, mb_sz, 0); + if (nb_segs <= 0) + rte_exit(EXIT_FAILURE, + "bad mbuf-size\n"); + for (i = 0; i < nb_segs; i++) { + if (mb_sz[i] <= 0 || mb_sz[i] > 0xFFFF) rte_exit(EXIT_FAILURE, - "Invalid max-pkt-len=%d - should be > %d\n", - n, RTE_ETHER_MIN_LEN); - } - if (!strcmp(lgopts[opt_idx].name, "max-lro-pkt-size")) { - n = atoi(optarg); - rx_mode.max_lro_pkt_size = (uint32_t) n; + "mbuf-size should be " + "> 0 and < 65536\n"); + mbuf_data_size[i] = (uint16_t) mb_sz[i]; } + mbuf_data_size_n = nb_segs; + break; + } + case TESTPMD_OPT_TOTAL_NUM_MBUFS_NUM: + n = atoi(optarg); + if (n > MIN_TOTAL_NUM_MBUFS) + param_total_num_mbufs = (unsigned int)n; + else + rte_exit(EXIT_FAILURE, + "total-num-mbufs should be > %d\n", + MIN_TOTAL_NUM_MBUFS); + break; + case TESTPMD_OPT_MAX_PKT_LEN_NUM: + n = atoi(optarg); + if (n >= RTE_ETHER_MIN_LEN) + max_rx_pkt_len = n; + else + rte_exit(EXIT_FAILURE, + "Invalid max-pkt-len=%d - should be > %d\n", + n, RTE_ETHER_MIN_LEN); + break; + case TESTPMD_OPT_MAX_LRO_PKT_SIZE_NUM: + n = atoi(optarg); + rx_mode.max_lro_pkt_size = (uint32_t) n; + break; #ifdef RTE_LIB_LATENCYSTATS - if (!strcmp(lgopts[opt_idx].name, - "latencystats")) { - n = atoi(optarg); - if (n >= 0) { - latencystats_lcore_id = (lcoreid_t) n; - latencystats_enabled = 1; - } else - rte_exit(EXIT_FAILURE, - "invalid lcore id %d for latencystats" - " must be >= 0\n", n); - } + case TESTPMD_OPT_LATENCYSTATS_NUM: + n = atoi(optarg); + if (n >= 0) { + latencystats_lcore_id = (lcoreid_t) n; + latencystats_enabled = 1; + } else + rte_exit(EXIT_FAILURE, + "invalid lcore id %d for latencystats" + " must be >= 0\n", n); + + break; #endif #ifdef RTE_LIB_BITRATESTATS - if (!strcmp(lgopts[opt_idx].name, "bitrate-stats")) { - n = atoi(optarg); - if (n >= 0) { - bitrate_lcore_id = (lcoreid_t) n; - bitrate_enabled = 1; - } else - rte_exit(EXIT_FAILURE, - "invalid lcore id %d for bitrate stats" - " must be >= 0\n", n); - } + case TESTPMD_OPT_BITRATE_STATS_NUM: + n = atoi(optarg); + if (n >= 0) { + bitrate_lcore_id = (lcoreid_t) n; + bitrate_enabled = 1; + } else + rte_exit(EXIT_FAILURE, + "invalid lcore id %d for bitrate stats" + " must be >= 0\n", n); + break; #endif - if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_KEEP_CRC; - if (!strcmp(lgopts[opt_idx].name, "enable-lro")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_TCP_LRO; - if (!strcmp(lgopts[opt_idx].name, "enable-scatter")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_SCATTER; - if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_CHECKSUM; - if (!strcmp(lgopts[opt_idx].name, - "enable-rx-timestamp")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP; - if (!strcmp(lgopts[opt_idx].name, "enable-hw-vlan")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN; - - if (!strcmp(lgopts[opt_idx].name, - "enable-hw-vlan-filter")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER; - - if (!strcmp(lgopts[opt_idx].name, - "enable-hw-vlan-strip")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP; - - if (!strcmp(lgopts[opt_idx].name, - "enable-hw-vlan-extend")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_EXTEND; - - if (!strcmp(lgopts[opt_idx].name, - "enable-hw-qinq-strip")) - rx_offloads |= RTE_ETH_RX_OFFLOAD_QINQ_STRIP; - - if (!strcmp(lgopts[opt_idx].name, "enable-drop-en")) - rx_drop_en = 1; - - if (!strcmp(lgopts[opt_idx].name, "disable-rss")) - rss_hf = 0; - if (!strcmp(lgopts[opt_idx].name, "port-topology")) { - if (!strcmp(optarg, "paired")) - port_topology = PORT_TOPOLOGY_PAIRED; - else if (!strcmp(optarg, "chained")) - port_topology = PORT_TOPOLOGY_CHAINED; - else if (!strcmp(optarg, "loop")) - port_topology = PORT_TOPOLOGY_LOOP; - else - rte_exit(EXIT_FAILURE, "port-topology %s invalid -" - " must be: paired, chained or loop\n", - optarg); - } - if (!strcmp(lgopts[opt_idx].name, "forward-mode")) - set_pkt_forwarding_mode(optarg); - if (!strcmp(lgopts[opt_idx].name, "rss-ip")) - rss_hf = RTE_ETH_RSS_IP; - if (!strcmp(lgopts[opt_idx].name, "rss-udp")) - rss_hf = RTE_ETH_RSS_UDP; - if (!strcmp(lgopts[opt_idx].name, "rss-level-inner")) - rss_hf |= RTE_ETH_RSS_LEVEL_INNERMOST; - if (!strcmp(lgopts[opt_idx].name, "rss-level-outer")) - rss_hf |= RTE_ETH_RSS_LEVEL_OUTERMOST; - if (!strcmp(lgopts[opt_idx].name, "rxq")) { - n = atoi(optarg); - if (n >= 0 && check_nb_rxq((queueid_t)n) == 0) - nb_rxq = (queueid_t) n; - else - rte_exit(EXIT_FAILURE, "rxq %d invalid - must be" - " >= 0 && <= %u\n", n, - get_allowed_max_nb_rxq(&pid)); - } - if (!strcmp(lgopts[opt_idx].name, "txq")) { - n = atoi(optarg); - if (n >= 0 && check_nb_txq((queueid_t)n) == 0) - nb_txq = (queueid_t) n; - else - rte_exit(EXIT_FAILURE, "txq %d invalid - must be" - " >= 0 && <= %u\n", n, - get_allowed_max_nb_txq(&pid)); - } - if (!strcmp(lgopts[opt_idx].name, "hairpinq")) { - n = atoi(optarg); - if (n >= 0 && - check_nb_hairpinq((queueid_t)n) == 0) - nb_hairpinq = (queueid_t) n; - else - rte_exit(EXIT_FAILURE, "txq %d invalid - must be" - " >= 0 && <= %u\n", n, - get_allowed_max_nb_hairpinq - (&pid)); - if ((n + nb_txq) < 0 || - check_nb_txq((queueid_t)(n + nb_txq)) != 0) - rte_exit(EXIT_FAILURE, "txq + hairpinq " - "%d invalid - must be" - " >= 0 && <= %u\n", - n + nb_txq, - get_allowed_max_nb_txq(&pid)); - if ((n + nb_rxq) < 0 || - check_nb_rxq((queueid_t)(n + nb_rxq)) != 0) - rte_exit(EXIT_FAILURE, "rxq + hairpinq " - "%d invalid - must be" - " >= 0 && <= %u\n", - n + nb_rxq, - get_allowed_max_nb_rxq(&pid)); - } - if (!strcmp(lgopts[opt_idx].name, "hairpin-mode")) { - char *end = NULL; - unsigned int n; - - errno = 0; - n = strtoul(optarg, &end, 0); - if (errno != 0 || end == optarg) - rte_exit(EXIT_FAILURE, "hairpin mode invalid\n"); - else - hairpin_mode = (uint32_t)n; - } - if (!strcmp(lgopts[opt_idx].name, "burst")) { - n = atoi(optarg); - if (n == 0) { - /* A burst size of zero means that the - * PMD should be queried for - * recommended Rx burst size. Since - * testpmd uses a single size for all - * ports, port 0 is queried for the - * value, on the assumption that all - * ports are of the same NIC model. - */ - ret = eth_dev_info_get_print_err( - 0, - &dev_info); - if (ret != 0) - rte_exit(EXIT_FAILURE, "Failed to get driver " - "recommended burst size, please provide a " - "value between 1 and %d\n", MAX_PKT_BURST); - - rec_nb_pkts = dev_info - .default_rxportconf.burst_size; - - if (rec_nb_pkts == 0) - rte_exit(EXIT_FAILURE, - "PMD does not recommend a burst size. " - "Provided value must be between " - "1 and %d\n", MAX_PKT_BURST); - else if (rec_nb_pkts > MAX_PKT_BURST) - rte_exit(EXIT_FAILURE, - "PMD recommended burst size of %d" - " exceeds maximum value of %d\n", - rec_nb_pkts, MAX_PKT_BURST); - printf("Using PMD-provided burst value of %d\n", - rec_nb_pkts); - nb_pkt_per_burst = rec_nb_pkts; - } else if (n > MAX_PKT_BURST) - rte_exit(EXIT_FAILURE, - "burst must be between1 and %d\n", - MAX_PKT_BURST); - else - nb_pkt_per_burst = (uint16_t) n; - } - if (!strcmp(lgopts[opt_idx].name, "flowgen-clones")) { - n = atoi(optarg); - if (n >= 0) - nb_pkt_flowgen_clones = (uint16_t) n; - else + case TESTPMD_OPT_DISABLE_CRC_STRIP_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_KEEP_CRC; + break; + case TESTPMD_OPT_ENABLE_LRO_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_TCP_LRO; + break; + case TESTPMD_OPT_ENABLE_SCATTER_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_SCATTER; + break; + case TESTPMD_OPT_ENABLE_RX_CKSUM_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_CHECKSUM; + break; + case TESTPMD_OPT_ENABLE_RX_TIMESTAMP_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP; + break; + case TESTPMD_OPT_ENABLE_HW_VLAN_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN; + break; + case TESTPMD_OPT_ENABLE_HW_VLAN_FILTER_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER; + break; + case TESTPMD_OPT_ENABLE_HW_VLAN_STRIP_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP; + break; + case TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_EXTEND; + break; + case TESTPMD_OPT_ENABLE_HW_QINQ_STRIP_NUM: + rx_offloads |= RTE_ETH_RX_OFFLOAD_QINQ_STRIP; + break; + case TESTPMD_OPT_ENABLE_DROP_EN_NUM: + rx_drop_en = 1; + break; + case TESTPMD_OPT_DISABLE_RSS_NUM: + rss_hf = 0; + break; + case TESTPMD_OPT_PORT_TOPOLOGY_NUM: + if (!strcmp(optarg, "paired")) + port_topology = PORT_TOPOLOGY_PAIRED; + else if (!strcmp(optarg, "chained")) + port_topology = PORT_TOPOLOGY_CHAINED; + else if (!strcmp(optarg, "loop")) + port_topology = PORT_TOPOLOGY_LOOP; + else + rte_exit(EXIT_FAILURE, "port-topology %s invalid -" + " must be: paired, chained or loop\n", + optarg); + break; + case TESTPMD_OPT_FORWARD_MODE_NUM: + set_pkt_forwarding_mode(optarg); + break; + case TESTPMD_OPT_RSS_IP_NUM: + rss_hf = RTE_ETH_RSS_IP; + break; + case TESTPMD_OPT_RSS_UDP_NUM: + rss_hf = RTE_ETH_RSS_UDP; + break; + case TESTPMD_OPT_RSS_LEVEL_INNER_NUM: + rss_hf |= RTE_ETH_RSS_LEVEL_INNERMOST; + break; + case TESTPMD_OPT_RSS_LEVEL_OUTER_NUM: + rss_hf |= RTE_ETH_RSS_LEVEL_OUTERMOST; + break; + case TESTPMD_OPT_RXQ_NUM: + n = atoi(optarg); + if (n >= 0 && check_nb_rxq((queueid_t)n) == 0) + nb_rxq = (queueid_t) n; + else + rte_exit(EXIT_FAILURE, "rxq %d invalid - must be" + " >= 0 && <= %u\n", n, + get_allowed_max_nb_rxq(&pid)); + break; + case TESTPMD_OPT_TXQ_NUM: + n = atoi(optarg); + if (n >= 0 && check_nb_txq((queueid_t)n) == 0) + nb_txq = (queueid_t) n; + else + rte_exit(EXIT_FAILURE, "txq %d invalid - must be" + " >= 0 && <= %u\n", n, + get_allowed_max_nb_txq(&pid)); + break; + case TESTPMD_OPT_HAIRPINQ_NUM: + n = atoi(optarg); + if (n >= 0 && + check_nb_hairpinq((queueid_t)n) == 0) + nb_hairpinq = (queueid_t) n; + else + rte_exit(EXIT_FAILURE, "txq %d invalid - must be" + " >= 0 && <= %u\n", n, + get_allowed_max_nb_hairpinq + (&pid)); + if ((n + nb_txq) < 0 || + check_nb_txq((queueid_t)(n + nb_txq)) != 0) + rte_exit(EXIT_FAILURE, "txq + hairpinq " + "%d invalid - must be" + " >= 0 && <= %u\n", + n + nb_txq, + get_allowed_max_nb_txq(&pid)); + if ((n + nb_rxq) < 0 || + check_nb_rxq((queueid_t)(n + nb_rxq)) != 0) + rte_exit(EXIT_FAILURE, "rxq + hairpinq " + "%d invalid - must be" + " >= 0 && <= %u\n", + n + nb_rxq, + get_allowed_max_nb_rxq(&pid)); + break; + case TESTPMD_OPT_HAIRPIN_MODE_NUM: { + char *end = NULL; + unsigned int n; + + errno = 0; + n = strtoul(optarg, &end, 0); + if (errno != 0 || end == optarg) + rte_exit(EXIT_FAILURE, "hairpin mode invalid\n"); + else + hairpin_mode = (uint32_t)n; + break; + } + case TESTPMD_OPT_BURST_NUM: + n = atoi(optarg); + if (n == 0) { + /* A burst size of zero means that the + * PMD should be queried for + * recommended Rx burst size. Since + * testpmd uses a single size for all + * ports, port 0 is queried for the + * value, on the assumption that all + * ports are of the same NIC model. + */ + ret = eth_dev_info_get_print_err( + 0, + &dev_info); + if (ret != 0) + rte_exit(EXIT_FAILURE, "Failed to get driver " + "recommended burst size, please provide a " + "value between 1 and %d\n", MAX_PKT_BURST); + + rec_nb_pkts = dev_info + .default_rxportconf.burst_size; + + if (rec_nb_pkts == 0) rte_exit(EXIT_FAILURE, - "clones must be >= 0 and <= current burst\n"); - } - if (!strcmp(lgopts[opt_idx].name, "flowgen-flows")) { - n = atoi(optarg); - if (n > 0) - nb_flows_flowgen = (int) n; - else + "PMD does not recommend a burst size. " + "Provided value must be between " + "1 and %d\n", MAX_PKT_BURST); + else if (rec_nb_pkts > MAX_PKT_BURST) rte_exit(EXIT_FAILURE, - "flows must be >= 1\n"); - } - if (!strcmp(lgopts[opt_idx].name, "mbcache")) { - n = atoi(optarg); - if ((n >= 0) && - (n <= RTE_MEMPOOL_CACHE_MAX_SIZE)) - mb_mempool_cache = (uint16_t) n; - else - rte_exit(EXIT_FAILURE, - "mbcache must be >= 0 and <= %d\n", - RTE_MEMPOOL_CACHE_MAX_SIZE); - } - if (!strcmp(lgopts[opt_idx].name, "txfreet")) { - n = atoi(optarg); - if (n >= 0) - tx_free_thresh = (int16_t)n; - else - rte_exit(EXIT_FAILURE, "txfreet must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "txrst")) { - n = atoi(optarg); - if (n >= 0) - tx_rs_thresh = (int16_t)n; - else - rte_exit(EXIT_FAILURE, "txrst must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxd")) { - n = atoi(optarg); - if (n > 0) { - if (rx_free_thresh >= n) - rte_exit(EXIT_FAILURE, - "rxd must be > " - "rx_free_thresh(%d)\n", - (int)rx_free_thresh); - else - nb_rxd = (uint16_t) n; - } else + "PMD recommended burst size of %d" + " exceeds maximum value of %d\n", + rec_nb_pkts, MAX_PKT_BURST); + printf("Using PMD-provided burst value of %d\n", + rec_nb_pkts); + nb_pkt_per_burst = rec_nb_pkts; + } else if (n > MAX_PKT_BURST) + rte_exit(EXIT_FAILURE, + "burst must be between1 and %d\n", + MAX_PKT_BURST); + else + nb_pkt_per_burst = (uint16_t) n; + break; + case TESTPMD_OPT_FLOWGEN_CLONES_NUM: + n = atoi(optarg); + if (n >= 0) + nb_pkt_flowgen_clones = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, + "clones must be >= 0 and <= current burst\n"); + break; + case TESTPMD_OPT_FLOWGEN_FLOWS_NUM: + n = atoi(optarg); + if (n > 0) + nb_flows_flowgen = (int) n; + else + rte_exit(EXIT_FAILURE, + "flows must be >= 1\n"); + break; + case TESTPMD_OPT_MBCACHE_NUM: + n = atoi(optarg); + if ((n >= 0) && + (n <= RTE_MEMPOOL_CACHE_MAX_SIZE)) + mb_mempool_cache = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, + "mbcache must be >= 0 and <= %d\n", + RTE_MEMPOOL_CACHE_MAX_SIZE); + break; + case TESTPMD_OPT_TXFREET_NUM: + n = atoi(optarg); + if (n >= 0) + tx_free_thresh = (int16_t)n; + else + rte_exit(EXIT_FAILURE, "txfreet must be >= 0\n"); + break; + case TESTPMD_OPT_TXRST_NUM: + n = atoi(optarg); + if (n >= 0) + tx_rs_thresh = (int16_t)n; + else + rte_exit(EXIT_FAILURE, "txrst must be >= 0\n"); + break; + case TESTPMD_OPT_RXD_NUM: + n = atoi(optarg); + if (n > 0) { + if (rx_free_thresh >= n) rte_exit(EXIT_FAILURE, - "rxd(%d) invalid - must be > 0\n", - n); - } - if (!strcmp(lgopts[opt_idx].name, "txd")) { - n = atoi(optarg); - if (n > 0) - nb_txd = (uint16_t) n; + "rxd must be > " + "rx_free_thresh(%d)\n", + (int)rx_free_thresh); else - rte_exit(EXIT_FAILURE, "txd must be in > 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "txpt")) { - n = atoi(optarg); - if (n >= 0) - tx_pthresh = (int8_t)n; - else - rte_exit(EXIT_FAILURE, "txpt must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "txht")) { - n = atoi(optarg); - if (n >= 0) - tx_hthresh = (int8_t)n; - else - rte_exit(EXIT_FAILURE, "txht must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "txwt")) { - n = atoi(optarg); - if (n >= 0) - tx_wthresh = (int8_t)n; - else - rte_exit(EXIT_FAILURE, "txwt must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxpt")) { - n = atoi(optarg); - if (n >= 0) - rx_pthresh = (int8_t)n; - else - rte_exit(EXIT_FAILURE, "rxpt must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxht")) { - n = atoi(optarg); - if (n >= 0) - rx_hthresh = (int8_t)n; - else - rte_exit(EXIT_FAILURE, "rxht must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxwt")) { - n = atoi(optarg); - if (n >= 0) - rx_wthresh = (int8_t)n; - else - rte_exit(EXIT_FAILURE, "rxwt must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxfreet")) { + nb_rxd = (uint16_t) n; + } else + rte_exit(EXIT_FAILURE, + "rxd(%d) invalid - must be > 0\n", + n); + break; + case TESTPMD_OPT_TXD_NUM: + n = atoi(optarg); + if (n > 0) + nb_txd = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, "txd must be in > 0\n"); + break; + case TESTPMD_OPT_TXPT_NUM: + n = atoi(optarg); + if (n >= 0) + tx_pthresh = (int8_t)n; + else + rte_exit(EXIT_FAILURE, "txpt must be >= 0\n"); + break; + case TESTPMD_OPT_TXHT_NUM: + n = atoi(optarg); + if (n >= 0) + tx_hthresh = (int8_t)n; + else + rte_exit(EXIT_FAILURE, "txht must be >= 0\n"); + break; + case TESTPMD_OPT_TXWT_NUM: + n = atoi(optarg); + if (n >= 0) + tx_wthresh = (int8_t)n; + else + rte_exit(EXIT_FAILURE, "txwt must be >= 0\n"); + break; + case TESTPMD_OPT_RXPT_NUM: + n = atoi(optarg); + if (n >= 0) + rx_pthresh = (int8_t)n; + else + rte_exit(EXIT_FAILURE, "rxpt must be >= 0\n"); + break; + case TESTPMD_OPT_RXHT_NUM: + n = atoi(optarg); + if (n >= 0) + rx_hthresh = (int8_t)n; + else + rte_exit(EXIT_FAILURE, "rxht must be >= 0\n"); + break; + case TESTPMD_OPT_RXWT_NUM: + n = atoi(optarg); + if (n >= 0) + rx_wthresh = (int8_t)n; + else + rte_exit(EXIT_FAILURE, "rxwt must be >= 0\n"); + break; + case TESTPMD_OPT_RXFREET_NUM: + n = atoi(optarg); + if (n >= 0) + rx_free_thresh = (int16_t)n; + else + rte_exit(EXIT_FAILURE, "rxfreet must be >= 0\n"); + break; + case TESTPMD_OPT_RXOFFS_NUM: { + unsigned int seg_off[MAX_SEGS_BUFFER_SPLIT]; + unsigned int nb_offs; + + nb_offs = parse_item_list + (optarg, "rxpkt offsets", + MAX_SEGS_BUFFER_SPLIT, + seg_off, 0); + if (nb_offs > 0) + set_rx_pkt_offsets(seg_off, nb_offs); + else + rte_exit(EXIT_FAILURE, "bad rxoffs\n"); + break; + } + case TESTPMD_OPT_RXPKTS_NUM: { + unsigned int seg_len[MAX_SEGS_BUFFER_SPLIT]; + unsigned int nb_segs; + + nb_segs = parse_item_list + (optarg, "rxpkt segments", + MAX_SEGS_BUFFER_SPLIT, + seg_len, 0); + if (nb_segs > 0) + set_rx_pkt_segments(seg_len, nb_segs); + else + rte_exit(EXIT_FAILURE, "bad rxpkts\n"); + break; + } + case TESTPMD_OPT_RXHDRS_NUM: { + unsigned int seg_hdrs[MAX_SEGS_BUFFER_SPLIT]; + unsigned int nb_segs; + + nb_segs = parse_hdrs_list + (optarg, "rxpkt segments", + MAX_SEGS_BUFFER_SPLIT, + seg_hdrs); + if (nb_segs > 0) + set_rx_pkt_hdrs(seg_hdrs, nb_segs); + else + rte_exit(EXIT_FAILURE, "bad rxpkts\n"); + break; + } + case TESTPMD_OPT_TXPKTS_NUM: { + unsigned int seg_lengths[RTE_MAX_SEGS_PER_PKT]; + unsigned int nb_segs; + + nb_segs = parse_item_list(optarg, "txpkt segments", + RTE_MAX_SEGS_PER_PKT, seg_lengths, 0); + if (nb_segs > 0) + set_tx_pkt_segments(seg_lengths, nb_segs); + else + rte_exit(EXIT_FAILURE, "bad txpkts\n"); + break; + } + case TESTPMD_OPT_MULTI_RX_MEMPOOL_NUM: + multi_rx_mempool = 1; + break; + case TESTPMD_OPT_TXONLY_MULTI_FLOW_NUM: + txonly_multi_flow = 1; + break; + case TESTPMD_OPT_RXQ_SHARE_NUM: + if (optarg == NULL) { + rxq_share = UINT32_MAX; + } else { n = atoi(optarg); if (n >= 0) - rx_free_thresh = (int16_t)n; - else - rte_exit(EXIT_FAILURE, "rxfreet must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxoffs")) { - unsigned int seg_off[MAX_SEGS_BUFFER_SPLIT]; - unsigned int nb_offs; - - nb_offs = parse_item_list - (optarg, "rxpkt offsets", - MAX_SEGS_BUFFER_SPLIT, - seg_off, 0); - if (nb_offs > 0) - set_rx_pkt_offsets(seg_off, nb_offs); - else - rte_exit(EXIT_FAILURE, "bad rxoffs\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxpkts")) { - unsigned int seg_len[MAX_SEGS_BUFFER_SPLIT]; - unsigned int nb_segs; - nb_segs = parse_item_list - (optarg, "rxpkt segments", - MAX_SEGS_BUFFER_SPLIT, - seg_len, 0); - if (nb_segs > 0) - set_rx_pkt_segments(seg_len, nb_segs); - else - rte_exit(EXIT_FAILURE, "bad rxpkts\n"); - } - if (!strcmp(lgopts[opt_idx].name, "rxhdrs")) { - unsigned int seg_hdrs[MAX_SEGS_BUFFER_SPLIT]; - unsigned int nb_segs; - - nb_segs = parse_hdrs_list - (optarg, "rxpkt segments", - MAX_SEGS_BUFFER_SPLIT, - seg_hdrs); - if (nb_segs > 0) - set_rx_pkt_hdrs(seg_hdrs, nb_segs); - else - rte_exit(EXIT_FAILURE, "bad rxpkts\n"); - } - if (!strcmp(lgopts[opt_idx].name, "txpkts")) { - unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT]; - unsigned int nb_segs; - - nb_segs = parse_item_list(optarg, "txpkt segments", - RTE_MAX_SEGS_PER_PKT, seg_lengths, 0); - if (nb_segs > 0) - set_tx_pkt_segments(seg_lengths, nb_segs); + rxq_share = (uint32_t)n; else - rte_exit(EXIT_FAILURE, "bad txpkts\n"); + rte_exit(EXIT_FAILURE, "rxq-share must be >= 0\n"); } - if (!strcmp(lgopts[opt_idx].name, "multi-rx-mempool")) - multi_rx_mempool = 1; - if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow")) - txonly_multi_flow = 1; - if (!strcmp(lgopts[opt_idx].name, "rxq-share")) { - if (optarg == NULL) { - rxq_share = UINT32_MAX; - } else { - n = atoi(optarg); - if (n >= 0) - rxq_share = (uint32_t)n; - else - rte_exit(EXIT_FAILURE, "rxq-share must be >= 0\n"); - } - } - if (!strcmp(lgopts[opt_idx].name, "no-flush-rx")) - no_flush_rx = 1; - if (!strcmp(lgopts[opt_idx].name, "eth-link-speed")) { - n = atoi(optarg); - if (n >= 0 && parse_link_speed(n) > 0) - eth_link_speed = parse_link_speed(n); - } - if (!strcmp(lgopts[opt_idx].name, "disable-link-check")) - no_link_check = 1; - if (!strcmp(lgopts[opt_idx].name, "disable-device-start")) - no_device_start = 1; - if (!strcmp(lgopts[opt_idx].name, "no-lsc-interrupt")) - lsc_interrupt = 0; - if (!strcmp(lgopts[opt_idx].name, "no-rmv-interrupt")) - rmv_interrupt = 0; - if (!strcmp(lgopts[opt_idx].name, "flow-isolate-all")) - flow_isolate_all = 1; - if (!strcmp(lgopts[opt_idx].name, "disable-flow-flush")) - no_flow_flush = 1; - if (!strcmp(lgopts[opt_idx].name, "tx-offloads")) { - char *end = NULL; - n = strtoull(optarg, &end, 16); - if (n >= 0) - tx_offloads = (uint64_t)n; - else - rte_exit(EXIT_FAILURE, - "tx-offloads must be >= 0\n"); + break; + case TESTPMD_OPT_NO_FLUSH_RX_NUM: + no_flush_rx = 1; + break; + case TESTPMD_OPT_ETH_LINK_SPEED_NUM: + n = atoi(optarg); + if (n >= 0 && parse_link_speed(n) > 0) + eth_link_speed = parse_link_speed(n); + break; + case TESTPMD_OPT_DISABLE_LINK_CHECK_NUM: + no_link_check = 1; + break; + case TESTPMD_OPT_DISABLE_DEVICE_START_NUM: + no_device_start = 1; + break; + case TESTPMD_OPT_NO_LSC_INTERRUPT_NUM: + lsc_interrupt = 0; + break; + case TESTPMD_OPT_NO_RMV_INTERRUPT_NUM: + rmv_interrupt = 0; + break; + case TESTPMD_OPT_FLOW_ISOLATE_ALL_NUM: + flow_isolate_all = 1; + break; + case TESTPMD_OPT_DISABLE_FLOW_FLUSH_NUM: + no_flow_flush = 1; + break; + case TESTPMD_OPT_TX_OFFLOADS_NUM: { + char *end = NULL; + + n = strtoull(optarg, &end, 16); + if (n >= 0) + tx_offloads = (uint64_t)n; + else + rte_exit(EXIT_FAILURE, + "tx-offloads must be >= 0\n"); + break; + } + case TESTPMD_OPT_RX_OFFLOADS_NUM: { + char *end = NULL; + + n = strtoull(optarg, &end, 16); + if (n >= 0) + rx_offloads = (uint64_t)n; + else + rte_exit(EXIT_FAILURE, + "rx-offloads must be >= 0\n"); + break; + } + case TESTPMD_OPT_VXLAN_GPE_PORT_NUM: + n = atoi(optarg); + if (n >= 0) + vxlan_gpe_udp_port = (uint16_t)n; + else + rte_exit(EXIT_FAILURE, + "vxlan-gpe-port must be >= 0\n"); + break; + case TESTPMD_OPT_GENEVE_PARSED_PORT_NUM: + n = atoi(optarg); + if (n >= 0) + geneve_udp_port = (uint16_t)n; + else + rte_exit(EXIT_FAILURE, + "geneve-parsed-port must be >= 0\n"); + break; + case TESTPMD_OPT_PRINT_EVENT_NUM: + if (parse_event_printing_config(optarg, 1)) { + rte_exit(EXIT_FAILURE, + "invalid print-event argument\n"); } - - if (!strcmp(lgopts[opt_idx].name, "rx-offloads")) { - char *end = NULL; - n = strtoull(optarg, &end, 16); - if (n >= 0) - rx_offloads = (uint64_t)n; - else - rte_exit(EXIT_FAILURE, - "rx-offloads must be >= 0\n"); + break; + case TESTPMD_OPT_MASK_EVENT_NUM: + if (parse_event_printing_config(optarg, 0)) { + rte_exit(EXIT_FAILURE, + "invalid mask-event argument\n"); } + break; + case TESTPMD_OPT_HOT_PLUG_NUM: + hot_plug = 1; + break; + case TESTPMD_OPT_MLOCKALL_NUM: + do_mlockall = 1; + break; + case TESTPMD_OPT_NO_MLOCKALL_NUM: + do_mlockall = 0; + break; + case TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE_NUM: + n = atoi(optarg); + if (n >= 0) + noisy_tx_sw_bufsz = n; + else + rte_exit(EXIT_FAILURE, + "noisy-tx-sw-buffer-size must be >= 0\n"); + break; + case TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME_NUM: + n = atoi(optarg); + if (n >= 0) + noisy_tx_sw_buf_flush_time = n; + else + rte_exit(EXIT_FAILURE, + "noisy-tx-sw-buffer-flushtime must be >= 0\n"); + break; + case TESTPMD_OPT_NOISY_LKUP_MEMORY_NUM: + n = atoi(optarg); + if (n >= 0) + noisy_lkup_mem_sz = n; + else + rte_exit(EXIT_FAILURE, + "noisy-lkup-memory must be >= 0\n"); + break; + case TESTPMD_OPT_NOISY_LKUP_NUM_WRITES_NUM: + n = atoi(optarg); + if (n >= 0) + noisy_lkup_num_writes = n; + else + rte_exit(EXIT_FAILURE, + "noisy-lkup-num-writes must be >= 0\n"); + break; + case TESTPMD_OPT_NOISY_LKUP_NUM_READS_NUM: + n = atoi(optarg); + if (n >= 0) + noisy_lkup_num_reads = n; + else + rte_exit(EXIT_FAILURE, + "noisy-lkup-num-reads must be >= 0\n"); + break; + case TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES_NUM: + n = atoi(optarg); + if (n >= 0) + noisy_lkup_num_reads_writes = n; + else + rte_exit(EXIT_FAILURE, + "noisy-lkup-num-reads-writes must be >= 0\n"); + break; + case TESTPMD_OPT_NOISY_FORWARD_MODE_NUM: { + unsigned int i; - if (!strcmp(lgopts[opt_idx].name, "vxlan-gpe-port")) { - n = atoi(optarg); - if (n >= 0) - vxlan_gpe_udp_port = (uint16_t)n; - else - rte_exit(EXIT_FAILURE, - "vxlan-gpe-port must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, - "geneve-parsed-port")) { - n = atoi(optarg); - if (n >= 0) - geneve_udp_port = (uint16_t)n; - else - rte_exit(EXIT_FAILURE, - "geneve-parsed-port must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, "print-event")) - if (parse_event_printing_config(optarg, 1)) { - rte_exit(EXIT_FAILURE, - "invalid print-event argument\n"); - } - if (!strcmp(lgopts[opt_idx].name, "mask-event")) - if (parse_event_printing_config(optarg, 0)) { - rte_exit(EXIT_FAILURE, - "invalid mask-event argument\n"); + for (i = 0; i < NOISY_FWD_MODE_MAX; i++) { + if (!strcmp(optarg, noisy_fwd_mode_desc[i])) { + noisy_fwd_mode = i; + break; } - if (!strcmp(lgopts[opt_idx].name, "hot-plug")) - hot_plug = 1; - if (!strcmp(lgopts[opt_idx].name, "mlockall")) - do_mlockall = 1; - if (!strcmp(lgopts[opt_idx].name, "no-mlockall")) - do_mlockall = 0; - if (!strcmp(lgopts[opt_idx].name, - "noisy-tx-sw-buffer-size")) { - n = atoi(optarg); - if (n >= 0) - noisy_tx_sw_bufsz = n; - else - rte_exit(EXIT_FAILURE, - "noisy-tx-sw-buffer-size must be >= 0\n"); } - if (!strcmp(lgopts[opt_idx].name, - "noisy-tx-sw-buffer-flushtime")) { - n = atoi(optarg); - if (n >= 0) - noisy_tx_sw_buf_flush_time = n; - else - rte_exit(EXIT_FAILURE, - "noisy-tx-sw-buffer-flushtime must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, - "noisy-lkup-memory")) { - n = atoi(optarg); - if (n >= 0) - noisy_lkup_mem_sz = n; - else - rte_exit(EXIT_FAILURE, - "noisy-lkup-memory must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, - "noisy-lkup-num-writes")) { - n = atoi(optarg); - if (n >= 0) - noisy_lkup_num_writes = n; - else - rte_exit(EXIT_FAILURE, - "noisy-lkup-num-writes must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, - "noisy-lkup-num-reads")) { - n = atoi(optarg); - if (n >= 0) - noisy_lkup_num_reads = n; - else - rte_exit(EXIT_FAILURE, - "noisy-lkup-num-reads must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, - "noisy-lkup-num-reads-writes")) { - n = atoi(optarg); - if (n >= 0) - noisy_lkup_num_reads_writes = n; - else - rte_exit(EXIT_FAILURE, - "noisy-lkup-num-reads-writes must be >= 0\n"); - } - if (!strcmp(lgopts[opt_idx].name, - "noisy-forward-mode")) { - int i; - for (i = 0; i < NOISY_FWD_MODE_MAX; i++) - if (!strcmp(optarg, noisy_fwd_mode_desc[i])) { - noisy_fwd_mode = i; - break; - } - if (i == NOISY_FWD_MODE_MAX) - rte_exit(EXIT_FAILURE, "noisy-forward-mode %s invalid," - " must be a valid noisy-forward-mode value\n", - optarg); - } - if (!strcmp(lgopts[opt_idx].name, "no-iova-contig")) - mempool_flags = RTE_MEMPOOL_F_NO_IOVA_CONTIG; - - if (!strcmp(lgopts[opt_idx].name, "rx-mq-mode")) { - char *end = NULL; - n = strtoul(optarg, &end, 16); - if (n >= 0 && n <= RTE_ETH_MQ_RX_VMDQ_DCB_RSS) - rx_mq_mode = (enum rte_eth_rx_mq_mode)n; - else - rte_exit(EXIT_FAILURE, - "rx-mq-mode must be >= 0 and <= %d\n", - RTE_ETH_MQ_RX_VMDQ_DCB_RSS); - } - if (!strcmp(lgopts[opt_idx].name, "record-core-cycles")) - record_core_cycles = 1; - if (!strcmp(lgopts[opt_idx].name, "record-burst-stats")) - record_burst_stats = 1; - if (!strcmp(lgopts[opt_idx].name, PARAM_NUM_PROCS)) - num_procs = atoi(optarg); - if (!strcmp(lgopts[opt_idx].name, PARAM_PROC_ID)) - proc_id = atoi(optarg); + if (i == NOISY_FWD_MODE_MAX) + rte_exit(EXIT_FAILURE, "noisy-forward-mode %s invalid," + " must be a valid noisy-forward-mode value\n", + optarg); break; - case 'h': - usage(argv[0]); - exit(EXIT_SUCCESS); + } + case TESTPMD_OPT_NO_IOVA_CONTIG_NUM: + mempool_flags = RTE_MEMPOOL_F_NO_IOVA_CONTIG; + break; + case TESTPMD_OPT_RX_MQ_MODE_NUM: { + char *end = NULL; + + n = strtoul(optarg, &end, 16); + if (n >= 0 && n <= RTE_ETH_MQ_RX_VMDQ_DCB_RSS) + rx_mq_mode = (enum rte_eth_rx_mq_mode)n; + else + rte_exit(EXIT_FAILURE, + "rx-mq-mode must be >= 0 and <= %d\n", + RTE_ETH_MQ_RX_VMDQ_DCB_RSS); + break; + } + case TESTPMD_OPT_RECORD_CORE_CYCLES_NUM: + record_core_cycles = 1; + break; + case TESTPMD_OPT_RECORD_BURST_STATS_NUM: + record_burst_stats = 1; + break; + case TESTPMD_OPT_NUM_PROCS_NUM: + num_procs = atoi(optarg); + break; + case TESTPMD_OPT_PROC_ID_NUM: + proc_id = atoi(optarg); break; default: usage(argv[0]); @@ -1491,9 +1733,9 @@ launch_args_parse(int argc, char** argv) if (proc_id >= (int)num_procs) rte_exit(EXIT_FAILURE, - "The multi-process option '%s(%d)' should be less than '%s(%u)'\n", - PARAM_PROC_ID, proc_id, - PARAM_NUM_PROCS, num_procs); + "The multi-process option '%s(%d)' should be less than '%s(%u)'\n", + TESTPMD_OPT_PROC_ID, proc_id, + TESTPMD_OPT_NUM_PROCS, num_procs); /* Set offload configuration from command line parameters. */ rx_mode.offloads = rx_offloads;