From patchwork Wed Apr 6 15:10:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109268 X-Patchwork-Delegate: thomas@monjalon.net 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 8F693A0508; Wed, 6 Apr 2022 17:11:15 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 797444285E; Wed, 6 Apr 2022 17:11:11 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id AE2BC40689 for ; Wed, 6 Apr 2022 17:11:09 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 8803D184FF0; Wed, 6 Apr 2022 17:11:08 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Y36FOWUWusCG; Wed, 6 Apr 2022 17:11:07 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 078D816BC11; Wed, 6 Apr 2022 17:11:06 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 01/24] dts: merge DTS CONTRIBUTING.TXT to DPDK Date: Wed, 6 Apr 2022 15:10:43 +0000 Message-Id: <20220406151106.2915304-2-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/CONTRIBUTING.TXT | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 dts/CONTRIBUTING.TXT diff --git a/dts/CONTRIBUTING.TXT b/dts/CONTRIBUTING.TXT new file mode 100644 index 0000000000..eae20441d9 --- /dev/null +++ b/dts/CONTRIBUTING.TXT @@ -0,0 +1,50 @@ +Contributors Guide +================== + +This document outlines how to contribute code to the DTS project. + +Getting the code +---------------- + +The DTS code can be cloned from the repository on dpdk.org as follows: + + git clone git://dpdk.org/tools/dts + git clone http://dpdk.org/git/tools/dts + +The code can be browsed at http://dpdk.org/browse/tools/dts/ + +Submitting Patches +------------------ + +Contributions to DTS should be submitted as git formatted patches to the +DTS mailing list: dts@dpdk.org + +Note you must first register for the mailing list at: +http://dpdk.org/ml/listinfo/dts + +The commit message must end with a "Signed-off-by:" line which is added using: + + git commit --signoff # or -s + +The purpose of the signoff is explained in the Linux kernel guidelines +Developer's Certificate of Origin: +https://www.kernel.org/doc/Documentation/process/submitting-patches.rst + +Note: + All developers must ensure that they have read, understood and complied + with the Developer's Certificate of Origin section of the documentation + prior to applying the signoff and submitting a patch. + +The DPDK Code Contributors guidelines contain information that is +useful for submitting patches to DTS: +http://dpdk.org/doc/guides/contributing/index.html + +Coding Guidelines +----------------- + +* Python code should follow PEP8. + +Maintainer +---------- + +The DTS maintainer is: Lijuan Tu From patchwork Wed Apr 6 15:10:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109270 X-Patchwork-Delegate: thomas@monjalon.net 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 3DE0EA0508; Wed, 6 Apr 2022 17:11:28 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B653B42871; Wed, 6 Apr 2022 17:11:13 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 93E9042860 for ; Wed, 6 Apr 2022 17:11:11 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 360EA184FF2; Wed, 6 Apr 2022 17:11:10 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id PcHVP2eTlq-h; Wed, 6 Apr 2022 17:11:09 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 6C6C4184FE8; Wed, 6 Apr 2022 17:11:07 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 02/24] dts: merge DTS doc/dts_gsg/Makefile to DPDK Date: Wed, 6 Apr 2022 15:10:44 +0000 Message-Id: <20220406151106.2915304-3-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/Makefile | 156 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 dts/doc/dts_gsg/Makefile diff --git a/dts/doc/dts_gsg/Makefile b/dts/doc/dts_gsg/Makefile new file mode 100644 index 0000000000..e69cfc7f94 --- /dev/null +++ b/dts/doc/dts_gsg/Makefile @@ -0,0 +1,156 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build +SOURCEDIR = ./ + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter + +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCEDIR) + +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCEDIR) + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -E -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/DPDKDTFTestFramework.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DPDKDTFTestFramework.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/DPDKDTFTestFramework" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DPDKDTFTestFramework" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." From patchwork Wed Apr 6 15:10:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109269 X-Patchwork-Delegate: thomas@monjalon.net 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 DE209A0508; Wed, 6 Apr 2022 17:11:21 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A5BE442869; Wed, 6 Apr 2022 17:11:12 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 9753342862 for ; Wed, 6 Apr 2022 17:11:11 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 74661184FF4; Wed, 6 Apr 2022 17:11:10 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ECwMAJDf3Bxp; Wed, 6 Apr 2022 17:11:09 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id D8160184FE9; Wed, 6 Apr 2022 17:11:07 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 03/24] dts: merge DTS doc/dts_gsg/conf.py to DPDK Date: Wed, 6 Apr 2022 15:10:45 +0000 Message-Id: <20220406151106.2915304-4-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/conf.py | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 dts/doc/dts_gsg/conf.py diff --git a/dts/doc/dts_gsg/conf.py b/dts/doc/dts_gsg/conf.py new file mode 100644 index 0000000000..50725c30f2 --- /dev/null +++ b/dts/doc/dts_gsg/conf.py @@ -0,0 +1,50 @@ +# BSD LICENSE +# Copyright(c) 2010-2017 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import subprocess + +try: + import sphinx_rtd_theme + + html_theme = "sphinx_rtd_theme" + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] +except: + pass + +project = "DPDK Test Suite" +copyright = "2017, dpdk.org" + +strip_version_cmd = ( + "import sys;sys.path.append('../..');import version; print version.dts_version()" +) +version = subprocess.check_output(["python", "-c", strip_version_cmd]) +version = version.decode("utf-8").rstrip() +release = version + +master_doc = "index" From patchwork Wed Apr 6 15:10:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109272 X-Patchwork-Delegate: thomas@monjalon.net 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 67B8CA0508; Wed, 6 Apr 2022 17:11:45 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7CF5242890; Wed, 6 Apr 2022 17:11:17 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 3FF2642890 for ; Wed, 6 Apr 2022 17:11:16 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 6AA82184FFD; Wed, 6 Apr 2022 17:11:15 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TiLE8apXx1Un; Wed, 6 Apr 2022 17:11:11 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 6822A184FEE; Wed, 6 Apr 2022 17:11:08 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 04/24] dts: merge DTS doc/dts_gsg/image/dts_network_arch.png to DPDK Date: Wed, 6 Apr 2022 15:10:46 +0000 Message-Id: <20220406151106.2915304-5-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/image/dts_network_arch.png | Bin 0 -> 59759 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dts/doc/dts_gsg/image/dts_network_arch.png GIT binary patch literal 59759 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 Ov`*@u$UbI! X-Patchwork-Id: 109271 X-Patchwork-Delegate: thomas@monjalon.net 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 2E9A3A0508; Wed, 6 Apr 2022 17:11:35 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C692C42878; Wed, 6 Apr 2022 17:11:14 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id C0D8642877 for ; Wed, 6 Apr 2022 17:11:13 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id DBD50184FF8; Wed, 6 Apr 2022 17:11:12 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id eAn4Zlb0LONb; Wed, 6 Apr 2022 17:11:11 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 35F3C16BC0E; Wed, 6 Apr 2022 17:11:09 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 05/24] dts: merge DTS doc/dts_gsg/image/dts_result.png to DPDK Date: Wed, 6 Apr 2022 15:10:47 +0000 Message-Id: <20220406151106.2915304-6-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/image/dts_result.png | Bin 0 -> 10924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dts/doc/dts_gsg/image/dts_result.png GIT binary patch literal 10924 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 E4>nnT`~Uy| literal 0 HcmV?d00001 diff --git a/dts/doc/dts_gsg/image/dts_result.png b/dts/doc/dts_gsg/image/dts_result.png new file mode 100644 index 0000000000000000000000000000000000000000..65e0ada586bfb5264eab02f7a6dedfe898e12849 From patchwork Wed Apr 6 15:10:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109275 X-Patchwork-Delegate: thomas@monjalon.net 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 AD8E0A0508; Wed, 6 Apr 2022 17:12:12 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B607B428AE; Wed, 6 Apr 2022 17:11:25 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id F2F8D42877 for ; Wed, 6 Apr 2022 17:11:22 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 4F4AD1A39D9; Wed, 6 Apr 2022 17:11:22 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KzxfIIrOby5R; Wed, 6 Apr 2022 17:11:13 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id B744C16BC11; Wed, 6 Apr 2022 17:11:09 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 06/24] dts: merge DTS doc/dts_gsg/image/dts_soft_arch.png to DPDK Date: Wed, 6 Apr 2022 15:10:48 +0000 Message-Id: <20220406151106.2915304-7-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/image/dts_soft_arch.png | Bin 0 -> 120978 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dts/doc/dts_gsg/image/dts_soft_arch.png GIT binary patch literal 120978 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≪wcx^9Yp?a_ogJD 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 X-Patchwork-Id: 109273 X-Patchwork-Delegate: thomas@monjalon.net 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 83008A0508; Wed, 6 Apr 2022 17:11:56 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BB8C7428A5; Wed, 6 Apr 2022 17:11:19 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 375D442885 for ; Wed, 6 Apr 2022 17:11:19 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 581141A39D9; Wed, 6 Apr 2022 17:11:18 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BoFYG5pwwmyl; Wed, 6 Apr 2022 17:11:16 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 2A863184FF1; Wed, 6 Apr 2022 17:11:10 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 07/24] dts: merge DTS doc/dts_gsg/image/scene_pf_passthrough.svg to DPDK Date: Wed, 6 Apr 2022 15:10:49 +0000 Message-Id: <20220406151106.2915304-8-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- .../dts_gsg/image/scene_pf_passthrough.svg | 376 ++++++++++++++++++ 1 file changed, 376 insertions(+) create mode 100644 dts/doc/dts_gsg/image/scene_pf_passthrough.svg diff --git a/dts/doc/dts_gsg/image/scene_pf_passthrough.svg b/dts/doc/dts_gsg/image/scene_pf_passthrough.svg new file mode 100644 index 0000000000..de9b8d0328 --- /dev/null +++ b/dts/doc/dts_gsg/image/scene_pf_passthrough.svg @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + Sheet.8 + + + + Sheet.10 + VM 0 + + + + VM 0 + + Sheet.11 + DPDK VF PMD + + + + DPDK VF PMD + + Sheet.17 + + + + Sheet.19 + PF0 VF0 + + + + PF0 VF0 + + Sheet.20 + PF0 VF1 + + + + PF0 VF1 + + Sheet.29 + KVM + + + + KVM + + Sheet.32 + Linux + + + + Linux + + Sheet.38 + + + + Sheet.40 + Intel Architecture with VT-d + + + + Intel Architecture with VT-d + + Sheet.49 + NIC(card1 Port0) + + + + NIC(card1 Port0) + + Sheet.77 + Pool (VF1) + + + + Pool (VF1) + + Sheet.87 + SRIOV Switch + + + + SRIOV Switch + + Rounded Rectangle + + + + + + + + + + + + + + + + + + + + + + + + + Sheet.93 + Pool (VF0) + + + + Pool (VF0) + + Sheet.94 + Pool (PF) + + + + Pool (PF) + + Sheet.97 + NIC(card2 Port1) + + + + NIC(card2 Port1) + + Sheet.98 + Pool (VF1) + + + + Pool (VF1) + + Sheet.99 + SRIOV Switch + + + + SRIOV Switch + + Rounded Rectangle.100 + + + + + + + + + + + + + + + + + + + + + + + + + Sheet.101 + Pool (VF0) + + + + Pool (VF0) + + Sheet.102 + Pool (PF) + + + + Pool (PF) + + Curve connect 1 + + + + + + + + + Curve connect 1.104 + + + + + + + + + Curve connect 1.106 + + + + + + + + + Curve connect 1.107 + + + + + + + + + + + + 1-D single + + Sheet.109 + + + + + + + + + Sheet.110 + + + + Sheet.111 + + + + + + + + 1-D single.112 + + Sheet.113 + + + + + + + + + Sheet.114 + + + + Sheet.115 + + + + + From patchwork Wed Apr 6 15:10:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109274 X-Patchwork-Delegate: thomas@monjalon.net 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 844AAA0508; Wed, 6 Apr 2022 17:12:04 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B80CC4289C; Wed, 6 Apr 2022 17:11:24 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 854C842877 for ; Wed, 6 Apr 2022 17:11:22 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id D4CF5184FF1; Wed, 6 Apr 2022 17:11:21 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nVT_hLEBhhzm; Wed, 6 Apr 2022 17:11:19 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 0826A184FF6; Wed, 6 Apr 2022 17:11:10 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 08/24] dts: merge DTS doc/dts_gsg/image/virt_flow.svg to DPDK Date: Wed, 6 Apr 2022 15:10:50 +0000 Message-Id: <20220406151106.2915304-9-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/image/virt_flow.svg | 717 ++++++++++++++++++++++++++++ 1 file changed, 717 insertions(+) create mode 100644 dts/doc/dts_gsg/image/virt_flow.svg diff --git a/dts/doc/dts_gsg/image/virt_flow.svg b/dts/doc/dts_gsg/image/virt_flow.svg new file mode 100644 index 0000000000..f8148054bc --- /dev/null +++ b/dts/doc/dts_gsg/image/virt_flow.svg @@ -0,0 +1,717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + Object lifeline + scene:Virutal Scenario + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + scene:Virutal Scenario + + + + + + + + Object lifeline.6 + resource:Virtual Resource + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + resource:Virtual Resource + + + + + + + + Object lifeline.16 + kvm:Hypervisor + + Sheet.17 + + + + Sheet.18 + + + + Sheet.19 + + + Sheet.20 + + + + + + + kvm:Hypervisor + + + + + + + + Object lifeline.21 + vm_dut:Virutal DUT + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + Sheet.25 + + + + + + + vm_dut:Virutal DUT + + + Activation + + + + + + + Message + + + + + + + + + + Return Message + + + + + + + + + + Activation.29 + + + + + + + Sheet.36 + allocate_cpu(number, socket) + + + + allocate_cpu(number, socket) + + Activation.40 + + + + + + + Self Message + + + + + + + + + + Sheet.42 + Load_config() + + + + Load_config() + + + + + + + Object lifeline.44 + host:DUT CRB + + Sheet.45 + Host: DUT CRB + + + + Host: DUT CRB + + Sheet.46 + + + + Sheet.47 + + + Sheet.48 + + + + + + + host:DUT CRB + + + Message.49 + + + + + + + + + + Activation.50 + + + + + + + Return Message.51 + + + + + + + + + + Sheet.52 + generate_sriov_vfs_by_port(port, vf_number, driver) + + + + generate_sriov_vfs_by_port(port, vf_number, driver) + + + + + + + Object lifeline.55 + Virtual Base + + Sheet.56 + + + + Sheet.57 + + + + Sheet.58 + + + Sheet.59 + + + + + + + Virtual Base + + + Activation.60 + + + + + + + Self Message.61 + + + + + + + + + + Sheet.62 + run_pre_cmds() + + + + run_pre_cmds() + + Activation.63 + + + + + + + Sheet.70 + cores + + + + cores + + Sheet.72 + VF ports + + + + VF ports + + Message.74 + + + + + + + + + + Activation.75 + + + + + + + + + + + + + + + + + + + + + + + + Inheritance + + + + + + Sheet.91 + vm.start(load_config=False, auto_portmap) + + + + vm.start(load_config=False, auto_portmap) + + Message.93 + + + + + + + + + + Activation.94 + + + + + + + Sheet.95 + instantiate_vm_dut(autoportmap) + + + + instantiate_vm_dut(autoportmap) + + Return Message.98 + + + + + + + + + + Sheet.99 + VM DUT object + + + + VM DUT object + + Self Message.100 + + + + + + + + + + Sheet.101 + Start Virtual machine + + + + Start Virtual machine + + Return Message.103 + + + + + + + + + + Sheet.104 + VM DUT object + + + + VM DUT object + + + + + + + Object lifeline.105 + case: Test Case + + Sheet.106 + + + + Sheet.107 + + + + Sheet.108 + + + Sheet.109 + + + + + + + case: Test Case + + + Activation.111 + + + + + + + Message.112 + + + + + + + + + + Activation.113 + + + + + + + Sheet.114 + Case(VM DUT, tester, target) + + + + Case(VM DUT, tester, target) + + Self Message.116 + + + + + + + + + + Sheet.117 + Run test case + + + + Run test case + + Activation.121 + + + + + + + Self Message.122 + + + + + + + + + + Sheet.123 + run_post_cmds() + + + + run_post_cmds() + + Activation.124 + + + + + + + Activation.125 + + + + + + + Message.126 + + + + + + + + + + Sheet.127 + vm.stop() + + + + vm.stop() + + Message.128 + + + + + + + + + + Activation.129 + + + + + + + Activation.130 + + + + + + + Message.131 + + + + + + + + + + Sheet.132 + release_cpu() + + + + release_cpu() + + Sheet.133 + Destory_vfs(pf_device) + + + + Destory_vfs(pf_device) + + Activation.135 + + + + + + + Message.136 + + + + + + + + + + Sheet.137 + Close session + + + + Close session + + From patchwork Wed Apr 6 15:10:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109276 X-Patchwork-Delegate: thomas@monjalon.net 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 B162CA0508; Wed, 6 Apr 2022 17:12:29 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7BE6B428D5; Wed, 6 Apr 2022 17:11:27 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id DB55C42877 for ; Wed, 6 Apr 2022 17:11:23 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 3360816BC11; Wed, 6 Apr 2022 17:11:23 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fJbfsFFQ9MlD; Wed, 6 Apr 2022 17:11:22 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 924CE184FE8; Wed, 6 Apr 2022 17:11:11 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 09/24] dts: merge DTS doc/dts_gsg/index.rst to DPDK Date: Wed, 6 Apr 2022 15:10:51 +0000 Message-Id: <20220406151106.2915304-10-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/index.rst | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 dts/doc/dts_gsg/index.rst diff --git a/dts/doc/dts_gsg/index.rst b/dts/doc/dts_gsg/index.rst new file mode 100644 index 0000000000..2a1ba2d7c8 --- /dev/null +++ b/dts/doc/dts_gsg/index.rst @@ -0,0 +1,41 @@ +.. BSD LICENSE + Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +===================== +Getting Started Guide +===================== + +.. toctree:: + :maxdepth: 2 + :numbered: + + quick_start + usr_guide/index + rel_notes/index From patchwork Wed Apr 6 15:10:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109278 X-Patchwork-Delegate: thomas@monjalon.net 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 3FDF4A0508; Wed, 6 Apr 2022 17:12:45 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7C13D428E0; Wed, 6 Apr 2022 17:11:29 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 71089428AE for ; Wed, 6 Apr 2022 17:11:25 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 5E6A1184FE8; Wed, 6 Apr 2022 17:11:24 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nVZZ6263htCw; Wed, 6 Apr 2022 17:11:22 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id EF944184FE9; Wed, 6 Apr 2022 17:11:11 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 10/24] dts: merge DTS doc/dts_gsg/quick_start.rst to DPDK Date: Wed, 6 Apr 2022 15:10:52 +0000 Message-Id: <20220406151106.2915304-11-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/quick_start.rst | 310 ++++++++++++++++++++++++++++++++ 1 file changed, 310 insertions(+) create mode 100644 dts/doc/dts_gsg/quick_start.rst diff --git a/dts/doc/dts_gsg/quick_start.rst b/dts/doc/dts_gsg/quick_start.rst new file mode 100644 index 0000000000..e6ef9b95d5 --- /dev/null +++ b/dts/doc/dts_gsg/quick_start.rst @@ -0,0 +1,310 @@ +================= +Quick start guide +================= + +Introduction +============ + +This document describes how to install and configure the Data Plane Development Kit Test Suite (DTS) in a Linux environment. +It is designed to get user to set up DTS quickly in their environment without going deeply into detail. + +DTS can run on a tester machine or a DUT machine or the third machine to communicate/manage tester/DUT by SSH connection. +DTS supports different kinds of traffic generators, including Scapy, TRex, IXIA. +The example set up DTS on as tester machine, and use Scapy as traffic generator to run functional testing. + +System Requirements +=================== + +This chapter describes the packages required to set up DTS. +For the DPDK requirements, please consult `Data Plane Development Kit Getting Started Guide `_. + +Hardware Recommendation +----------------------- + +Our regression setups uses Intel x86 platforms with mainstream Intel ethernet cards. +The following platforms have been tested and are recommended. + +.. |reg| unicode:: U+000AE .. REGISTERED SIGN +.. |trade| unicode:: U+2122 .. TRADE MARK SIGN + +* DTS and Tester system + + * CPU + * Intel\ |reg| Xeon\ |reg| Platinum 8280M CPU @ 2.70GHz + * Intel\ |reg| Xeon\ |reg| Platinum 8180 CPU @ 2.50GHz + * Intel\ |reg| Xeon\ |reg| Gold 6252N CPU @ 2.30GHz + + * OS + * Ubuntu 20.04 + * Ubuntu 18.04 + +* DUT system + + * CPU + + * Intel\ |reg| Atom\ |trade| CPU C3758 @ 2.20GHz + * Intel\ |reg| Atom\ |trade| CPU C3858 @ 2.00GHz + * Intel\ |reg| Atom\ |trade| CPU C3958 @ 2.00GHz + * Intel\ |reg| Xeon\ |reg| CPU D-1541 @ 2.10GHz + * Intel\ |reg| Xeon\ |reg| CPU D-1553N @ 2.30GHz + * Intel\ |reg| Xeon\ |reg| CPU E5-2680 0 @ 2.70GHz + * Intel\ |reg| Xeon\ |reg| CPU E5-2680 v2 @ 2.80GHz + * Intel\ |reg| Xeon\ |reg| CPU E5-2699 v3 @ 2.30GHz + * Intel\ |reg| Xeon\ |reg| CPU E5-2699 v4 @ 2.20GHz + * Intel\ |reg| Xeon\ |reg| Gold 5218N CPU @ 2.30GHz + * Intel\ |reg| Xeon\ |reg| Gold 6139 CPU @ 2.30GHz + * Intel\ |reg| Xeon\ |reg| Gold 6252N CPU @ 2.30GHz + * Intel\ |reg| Xeon\ |reg| Platinum 8180 CPU @ 2.50GHz + * Intel\ |reg| Xeon\ |reg| Platinum 8280M CPU @ 2.70GHz + + * OS + + * CentOS 8.3 + * CentOS Stream 8 + * Fedora 33 + * Red Hat Enterprise Linux Server release 8.3 + * Suse 15 SP2 + * Ubuntu 20.04 + * Ubuntu 20.10 + + * NICs + + * Intel\ |reg| Ethernet Controller E810-C for SFP (4x25G) + * Intel\ |reg| Ethernet Controller E810-C for QSFP (2x100G) + * Intel\ |reg| Ethernet Converged Network Adapter X710-DA4 (4x10G) + * Intel\ |reg| Ethernet Converged Network Adapter XXV710-DA2 (2x25G) + * Intel\ |reg| 82599ES 10 Gigabit Ethernet Controller + +Topology Example +---------------- + +2 Teseter interfaces connect to 2 DUT interfaces back to back. + +Dependencies +------------ + +SSH Service +~~~~~~~~~~~ + +Tester and DUT should have one interface connected to the same internet, so that they can be accessed by each other from local IP address + +.. code-block:: console + + apt-get install openssh-server # download / install ssh software + service ssh start # start ssh service + +.. note:: + + Firewall should be disabled that all packets can be accepted by NIC interfaces. + +.. code-block:: console + + systemctl disable firewalld.service + +Python modules for DTS & Tester +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The python dependences are recorded in requirements.txt. +Please install them as the following: + +.. code-block:: console + + apt-get install python3 + python3 -m pip install -r requirements.txt + +BIOS setting for DUT +~~~~~~~~~~~~~~~~~~~~ + +DPDK prefer devices bound to ``vfio-pci`` kernel module, therefore, please enable VT-d and VT-x: + +.. code-block:: console + + Advanced -> Integrated IO Configuration -> Intel(R) VT for Directed I/O + Advanced -> Processor Configuration -> Intel(R) Virtualization Technology + +DPDK running Prerequisite +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Recommend to use 1G Hugepage for DPDK running, add ``hugepagesz=1G hugepages=40 default_hugepagesz=1G`` in Linux cmdline. +For more details, please refer to `Data Plane Development Kit Getting Started Guide `_. + +Running DTS +=========== + +Getting DTS Code +---------------- + +Get DTS code from remote repo. + +.. code-block:: console + + [root@tester ~]# git clone http://dpdk.org/git/tools/dts + [root@tester ~]# ls dts + [root@tester dts]# conf CONTRIBUTING.TXT dep doc dts execution.cfg executions framework nics output requirements.txt test_plans tests tools version.py + +Preparing DPDK tarball +---------------------- + +DPDK source code should be packed as "dpdk.tar.gz" and moved into dts/dep: + +.. code-block:: console + + tar -czvf dpdk.tar.gz dpdk + cp dpdk.tar.gz ~/dts/dep + +Configuring DTS +--------------- + +A few of files should be configured, including execution.cfg, $DTS_CFG_FOLDER/crbs, $DTS_CFG_FOLDER/ports.cfg. + +execution.cfg +~~~~~~~~~~~~~ + +.. code-block:: console + + [Execution1] + crbs=192.168.1.1 + drivername=vfio-pci + build_type=meson + test_suites= + hello_world, + targets= + x86_64-default-linuxapp-gcc, + parameters=nic_type=cfg:func=true + +* crbs: IP address of the DUT system +* test_suites: a list of test suites to be executed + +$DTS_CFG_FOLDER/crbs.cfg +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: console + + [192.168.1.1] + dut_ip=192.168.1.1 + dut_user=root + dut_passwd=dutpasswd + os=linux + tester_ip=192.168.1.2 + tester_passwd=testerpasswd + channels=4 + bypass_core0=True + +* dut_ip: IP address of the DUT system, same as crbs in execution.cfg +* dut_user: User name of DUT linux account +* dut_passwd: Password of DUT linux account +* tester_ip: IP address of tester +* tester_passwd: Password of Tester linux account, user name should same as dut_user + +$DTS_CFG_FOLDER/ports.cfg +~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: console + + [192.168.1.1] + ports = + pci=0000:06:00.0,peer=0000:81:00.0; + pci=0000:06:00.1,peer=0000:81:00.1; + +* [192.168.1.1]: same as crbs in execution.cfg and dut_ip in $DTS_CFG_FOLDER/crbs.cfg +* pci: pci address of DUT port +* peer: pci address of Tester port which connected to the DUT port whose pci is `pci`. + +The topology for the configuration is: + +.. code-block:: console + + DUT port0 (0000:06:00.0) --- Tester port0 (0000:81:00.0) + DUT port0 (0000:06:00.1) --- Tester port0 (0000:81:00.1) + +Launch DTS +---------- + +As we have prepared the zipped dpdk file and configuration file, just type the followed command “./dts”, it will start the validation process. + +.. code-block:: console + + [root@tester ~]# ./dts + + dts: + DUT 192.168.1.1 + tester: ssh root@192.168.1.2 + tester: ssh root@192.168.1.2 + tester: python3 -V + tester_scapy: ssh root@192.168.1.2 + ... + dut.192.168.1.1: ssh root@192.168.1.1 + dut.192.168.1.1: ssh root@192.168.1.1 + ... + dut.192.168.1.1: scp -v dep/dpdk.tar.gz root@192.168.1.1:/tmp/ + ... + dut.192.168.1.1: DUT PORT MAP: [0, 1] + ... + dut.192.168.1.1: export RTE_TARGET=x86_64-native-linuxapp-gcc + dut.192.168.1.1: export RTE_SDK=`pwd` + dut.192.168.1.1: rm -rf x86_64-native-linuxapp-gcc + dut.192.168.1.1: CC=gcc meson -Denable_kmods=True -Dlibdir=lib --default-library=static x86_64-native-linuxapp-gcc + ... + dut.192.168.1.1: usertools/dpdk-devbind.py --force --bind=vfio-pci 0000:af:00.0 0000:af:00.1 + dts: NIC : fortville_25g + dut.192.168.1.1: meson configure -Dexamples=helloworld x86_64-native-linuxapp-gcc + dut.192.168.1.1: ninja -C x86_64-native-linuxapp-gcc + dut.192.168.1.1: ls x86_64-native-linuxapp-gcc/examples/dpdk-helloworld + TestHelloWorld: Test Case test_hello_world_all_cores Begin + dut.192.168.1.1: cat config/defconfig_x86_64-native-linuxapp-gcc | sed '/^#/d' | sed '/^\s*$/d' + dut.192.168.1.1: ./x86_64-native-linuxapp-gcc/examples/dpdk-helloworld -l 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71 -n 4 --file-prefix=dpdk_25703_20210311003827 + TestHelloWorld: Test Case test_hello_world_all_cores Result PASSED: + TestHelloWorld: Test Case test_hello_world_single_core Begin + dut.192.168.1.1: ./x86_64-native-linuxapp-gcc/examples/dpdk-helloworld -l 1 -n 4 --file-prefix=dpdk_25703_20210311003827 + TestHelloWorld: Test Case test_hello_world_single_core Result PASSED: + dts: + TEST SUITE ENDED: TestHelloWorld + ... + dts: DTS ended + [root@tester ~]# + +Check Test Result +================== + +The result files are generated in dts/output. + +.. code-block:: console + + [root@tester output]# ls + rst_report dts.log statistics.txt TestHelloWorld.log test_results.json test_results.xls + +* statstics.txt: summary statistics + +.. code-block:: console + + [root@tester output]# cat statistics.txt + dpdk_version = 21.02.0 + Passed = 2 + Failed = 0 + Blocked = 0 + Pass rate = 100.0 + +* test_result.json: json format result file + +.. code-block:: console + + [root@tester output]# cat result.json + { + "192.168.1.1": { + "dpdk_version": "21.02.0", + "nic": { + "driver": "vfio-pci", + "firmware": "8.00 0x80008c1a 1.2766.0", + "kdriver": "i40e-2.13.10", + "name": "fortville_25g" + }, + "x86_64-native-linuxapp-gcc": { + "hello_world/test_hello_world_all_core": "passed" + "hello_world/test_hello_world_single_core": "passed" + } + } + } + +* test_result.xls: excel format result file + +.. figure:: image/dts_result.png From patchwork Wed Apr 6 15:10:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109277 X-Patchwork-Delegate: thomas@monjalon.net 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 72A0CA0508; Wed, 6 Apr 2022 17:12:38 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 77786428DB; Wed, 6 Apr 2022 17:11:28 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 74FD3428B5 for ; Wed, 6 Apr 2022 17:11:25 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 6AC2B184FF6; Wed, 6 Apr 2022 17:11:24 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5CmQOPJ9uwb3; Wed, 6 Apr 2022 17:11:23 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 580FD184FEA; Wed, 6 Apr 2022 17:11:12 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 11/24] dts: merge DTS doc/dts_gsg/rel_notes/index.rst to DPDK Date: Wed, 6 Apr 2022 15:10:53 +0000 Message-Id: <20220406151106.2915304-12-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/rel_notes/index.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 dts/doc/dts_gsg/rel_notes/index.rst diff --git a/dts/doc/dts_gsg/rel_notes/index.rst b/dts/doc/dts_gsg/rel_notes/index.rst new file mode 100644 index 0000000000..7415ce2996 --- /dev/null +++ b/dts/doc/dts_gsg/rel_notes/index.rst @@ -0,0 +1,10 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2022 The DTS contributors + +Release Notes +============= + +.. toctree:: + :maxdepth: 1 + + release_21_11 From patchwork Wed Apr 6 15:10:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109280 X-Patchwork-Delegate: thomas@monjalon.net 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 900DEA0508; Wed, 6 Apr 2022 17:12:59 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B93A4428E9; Wed, 6 Apr 2022 17:11:31 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 33DEE428CF for ; Wed, 6 Apr 2022 17:11:27 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 22A9816BC11; Wed, 6 Apr 2022 17:11:26 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id sItmbWk7vQWO; Wed, 6 Apr 2022 17:11:25 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id BE7C2184FF0; Wed, 6 Apr 2022 17:11:12 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 12/24] dts: merge DTS doc/dts_gsg/rel_notes/release_21_11.rst to DPDK Date: Wed, 6 Apr 2022 15:10:54 +0000 Message-Id: <20220406151106.2915304-13-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/rel_notes/release_21_11.rst | 57 +++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 dts/doc/dts_gsg/rel_notes/release_21_11.rst diff --git a/dts/doc/dts_gsg/rel_notes/release_21_11.rst b/dts/doc/dts_gsg/rel_notes/release_21_11.rst new file mode 100644 index 0000000000..c781dc5ae7 --- /dev/null +++ b/dts/doc/dts_gsg/rel_notes/release_21_11.rst @@ -0,0 +1,57 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2022 The DTS contributors + +DTS Release 21.11 +================= + +New Features +------------ + +* **Add new test plans.** + + * cvl_1pps_signal_test_plan.rst + * cvl_advanced_iavf_rss_pppol2tpoudp_test_plan.rst + * cvl_flow_priority_test_plan.rst + +* **Add new test suites.** + + * TestSuite_cvl_1pps_signal.py + * TestSuite_cvl_advanced_iavf_rss_pppol2tpoudp.py + * TestSuite_cvl_dcf_qos.py + * TestSuite_cvl_flow_priority.py + +* **Update test plans to adapt meson build.** + + Makefile builds are removed in DPDK 20.11, so update test plan accordingly. + +* **Fix pylama errors.** + + Fix most pylama errors in framework. + +* **Make DTS a python standard project.** + + Update DTS to a standard structure. + + +Removed Items +------------- + +* **Remove test plans.** + + * fdir_test_plan.rst + * fortville_rss_granularity_config_test_plan.rst + * generic_filter_test_plan.rst + * virtio_1.0_test_plan.rst + +* **Remove test suites.** + + * TestSuite_fdir.py + * TestSuite_fortville_rss_granularity_config.py + * TestSuite_generic_filter.py + + +Deprecation Notices +------------------- + +* Makefile builds are deprecated and will be removed in DTS 22.03, + please use meson builds instead. From patchwork Wed Apr 6 15:10:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109279 X-Patchwork-Delegate: thomas@monjalon.net 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 A6A51A0508; Wed, 6 Apr 2022 17:12:52 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BD4BF428E4; Wed, 6 Apr 2022 17:11:30 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 3515D428D0 for ; Wed, 6 Apr 2022 17:11:27 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 281F6184FE9; Wed, 6 Apr 2022 17:11:26 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZX6FFZobJozw; Wed, 6 Apr 2022 17:11:25 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 5856F184FF9; Wed, 6 Apr 2022 17:11:13 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 13/24] dts: merge DTS doc/dts_gsg/usr_guide/asan_test.rst to DPDK Date: Wed, 6 Apr 2022 15:10:55 +0000 Message-Id: <20220406151106.2915304-14-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/asan_test.rst | 59 +++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/asan_test.rst diff --git a/dts/doc/dts_gsg/usr_guide/asan_test.rst b/dts/doc/dts_gsg/usr_guide/asan_test.rst new file mode 100644 index 0000000000..65de3a7f80 --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/asan_test.rst @@ -0,0 +1,59 @@ +About ASan +=========== + +AddressSanitizer a.k.a. ASan is a widely-used debugging tool to detect memory access errors. +It helps to detect issues like use-after-free, various kinds of buffer overruns in C/C++ +programs, and other similar errors, as well as printing out detailed debug information whenever +an error is detected. + +ASan is integrated with gcc and clang and can be enabled via a meson option: -Db_sanitize=address, +See the documentation for details (especially regarding clang). + +About ASan test +=============== + +DTS adds one parameter named asan to control ASan test, support through added asan parameter, +otherwise not support. It contains three steps on the whole: + + - Append ASan build parameters to meson build options. this may open the function of ASan detect + memory access errors. if occuring memory access errors, the stack info will recorded in DTS log + + - After all cases tested finish, analyze DTS log and redefine case test result according to whether + case log contain memory access error info. modify the result to failed if contain otherwise inherit + the original result. + + - Generate ASan report to distinguish it from the original report. + +ASan test steps +======================= + +Check ASan test config +---------------------- + +ASan config file is placed in conf/asan.cfg + +Firstly, check the log filter bounds pairs, customer can modify the pairs if need, and use colon split +bounds, use comma split pairs, there are two pairs key word default as follow: + + - filter_bounds=LeakSanitizer:SUMMARY,AddressSanitizer:SUMMARY + +Secondly, check the meson build parameter options pair, there is a list of parameters default as follow: + + - build_param=-Dbuildtype=debug -Db_lundef=false -Db_sanitize=address + +Launch DTS +---------- + + ./dts --asan + +When launch DTS, there are two parameters need attention: + - provide --asan parameter, means support ASan test. + - Don't provide -s parameter to skip build DPDK package. ASan test need rebuild DPDK package. + +Obtain the ASan test report +--------------------------- + +ASan report located at DTS output directory also, and provided three format as follow: + - Json format named asan_test_results.json + - Excel format named asan_test_results.xls + - Statistics information of txt format named asan_statistics.txt \ No newline at end of file From patchwork Wed Apr 6 15:10:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109281 X-Patchwork-Delegate: thomas@monjalon.net 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 2777AA0508; Wed, 6 Apr 2022 17:13:07 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 102C6428EE; Wed, 6 Apr 2022 17:11:33 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id D970C428C0 for ; Wed, 6 Apr 2022 17:11:28 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 39B22184FE8; Wed, 6 Apr 2022 17:11:28 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0Nt55Q2iC3Mp; Wed, 6 Apr 2022 17:11:27 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id CE56C16BC0E; Wed, 6 Apr 2022 17:11:13 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 14/24] dts: merge DTS doc/dts_gsg/usr_guide/igb_uio.rst to DPDK Date: Wed, 6 Apr 2022 15:10:56 +0000 Message-Id: <20220406151106.2915304-15-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/igb_uio.rst | 102 ++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/igb_uio.rst diff --git a/dts/doc/dts_gsg/usr_guide/igb_uio.rst b/dts/doc/dts_gsg/usr_guide/igb_uio.rst new file mode 100644 index 0000000000..13648cd028 --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/igb_uio.rst @@ -0,0 +1,102 @@ +Practice for igb_uio +==================== + +The kernel module igb_uio is moved to the dpdk-kmods repository in the +/linux/igb_uio/ directory snice DPDK 20.11 (commit: 56bb5841fd06). +The most easy way to test DPDK in DTS based on igb_uio is to add igb_uio +source code back to dpdk. + + +Get Source Code +--------------- + +Get DPDK:: + + git clone git://dpdk.org/dpdk + git clone http://dpdk.org/git/dpdk + +Get igb_uio:: + + git clone http://dpdk.org/git/dpdk-kmods + git clone git://dpdk.org/dpdk-kmods + +Integrate igb_uio into DPDK +--------------------------- + +Assume you have cloned the dpdk and dpdk-kmods source code +in ./dpdk and ./dpdk-kmods. + +#. Copy dpdk-kmods/linux/igb_uio/ to dpdk/kernel/linux/:: + + [root@dts linux]# cp -r ./dpdk-kmods/linux/igb_uio /root/dpdk/kernel/linux/ + [root@dts linux]# ls ./dpdk/kernel/linux/ + igb_uio kni meson.build + +#. enable igb_uio build in meson: + +* add igb_uio in dpdk/kernel/linux/meson.build subdirs as below:: + + subdirs = ['kni', 'igb_uio'] + +.. note:: + + igb_uio will be added into compile list when it is added in subdirs. + + +* create a file of meson.build in dpdk/kernel/linux/igb_uio/ as below:: + + # SPDX-License-Identifier: BSD-3-Clause + # Copyright(c) 2017 Intel Corporation + + mkfile = custom_target('igb_uio_makefile', + output: 'Makefile', + command: ['touch', '@OUTPUT@']) + + custom_target('igb_uio', + input: ['igb_uio.c', 'Kbuild'], + output: 'igb_uio.ko', + command: ['make', '-C', kernel_dir + '/build', + 'M=' + meson.current_build_dir(), + 'src=' + meson.current_source_dir(), + 'EXTRA_CFLAGS=-I' + meson.current_source_dir() + + '/../../../lib/librte_eal/include', + 'modules'], + depends: mkfile, + install: true, + install_dir: kernel_dir + '/extra/dpdk', + build_by_default: get_option('enable_kmods')) + +.. note:: + + DPDK is using meson build, create meson.build so that igb_uio can be built. + +DTS configuration +----------------- + +#. Pack the dpdk into dpdk.tar.gz and copy into dts/dep:: + + tar -zcvf dpdk.tar.gz dpdk + cp dpdk.tar.gz ~/dts/dep + + +#. config drivername=igb_uio in execution.cfg:: + + [Execution1] + crbs=127.0.0.1 + drivername=igb_uio + build_type=meson + test_suites= + checksum_offload, + targets= + x86_64-native-linuxapp-gcc + parameters=nic_type=cfg:func=true + +#. configure dts with other requirements (not mentioned here) and now start dts:: + + ./dts + +.. note .. + + dts parameter "-s" means skip setup, it won't unpack dep/dpdk.tar.gz + to the default directory `/root/dpdk`, but use dpdk already there. + so copy the integrated dpdk to `/root/dpdk` if with `-s` From patchwork Wed Apr 6 15:10:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109282 X-Patchwork-Delegate: thomas@monjalon.net 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 23373A0508; Wed, 6 Apr 2022 17:13:17 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0F490428F7; Wed, 6 Apr 2022 17:11:35 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id C2140428E1 for ; Wed, 6 Apr 2022 17:11:29 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 2290116BC0E; Wed, 6 Apr 2022 17:11:29 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iV4ccxG7F386; Wed, 6 Apr 2022 17:11:27 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 3666E129C28; Wed, 6 Apr 2022 17:11:14 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 15/24] dts: merge DTS doc/dts_gsg/usr_guide/image/dts_func_deploy.png to DPDK Date: Wed, 6 Apr 2022 15:10:57 +0000 Message-Id: <20220406151106.2915304-16-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- .../dts_gsg/usr_guide/image/dts_func_deploy.png | Bin 0 -> 24729 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dts/doc/dts_gsg/usr_guide/image/dts_func_deploy.png GIT binary patch literal 24729 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 PNqp X-Patchwork-Id: 109283 X-Patchwork-Delegate: thomas@monjalon.net 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 3E546A0508; Wed, 6 Apr 2022 17:13:26 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 02635428FC; Wed, 6 Apr 2022 17:11:36 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id E6DD7428E6 for ; Wed, 6 Apr 2022 17:11:30 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 32211129C28; Wed, 6 Apr 2022 17:11:30 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ytiTCdfACQ6O; Wed, 6 Apr 2022 17:11:28 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 9B91D184FF4; Wed, 6 Apr 2022 17:11:14 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 16/24] dts: merge DTS doc/dts_gsg/usr_guide/image/dts_result.png to DPDK Date: Wed, 6 Apr 2022 15:10:58 +0000 Message-Id: <20220406151106.2915304-17-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/image/dts_result.png | Bin 0 -> 10924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dts/doc/dts_gsg/usr_guide/image/dts_result.png GIT binary patch literal 10924 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 E4>nnT`~Uy| literal 0 HcmV?d00001 diff --git a/dts/doc/dts_gsg/usr_guide/image/dts_result.png b/dts/doc/dts_gsg/usr_guide/image/dts_result.png new file mode 100644 index 0000000000000000000000000000000000000000..65e0ada586bfb5264eab02f7a6dedfe898e12849 From patchwork Wed Apr 6 15:10:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109284 X-Patchwork-Delegate: thomas@monjalon.net 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 2E3A5A0508; Wed, 6 Apr 2022 17:13:33 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4EE0F428FE; Wed, 6 Apr 2022 17:11:37 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 4169C428E7 for ; Wed, 6 Apr 2022 17:11:31 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 775BB16BC11; Wed, 6 Apr 2022 17:11:30 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8S93HWnPiEvq; Wed, 6 Apr 2022 17:11:29 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 23FB5184FF2; Wed, 6 Apr 2022 17:11:15 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 17/24] dts: merge DTS doc/dts_gsg/usr_guide/index.rst to DPDK Date: Wed, 6 Apr 2022 15:10:59 +0000 Message-Id: <20220406151106.2915304-18-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/index.rst | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/index.rst diff --git a/dts/doc/dts_gsg/usr_guide/index.rst b/dts/doc/dts_gsg/usr_guide/index.rst new file mode 100644 index 0000000000..f34d0dcf4a --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/index.rst @@ -0,0 +1,44 @@ +.. BSD LICENSE + Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +User Guide +========== + +.. toctree:: + + intro + sys_reqs + setup_dut + usage + results + trex + ixia + igb_uio + asan_test From patchwork Wed Apr 6 15:11:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109285 X-Patchwork-Delegate: thomas@monjalon.net 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 DC786A0508; Wed, 6 Apr 2022 17:13:41 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BA1974290A; Wed, 6 Apr 2022 17:11:38 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 7E77A428EC for ; Wed, 6 Apr 2022 17:11:32 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id CD76316BC0E; Wed, 6 Apr 2022 17:11:31 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0xOJTjUQ7gg1; Wed, 6 Apr 2022 17:11:30 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 98BF2185001; Wed, 6 Apr 2022 17:11:15 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 18/24] dts: merge DTS doc/dts_gsg/usr_guide/intro.rst to DPDK Date: Wed, 6 Apr 2022 15:11:00 +0000 Message-Id: <20220406151106.2915304-19-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/intro.rst | 90 +++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/intro.rst diff --git a/dts/doc/dts_gsg/usr_guide/intro.rst b/dts/doc/dts_gsg/usr_guide/intro.rst new file mode 100644 index 0000000000..dc4c0bfa60 --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/intro.rst @@ -0,0 +1,90 @@ +Introduction +============ + +This document describes how to install and configure the Data Plane Development Kit Test Suite (DTS) in a Linux environment. +DTS is an automation test tool for DPDK, wrote in `Python3`. +DTS includes one set of test cases and DPDK generic test framework. +DTS provides test example, references and framework for open source community. +Based on DTS, everyone can develop their test plan, automation script and configuration for own features and platform. +In addition, DTS provides a solution to allow that DPDK developers contribute their function test to certify their patch integration. +It only requires limited effort to maintain test cases once merged into DPDK Test Suite. +Everyone can utilize DTS to measure performance and functionality for features. + +As a generic test framework, DTS provides the following functions: + +* Communicate/manage DUT and Tester by SSH connection. +* Able to work with DUT (Device Under Test), which installed Fedora, Ubuntu, CentOS, RHEL, etc. +* Support virtualization hypervisor Qemu. +* Support both software and hardware traffic generators, including Scapy, TRex and IXIA®. +* Provide configure files to customize test suite and test cases to run under DUT. +* Provide debug and log functionalities for tracking test cases execution process. +* Support to output test result by excel, json, log text file, etc. + +DTS environment includes DUT (Device under Test), Tester and Traffic generator. DPDK are deployed on DUT and DTS can run on the Tester or DUT or the third machine. + +.. note:: + + * If run with functional testing, DTS uses `Scapy` as traffic generator, recommend installing DTS on Tester. + * If run with performance testing, DTS can use `TRex` or IXIA as traffic gengerator based on your deployment and configuration, recommend installing DTS on DUT. + * If use `TRex`, recommend deploying `TRex` and DUT on the same machine with different sockets. + +Please see a functional deployment example in the following figure: + +.. figure:: image/dts_func_deploy.png + +This architecture provides automatically mechanism to manage tester, DUT and packet generators, and remove dependency between test script and test environment/hardware. +It defines one abstraction layer for DPDK Test Suite, and provides extensibility to add more test script. +In the DPDK Test Suite Test Framework, it provides the following modules to help to manage device, platform, configure and test results. + +.. table:: + + +---------------------+------------------------------------------------------------------------------+ + | File Name/Directory | Description | + +=====================+==============================================================================+ + | dts | Main Application for DTS | + +---------------------+------------------------------------------------------------------------------+ + | framework | Folder with dts framework modules | + +---------------------+------------------------------------------------------------------------------+ + | nics | Folder with different network device modules | + +---------------------+------------------------------------------------------------------------------+ + | conf | Folder with different config files | + +---------------------+------------------------------------------------------------------------------+ + | execution.cfg | Default execution file | + +---------------------+------------------------------------------------------------------------------+ + | executions | Folder with several execution file samples | + +---------------------+------------------------------------------------------------------------------+ + | output | Folder which contain running log files and result files | + +---------------------+------------------------------------------------------------------------------+ + | dep | Folder with dependence scripts | + +---------------------+------------------------------------------------------------------------------+ + | test_plans | Folder with rst files which contain the description of test suites and cases | + +---------------------+------------------------------------------------------------------------------+ + | tests | Folder with test scripts for test suites and cases | + +---------------------+------------------------------------------------------------------------------+ + | doc | Folder with DTS related documents | + +---------------------+------------------------------------------------------------------------------+ + | requirements.txt | DTS required Python packages | + +---------------------+------------------------------------------------------------------------------+ + +These test script provides example and reference. Everyone can develop their test cases, verify their features functionality, and commit generic test report to maintainer. +, user-defined test cases, test plans and scripts must follow DPDK Test Suite standard including code standard, naming conventions, configure format, rst test plan, API. + +Please see test cases, which are included in the DPDK compliance test suites: + +.. table:: + + +---------------------+----------------------------------------------------------------------------------------------------------------------------+ + | Test Suite | Descriptions | + +=====================+============================================================================================================================+ + | hello_world | Print a ``helloworld`` message on every enabled logic core. | + +---------------------+----------------------------------------------------------------------------------------------------------------------------+ + | Timer | Shows how timer can be used in a RTE application. | + +---------------------+----------------------------------------------------------------------------------------------------------------------------+ + | checksum_offload | Tests RX/TX L3/L4 Checksum offload features by Poll Mode Drivers | + +---------------------+----------------------------------------------------------------------------------------------------------------------------+ + | jumbo_frame | Tests jumbo frames features by Poll Mode Drivers | + +---------------------+----------------------------------------------------------------------------------------------------------------------------+ + | testpmd | Provides benchmark tests for the Intel Ethernet Controller (Niantic) Poll Mode Driver. | + +---------------------+----------------------------------------------------------------------------------------------------------------------------+ + | L3fwd | Verifies Layer-3 Forwarding results using ``l3fwd`` application. | + +---------------------+----------------------------------------------------------------------------------------------------------------------------+ From patchwork Wed Apr 6 15:11:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109286 X-Patchwork-Delegate: thomas@monjalon.net 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 40E60A0508; Wed, 6 Apr 2022 17:13:48 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 960964290D; Wed, 6 Apr 2022 17:11:39 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id F05F4428ED for ; Wed, 6 Apr 2022 17:11:32 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 4998C184FE8; Wed, 6 Apr 2022 17:11:32 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KJH59lO-G97A; Wed, 6 Apr 2022 17:11:31 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 2F3DB184FEE; Wed, 6 Apr 2022 17:11:16 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 19/24] dts: merge DTS doc/dts_gsg/usr_guide/ixia.rst to DPDK Date: Wed, 6 Apr 2022 15:11:01 +0000 Message-Id: <20220406151106.2915304-20-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/ixia.rst | 248 +++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/ixia.rst diff --git a/dts/doc/dts_gsg/usr_guide/ixia.rst b/dts/doc/dts_gsg/usr_guide/ixia.rst new file mode 100644 index 0000000000..bd66565211 --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/ixia.rst @@ -0,0 +1,248 @@ +Practice with IxExplorer +======================== + +This chapter describes a DTS practice with IXIA IxExplorer, which mainly used for performance testing. +Here we take the performance case nic_single_core as an example. + +Configuring your own execution file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First of all, you must configure execution.cfg as below: + +.. code-block:: console + + [Execution1] + crbs=192.168.1.1 + drivername=vfio-pci + test_suites= + nic_single_core_perf, + targets= + x86_64-native-linuxapp-gcc + parameters=nic_type=cfg:perf=true + build_type=meson + rx_mode=avx512 + +Configure CRB information +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Then please add the detail information about your CRB in $DTS_CFG_FOLDER/crbs.conf as following: + +.. code-block:: console + + [192.168.1.1] + dut_ip=192.168.1.1 + dut_user=root + dut_passwd=passwd + os=linux + dut_arch= + tester_ip=192.168.1.1 + tester_passwd=passwd + pktgen_group=IXIA + channels=4 + bypass_core0=True + dut_cores= + +Configure port information +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +ports topology as below: + +.. code-block:: console + + IXIA port 0 <---------> DUT port 0 + IXIA port 1 <---------> DUT port 1 + +please add port configuration in $DTS_CFG_FOLDER/ports.cfg as following: + +.. code-block:: console + + [192.168.1.1] + ports = + pci=0000:af:00.0,peer=IXIA:3.1; + pci=0000:b1:00.0,peer=IXIA:3.2; + +Configure pktgen information +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +please configure Pktgen information in $DTS_CFG_FOLDER/pktgen.cfg + +.. code-block:: console + + [IXIA] + ixia_version=9.00 + ixia_ip=192.168.2.1 + ixia_ports= + card=3,port=1; + card=3,port=2; + ixia_force100g=disable + +.. note:: + + The version of ixia must be consistent with your version of IxExplorer. + + +Configure your own suites +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Performance tests generally have configuration files. +it's name corresponds to the suite. +Below is the $DTS_CFG_FOLDER/nic_single_core_perf.cfg configuration file. +You can set the test parameters according to your test needs. + + +.. code-block:: console + + [suite] + update_expected = True + test_parameters = {'1C/1T': {64: [512, 2048]}, + '1C/2T': {64: [512, 2048]}} + rx_desc_16byte = 'y' + test_duration = 60 + accepted_tolerance = 1 + expected_throughput = { + 'fortville_spirit': { + '1C/1T': {64: {512: 0.00, 2048: 0.00}}, + '1C/2T': {64: {512: 0.00, 2048: 0.00}}}} + +* accepted_tolerance: defines the accepted tolerance between real pps and expected pps. +* test_parameters: defines the combination of frame size and descriptor numbers, + and the pattern is {'frame size': ['descriptor number #1', 'descriptor number #2']}. +* rx_desc_16byte: 16byte configuration and default by enabled. +* test_duration: how many seconds each combination performance will be recorded. +* expected_throughput: it's a dictionary defining expected throughput numbers based on NIC, + and the pattern is {'NIC': {'frame size': {'descriptor number': 'excepted throughput'}}} + Every user should fill it out with your actual numbers. +* update_expected: if update_expected==True, and add argument "--update-expected" in bash command, + all objects in this file will changed after the run:: + + ./dts --update-expected + +At the beginning, please change test_parameters according to your requirements, +then run ./dts --update-expected to get the absolute results which will replace +the default numbers 0.00 in this configuration. +So you will have your own private configuration, and could start your tests as usual. + + +Run DTS performance test with IXIA +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now you can start DTS performance test with IXIA: + +.. code-block:: console + + root@test1:~/dts# ./dts + dts: + DUT 192.168.1.1 + tester: ssh root@192.168.1.1 + ... + pktgen: ssh root@192.168.1.1 + pktgen: tclsh + pktgen: source ./IxiaWish.tcl + pktgen: set ::env(IXIA_VERSION) 9.00 + pktgen: package req IxTclHal + pktgen: ixConnectToTclServer 192.168.2.1 + pktgen: ixLogin IxiaTclUser + pktgen: ixConnectToChassis 192.168.2.1 + pktgen: set chasId [ixGetChassisID 192.168.2.1] + pktgen: ixClearOwnership [list [list 1 3 1] [list 1 3 2]] + pktgen: ixTakeOwnership [list [list 1 3 1] [list 1 3 2]] force + pktgen: stat getLineSpeed 1 3 1 + pktgen: stat getLineSpeed 1 3 2 + ... + + TestNicSingleCorePerf: Test Case test_perf_nic_single_core Begin + TestNicSingleCorePerf: Executing Test Using cores: ['28', '29'] of config 1C/1T + TestNicSingleCorePerf: Test running at parameters: framesize: 64, rxd/txd: 512 + dut.192.168.1.1: x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 28,29 -n 6 -a 0000:af:00.0 -a 0000:b1:00.0 -- -i --portmask=0x3 --rxq=2 --txq=2 --txd=512 --rxd=512 --nb-cores=1 + dut.192.168.1.1: start + pktgen: stat getLineSpeed 1 1 1 + pktgen: stat getLineSpeed 1 1 2 + pktgen: scp -v dumppcap.py root@192.168.1.1:~/ + pktgen: scapy -c dumppcap.py 2>/dev/null + pktgen: scp -v dumppcap.py root@192.168.1.1:~/ + pktgen: scapy -c dumppcap.py 2>/dev/null + pktgen: scp -v dumppcap.py root@192.168.1.1:~/ + pktgen: scapy -c dumppcap.py 2>/dev/null + pktgen: scp -v dumppcap.py root@192.168.1.1:~/ + pktgen: scapy -c dumppcap.py 2>/dev/null + pktgen: begin traffic ...... + tester: scp -v ixiaConfig.tcl root@192.168.1.1:~/ + pktgen: source ixiaConfig.tcl + pktgen: begin get port statistic ... + pktgen: stat getRate statAllStats 1 3 2 + pktgen: stat cget -framesReceived + pktgen: stat cget -bitsReceived + pktgen: stat cget -oversize + pktgen: stat getRate statAllStats 1 3 1 + pktgen: stat cget -framesReceived + pktgen: stat cget -bitsReceived + pktgen: stat cget -oversize + pktgen: stat getRate statAllStats 1 3 2 + pktgen: stat cget -framesReceived + pktgen: stat cget -bitsReceived + pktgen: stat cget -oversize + pktgen: stat getRate statAllStats 1 3 1 + pktgen: stat cget -framesReceived + pktgen: stat cget -bitsReceived + pktgen: stat cget -oversize + pktgen: throughput: pps_rx 69504677.000000, bps_rx 35586394625.000000 + pktgen: ixStopTransmit portList + pktgen: traffic completed. + dut.192.168.1.1: stop + dut.192.168.1.1: quit + TestNicSingleCorePerf: Trouthput of framesize: 64, rxd/txd: 512 is :69.504677 Mpps + ... + + TestNicSingleCorePerf: + +----------+------------+---------+-------------+---------+---------------------+-----------------------+ + | Fwd_core | Frame Size | TXD/RXD | Throughput | Rate | Expected Throughput | Throughput Difference | + +==========+============+=========+=============+=========+=====================+=======================+ + | 1C/1T | 64 | 512 | 69.505 Mpps | 93.414% | 0.000 Mpps | 69.505 Mpps | + +----------+------------+---------+-------------+---------+---------------------+-----------------------+ + | 1C/1T | 64 | 2048 | 51.078 Mpps | 68.649% | 0.000 Mpps | 51.078 Mpps | + +----------+------------+---------+-------------+---------+---------------------+-----------------------+ + | 1C/2T | 64 | 512 | 74.404 Mpps | 99.999% | 0.000 Mpps | 74.404 Mpps | + +----------+------------+---------+-------------+---------+---------------------+-----------------------+ + | 1C/2T | 64 | 2048 | 67.851 Mpps | 91.192% | 0.000 Mpps | 67.851 Mpps | + +----------+------------+---------+-------------+---------+---------------------+-----------------------+ + TestNicSingleCorePerf: Test Case test_perf_nic_single_core Result PASSED: + + +Test result +~~~~~~~~~~~ + +After the Test Suite finished the validation, we can find the result files as below in output folder. + +.. code-block:: console + + fortville_25g_single_core_perf.json dts.log TestNicSingleCorePerf.log test_results.json + +The performance case will save the data results in the jison file. +And the pattern is "nic name + suite name.json". +Below is the json file of nic_single_core: + +.. code-block:: console + + vim fortville_25g_single_core_perf.json + + {"test_perf_nic_single_core": [{ + "performance": [{"name": "Throughput", "value": 69.505, "unit": "Mpps", "delta": 69.505}], + "parameters": [{"name": "Txd/Rxd", "value": 512, "unit": "descriptor"}, + {"name": "frame_size", "value": 64, "unit": "bytes"}, + {"name": "Fwd_core", "value": "1C/1T"}], "status": "PASS"}, + {"performance": [{"name": "Throughput", "value": 51.078, "unit": "Mpps", "delta": 51.078}], + "parameters": [{"name": "Txd/Rxd", "value": 2048, "unit": "descriptor"}, + {"name": "frame_size", "value": 64, "unit": "bytes"}, + {"name": "Fwd_core", "value": "1C/1T"}], "status": "PASS"}, + {"performance": [{"name": "Throughput", "value": 74.404, "unit": "Mpps", "delta": 74.404}], + "parameters": [{"name": "Txd/Rxd", "value": 512, "unit": "descriptor"}, + {"name": "frame_size", "value": 64, "unit": "bytes"}, + {"name": "Fwd_core", "value": "1C/2T"}], "status": "PASS"}, + {"performance": [{"name": "Throughput", "value": 67.851, "unit": "Mpps", "delta": 67.851}], + "parameters": [{"name": "Txd/Rxd", "value": 2048, "unit": "descriptor"}, + {"name": "frame_size", "value": 64, "unit": "bytes"}, + {"name": "Fwd_core", "value": "1C/2T"}], "status": "PASS"}]} + + +You can set your own expectations in con/suite.cfg based on the json data. +If the actual data differs too much from the expected data, the case fails. From patchwork Wed Apr 6 15:11:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109287 X-Patchwork-Delegate: thomas@monjalon.net 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 D5C0DA0508; Wed, 6 Apr 2022 17:13:54 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 92D4142914; Wed, 6 Apr 2022 17:11:40 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id D9658428F0 for ; Wed, 6 Apr 2022 17:11:33 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 44AFA129C28; Wed, 6 Apr 2022 17:11:33 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id S7TFSfaNUd2K; Wed, 6 Apr 2022 17:11:32 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 8E884184FF8; Wed, 6 Apr 2022 17:11:16 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 20/24] dts: merge DTS doc/dts_gsg/usr_guide/results.rst to DPDK Date: Wed, 6 Apr 2022 15:11:02 +0000 Message-Id: <20220406151106.2915304-21-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/results.rst | 101 ++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/results.rst diff --git a/dts/doc/dts_gsg/usr_guide/results.rst b/dts/doc/dts_gsg/usr_guide/results.rst new file mode 100644 index 0000000000..3ec08d86fe --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/results.rst @@ -0,0 +1,101 @@ +Test Result +=========== + +Overview +-------- + +After DTS finished the validation, we can find the result files similar as below in output folder. + +.. code-block:: console + + rst_report dts.log statistics.txt TestHelloWorld.log test_results.json test_results.xls + +* rst_report: contains the result RST file of performance data +* dts.log: Full execution log of DTS framework +* statstics.txt: summary statistics of DTS executed suites +* TestHelloWorld.log: log message of Test suite: HelloWorld +* test_result.json: json format result file +* test_result.xls: excel format result file + +Statistics +---------- + +You can go through the summary of execution result via statistic.txt. This file includes the number of passed test cases, the number of failed case, the number of blocked and pass ratio. + +Please see example as the following. You can cat the sample file, then show this information of execution, totally executed two test cases, all cases passed the criterion and no failed or blocked cases. + +.. code-block:: console + + [root@tester output]# cat statistics.txt + dpdk_version = 21.02.0 + Passed = 2 + Failed = 0 + Blocked = 0 + Pass rate = 100.0 + +Details +------- + +DTS provides 2 formats for test results, one is json, and the other is excel. +If you need more detail information of test result, either of them is good to check. +Both of them contain case names and results, also the failure reasons. + +* JSON result: result.json + +.. code-block:: console + + { + "192.168.1.1": { + "dpdk_version": "21.02.0", + "nic": { + "driver": "vfio-pci", + "firmware": "8.00 0x80008c1a 1.2766.0", + "kdriver": "i40e-2.13.10", + "name": "fortville_25g" + }, + "x86_64-native-linuxapp-gcc": { + "hello_world/test_hello_world_all_core": "passed" + "hello_world/test_hello_world_single_core": "passed" + } + } + } + + +* Excel result: test_result.xls + +.. figure:: image/dts_result.png + +Logs +---- + +If you want to track more details about the process of each suite, please go to log file which named by this suite, all related information will stored in this file. + +Please see example for TestHelloWorld suite log as the following. This log file showed that application helloworld sent hello message from core1, and finally matched the pass criterion. + +.. code-block:: console + + 31/12/2020 11:04:00 INFO: + TEST SUITE : TestHelloWorld + 31/12/2020 11:04:00 INFO: NIC : fortville_25g + 31/12/2020 11:04:00 SUITE_DUT_CMD: meson configure -Dexamples=helloworld x86_64-native-linuxapp-gcc + 31/12/2020 11:04:01 SUITE_DUT_CMD: ninja -C x86_64-native-linuxapp-gcc + 31/12/2020 11:04:07 SUITE_DUT_OUTPUT: ninja: Entering directory `x86_64-native-linuxapp-gcc'^M + [0/1] Regenerating build files.^M + The Meson build system^M + Version: 0.55.3^M + Source dir: /root/dpdk^M + Build dir: /root/dpdk/x86_64-native-linuxapp-gcc^M + Build type: native build^ + … + Build targets in project: 998^M + Found ninja-1.10.0.git.kitware.jobserver-1 at /usr/local/bin/ninja^M + [1/2] Compiling C object examples/dpdk-helloworld.p/helloworld_main.c.o^M + [2/2] Linking target examples/dpdk-helloworld + 31/12/2020 11:04:09 INFO: Test Case test_hello_world_single_core Begin + 31/12/2020 11:04:13 SUITE_DUT_CMD: ./x86_64-native-linuxapp-gcc/examples/dpdk-helloworld -l 1 -n 4 --file-prefix=dpdk_10243_20201231110241 + SUITE_DUT_OUTPUT: EAL: Detected 72 lcore(s)^M + … + hello from core 1 + 31/12/2020 11:04:15 INFO: Test Case test_hello_world_single_core Result PASSED: + 31/12/2020 11:04:25 INFO: + TEST SUITE ENDED: TestHelloWorld From patchwork Wed Apr 6 15:11:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109288 X-Patchwork-Delegate: thomas@monjalon.net 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 59264A0508; Wed, 6 Apr 2022 17:14:04 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E74C14291D; Wed, 6 Apr 2022 17:11:41 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 705F9428F0 for ; Wed, 6 Apr 2022 17:11:34 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id D058B16BC11; Wed, 6 Apr 2022 17:11:33 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id E22uZpEgIdjd; Wed, 6 Apr 2022 17:11:32 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 03D6119E0DA; Wed, 6 Apr 2022 17:11:16 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 21/24] dts: merge DTS doc/dts_gsg/usr_guide/setup_dut.rst to DPDK Date: Wed, 6 Apr 2022 15:11:03 +0000 Message-Id: <20220406151106.2915304-22-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/setup_dut.rst | 150 ++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/setup_dut.rst diff --git a/dts/doc/dts_gsg/usr_guide/setup_dut.rst b/dts/doc/dts_gsg/usr_guide/setup_dut.rst new file mode 100644 index 0000000000..c47db8b781 --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/setup_dut.rst @@ -0,0 +1,150 @@ +Set up DUT +=========== + +This chapter describes the packages required to compile the DPDK in DUT. + +BIOS Setting Prerequisite on x86 +-------------------------------- + +DPDK prefers devices bound to ``vfio-pci`` kernel module, therefore, `VT-x` and `VT-d` should be enabled. + +.. code-block:: console + + Advanced -> Integrated IO Configuration -> Intel(R) VT for Directed I/O + Advanced -> Processor Configuration -> Intel(R) Virtualization Technology + + +Set Hugepages +------------------ + +Hugepage support is required for the large memory pool allocation used for packet buffers +(the HUGETLBFS option must be enabled in the running kernel as indicated the previous section). +By using hugepage allocations, performance is increased since fewer pages are needed, +and therefore less Translation Lookaside Buffers (TLBs, high speed translation caches), +which reduce the time it takes to translate a virtual page address to a physical page address. +Without hugepages, high TLB miss rates would occur with the standard 4k page size, slowing performance. + + +Edit /etc/default/grub +~~~~~~~~~~~~~~~~~~~~~~~ + +Set GRUB_CMDLINE_LINUX in etc/default/grub: + +for 2M pagesize:: + + GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt hugepagesz=2M hugepages=1024 default_hugepagesz=2M intel_pstate=disable" + +for 1G pagesize:: + + GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt hugepagesz=1G hugepages=16 default_hugepagesz=1G intel_pstate=disable" + +Execute grub-mkconfig +~~~~~~~~~~~~~~~~~~~~~~~ + +execute below command:: + + # grub-mkconfig -o /boot/grub/grub.cfg + +.. note:: + + some OS may need execute following command:: + + #grub2-mkconfig -o /boot/grub2/grub.cfg + +then reboot OS to make the hugepage setting take effect. + +Packages Required +------------------ + +**Required Tools and Libraries:** + +.. note:: + + The setup commands and installed packages needed on various systems may be different. + For details on Linux distributions and the versions tested, please consult the DPDK Release Notes. + +* General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+). + + * For RHEL/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"`` + + * For Ubuntu/Debian systems these can be installed using ``apt install build-essential`` + +* Python 3.5 or later. + +* Meson (version 0.49.2+) and ninja + + * ``meson`` & ``ninja-build`` packages in most Linux distributions + + * If the packaged version is below the minimum version, the latest versions + can be installed from Python's "pip" repository: ``pip3 install meson ninja`` + +* ``pyelftools`` (version 0.22+) + + * For Fedora systems it can be installed using ``dnf install python-pyelftools`` + + * For RHEL/CentOS systems it can be installed using ``pip3 install pyelftools`` + + * For Ubuntu/Debian it can be installed using ``apt install python3-pyelftools`` + +* Library for handling NUMA (Non Uniform Memory Access). + + * ``numactl-devel`` in RHEL/Fedora; + + * ``libnuma-dev`` in Debian/Ubuntu; + +.. note:: + + Please ensure that the latest patches are applied to third party libraries + and software to avoid any known vulnerabilities. + + +**Optional Tools:** + +* Intel® C++ Compiler (icc). For installation, additional libraries may be required. + See the icc Installation Guide found in the Documentation directory under the compiler installation. + +* IBM® Advance ToolChain for Powerlinux. This is a set of open source development tools and runtime libraries + which allows users to take leading edge advantage of IBM's latest POWER hardware features on Linux. To install + it, see the IBM official installation document. + +**Additional Libraries** + +A number of DPDK components, such as libraries and poll-mode drivers (PMDs) have additional dependencies. +For DPDK builds, the presence or absence of these dependencies will be automatically detected +enabling or disabling the relevant components appropriately. + +In each case, the relevant library development package (``-devel`` or ``-dev``) is needed to build the DPDK components. + +For libraries the additional dependencies include: + +* libarchive: for some unit tests using tar to get their resources. + +* libelf: to compile and use the bpf library. + + +Compile DPDK +------------- + +Now we can compile the DPDK to check whether the DUT ENV is OK. + +commands:: + + CC=gcc meson --werror -Denable_kmods=True -Dlibdir=lib --default-library=static x86_64-native-linuxapp-gcc + ninja -C x86_64-native-linuxapp-gcc -j 110 + +if there are no errors occurred during the compilation and the DPDK apps have been generated, +it means the DUT ENV is OK now. + +Check dpdk-testpmd:: + + root@dpdk:~/dpdk# ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd --help + EAL: Detected 72 lcore(s) + EAL: Detected 2 NUMA nodes + + Usage: ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd [options] + + EAL common options: + -c COREMASK Hexadecimal bitmask of cores to run on + -l CORELIST List of cores to run on + ... + --match-allocations Free hugepages exactly as allocated From patchwork Wed Apr 6 15:11:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109289 X-Patchwork-Delegate: thomas@monjalon.net 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 6BFB4A0508; Wed, 6 Apr 2022 17:14:10 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E76EF42922; Wed, 6 Apr 2022 17:11:42 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id B8000428F9 for ; Wed, 6 Apr 2022 17:11:35 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 240FE16BC0E; Wed, 6 Apr 2022 17:11:35 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oQE_Hgsrvn_Z; Wed, 6 Apr 2022 17:11:33 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 667BC19E0DE; Wed, 6 Apr 2022 17:11:17 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 22/24] dts: merge DTS doc/dts_gsg/usr_guide/sys_reqs.rst to DPDK Date: Wed, 6 Apr 2022 15:11:04 +0000 Message-Id: <20220406151106.2915304-23-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/sys_reqs.rst | 131 +++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/sys_reqs.rst diff --git a/dts/doc/dts_gsg/usr_guide/sys_reqs.rst b/dts/doc/dts_gsg/usr_guide/sys_reqs.rst new file mode 100644 index 0000000000..b91eef9db5 --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/sys_reqs.rst @@ -0,0 +1,131 @@ +System Requirements +=================== + +This chapter describes the packages required to deploy DTS, including Tester and DUT. +Tester and DUT should have one interface connected to the same internet, so that they can be accessed by each other from local IP address. +The tester and DUT are recommended to install the latest Centos, Redhat or Ubuntu for easily installing DTS(DPDK Test Suite) or DPDK required modules. + +.. note:: + + Uubuntu 20.04 are installed for Tester and DUT, and The setup instruction and required packages may be different on different operation systems. + +Firewall should be disabled on Tester and DUT so that all packets can be accepted by NIC Interface. + +.. code-block:: console + + systemctl disable firewalld.service + + +SSH Service +----------- + +Since DPDK Test Suite Tester communicates with DUT via SSH, please install and start sshd service in your Tester and DUT. + +.. code-block:: console + + apt-get install openssh-server # download / install ssh software + service ssh start # start ssh service + +Generally DTS use Linux username and password to login, but it also supports to use authorized login. +For create authorized login session, user needs to generate RSA authentication keys to ssh connectioni: + +.. code-block:: console + + ssh-keygen -t rsa + +Python modules +-------------- + +To run DTS, `Python3` must be installed, and it uses the following packages: + +* xlwt: it is used to generate spreadsheet files which compatible with MS Excel 97/2000/XP/2003 XLS files。 +* numpy: it provides method to deal with array-processing test results. +* pexpect: it provides API to automate interactive SSH sessions. +* docutils:it is a modular system for processing documentation into useful formats, such as HTML, XML, and LaTeX +* pcapy: it is a Python extension module that interfaces with the libpcap packet capture library. Pcapy enables python scripts to capture packets on the network. +* xlrd: it is a Python module that extracts data from Excel spreadsheets. +* threadpool: it is a Python module that maintains a pool of worker threads to perform time consuming operations in parallel. +* scapy: it is a Python program that enables the user to send, sniff and dissect and forge network packets. + +They are recorded in `requirements.txt`. + +.. code-block:: console + + [root@tester ~]# cat requirements.txt + ... + xlwt==1.3.0 + pexpect==4.7.0 + numpy==1.18.5 + docutils + pcapy + xlrd + scapy==2.4.4 + threadpool + +Recommend installing them quickly with following commands: + +.. code-block:: console + + apt-get install python3-pip + pip3 install -r ../requirements.txt + +DTS uses python module scapy to forge or decode packets of a wide number of protocols, send them over the wire, capture them, and analyse the packets. +We recommend installing scapy-2.4.4, as some protocol such as PFCP, GTPPDUSessionContainer are supported from this version. + +.. code-block:: console + + pip3 install scapy # install default version + pip3 install scapy==2.4.4 # install specific version + +Here are some differences between scapy 2.4.4 and scapy 2.4.3 about the packet layer: + +.. table:: Differences between scapy 2.4.3 with scapy 2.4.4 + + +------------------------+---------------------------------+-----------------------------------------------+-------------------------------------------------------+ + | Layer | packet in scapy 2.4.3 | packet in scapy 2.4.4 | Comments | + +========================+=================================+===============================================+=======================================================+ + | PPP | PPP(proto=0xc021) | PPP(b\'\\xc0\\x21\') | PPP protocol filed length is 1 byte in scapy2.4.4 | + +------------------------+---------------------------------+-----------------------------------------------+-------------------------------------------------------+ + | L2TP | L2TP(\'\\x00\\x00\\x00\\x11\') | L2TP(b\'\\x00\\x00\\x00\\x11\') | L2TP is byte type in scapy2.4.4 | + +------------------------+---------------------------------+-----------------------------------------------+-------------------------------------------------------+ + | PFCP | N/A | PFCP(S=1, seid=1) | PFCP is not supported in scapy2.4.3 | + +------------------------+---------------------------------+-----------------------------------------------+-------------------------------------------------------+ + | GTPPDUSessionContainer | N/A | GTPPDUSessionContainer(type=0, P=1, QFI=0x34) | GTPPDUSessionContainer is not supported in scapy2.4.3 | + +------------------------+---------------------------------+-----------------------------------------------+-------------------------------------------------------+ + +BIOS Setting Prerequisite on x86 +-------------------------------- + +For the majority of platforms, no special BIOS settings for Tester and DUT. +DPDK prefers devices bound to ``vfio-pci`` kernel module, therefore, `VT-x` and `VT-d` should be enabled. + +.. code-block:: console + + Advanced -> Integrated IO Configuration -> Intel(R) VT for Directed I/O + Advanced -> Processor Configuration -> Intel(R) Virtualization Technology + +DPDK running Prerequisite +------------------------- + +Hugepage support is required for the large memory pool allocation used for packet buffers. +DPDK performance will be imporved more with 1G page size than 2M, therefore, recommend to use 1G pages for DPDK. +The following options should be passed to Linux Cmdline: + +.. code-block:: console + + hugepagesz=1G hugepages=16 default_hugepagesz=1G + +For more detail information of DPDK requirements, please refer to `Data Plane Development Kit Getting Started Guide `_. + +Performance testing requirements +-------------------------------- + +DTS supports three kinds of traffic generators: `Scapy`, `TRex` and `Ixia IxExplorer`. Scapy is for functional testing, TRex and `Ixia IxExplorer` are for performance testing. The mechanism in DTS that mananges traffic generators for performance is called `Pktgen`. + +`Ixia IxExplorer` is the principal means used to program Ixia hardware and to perform testing on network devices. Ixia is a hardware traffic generator product of `keysight `_ company. DTS requires to install TCL (Tool Command Language) package to connect and control `Ixia IxExplorer`: + +.. code-block:: console + + apt-get install tcl + +`TRex `_ is an open source software traffic generator fuelled by DPDK. It generates L3-7 traffic and provides in one tool capabilities. DTS requires to install `Trex` and configure it before lunching DTS. From patchwork Wed Apr 6 15:11:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109290 X-Patchwork-Delegate: thomas@monjalon.net 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 1E30FA0508; Wed, 6 Apr 2022 17:14:17 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CD10C42929; Wed, 6 Apr 2022 17:11:43 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 8B2BC428FD for ; Wed, 6 Apr 2022 17:11:36 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id EA89F129C28; Wed, 6 Apr 2022 17:11:35 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mhe7S5udW6PL; Wed, 6 Apr 2022 17:11:34 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id CE74119E0DF; Wed, 6 Apr 2022 17:11:17 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 23/24] dts: merge DTS doc/dts_gsg/usr_guide/trex.rst to DPDK Date: Wed, 6 Apr 2022 15:11:05 +0000 Message-Id: <20220406151106.2915304-24-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/trex.rst | 377 +++++++++++++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/trex.rst diff --git a/dts/doc/dts_gsg/usr_guide/trex.rst b/dts/doc/dts_gsg/usr_guide/trex.rst new file mode 100644 index 0000000000..8dfa66bdbb --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/trex.rst @@ -0,0 +1,377 @@ +Practice with TRex +================== + +Download TREX +------------- +TREX should be installed in Tester, it could be downloaded from http://trex-tgn.cisco.com/trex/release/. +We recommend to use the latest version v2.88. + +.. code-block:: console + + wget http://trex-tgn.cisco.com/trex/release/v2.88.tar.gz + +To read more about T-Rex stateless mode, read the +`T-Rex stateless support guide `__. + +Configure TREX +-------------- + +Extract the downloaded TREX tarball +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Extract the downloaded TREX file to /opt/trex/:: + + root@tester:/opt# mkdir trex + root@tester:/opt# cd trex + root@tester:/opt/trex# tar -zxvf v2.88.tar.gz + v2.88/ + v2.88/_t-rex-64-debug + v2.88/t-rex-64-debug + ... + v2.88/trex_client_v2.88.tar.gz + +Generate Configure File +~~~~~~~~~~~~~~~~~~~~~~~~ + +Identify the performance test ports in tester +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +execute the command like below to list the ports:: + + root@tester:/opt/trex/v2.88# ./dpdk_setup_ports.py -s + + Network devices using DPDK-compatible driver + ============================================ + + + Network devices using kernel driver + =================================== + 0000:03:00.0 'VMXNET3 Ethernet Controller' if=ens160 drv=vmxnet3 unused=igb_uio,vfio-pci,uio_pci_generic *Active* + 0000:0b:00.0 'Device 1592' if=ens192f0 drv=ice unused=igb_uio,vfio-pci,uio_pci_generic + 0000:0b:00.1 'Device 1592' if=ens192f1 drv=ice unused=igb_uio,vfio-pci,uio_pci_generic + Other network devices + ===================== + + +Generate Configure File +^^^^^^^^^^^^^^^^^^^^^^^ +Assume that we use 0000:0b:00.0, 0000:0b:00.1 to connect to DUT port. +And the ports topology as below:: + + trex.0 (0b:00.0/40:a6:b7:0b:55:78) <-------> DUT port 0 (05:00.0/b4:96:91:9f:63:68) + trex.1 (0b:00.1/40:a6:b7:0b:55:79) <-------> DUT port 1 (05:00.1/b4:96:91:9f:63:69) + +We need to generate the trex config file as below:: + + root@tester:/opt/v2.88# ./dpdk_setup_ports.py -i + By default, IP based configuration file will be created. Do you want to use MAC based config? (y/N)y + +----+------+---------+-------------------+--------------------------------------------+---------+----------+----------+ + | ID | NUMA | PCI | MAC | Name | Driver | Linux IF | Active | + +====+======+=========+===================+============================================+=========+==========+==========+ + | 0 | -1 | 03:00.0 | 00:0c:29:29:30:80 | VMXNET3 Ethernet Controller | vmxnet3 | ens160 | *Active* | + +----+------+---------+-------------------+--------------------------------------------+---------+----------+----------+ + | 1 | -1 | 0b:00.0 | 40:a6:b7:0b:55:78 | Device 1592 | ice | ens192f0 | | + +----+------+---------+-------------------+--------------------------------------------+---------+----------+----------+ + | 2 | -1 | 0b:00.1 | 40:a6:b7:0b:55:79 | Device 1592 | ice | ens192f1 | | + +----+------+---------+-------------------+--------------------------------------------+---------+----------+----------+ + Please choose an even number of interfaces from the list above, either by ID, PCI or Linux IF + Stateful will use order of interfaces: Client1 Server1 Client2 Server2 etc. for flows. + Stateless can be in any order. + Enter list of interfaces separated by space (for example: 1 3) : 1 2 + For interface 1, assuming loopback to its dual interface 2. + Destination MAC is 40:a6:b7:0b:55:79. Change it to MAC of DUT? (y/N).y + Please enter a new destination MAC of interface 1: b4:96:91:9f:63:68 + For interface 2, assuming loopback to its dual interface 1. + Destination MAC is 40:a6:b7:0b:55:78. Change it to MAC of DUT? (y/N).y + Please enter a new destination MAC of interface 2: b4:96:91:9f:63:69 + Print preview of generated config? (Y/n)Y + ### Config file generated by dpdk_setup_ports.py ### + + - version: 2 + interfaces: ['0b:00.0', '0b:00.1'] + port_info: + - dest_mac: b4:96:91:9f:63:68 + src_mac: 40:a6:b7:0b:55:78 + - dest_mac: b4:96:91:9f:63:69 + src_mac: 40:a6:b7:0b:55:79 + + platform: + master_thread_id: 0 + latency_thread_id: 1 + dual_if: + - socket: 0 + threads: [2,3,4,5,6,7] + + Save the config to file? (Y/n)Y + Default filename is /etc/trex_cfg.yaml + Press ENTER to confirm or enter new file: + File /etc/trex_cfg.yaml already exist, overwrite? (y/N)Y + Saved to /etc/trex_cfg.yaml. + root@tester:/opt/trex/v2.88# + +We could not modify the DUT mac during the configuration and modify it in the generated file /etc/trex_cfg.yaml. + +Modify Configure File +^^^^^^^^^^^^^^^^^^^^^ +Make sure the DUT mac of the generated TREX file is correct, and add prefix and limit_memory is better:: + + root@tester:/opt/trex/v2.88# cat /etc/trex_cfg.yaml + ### Config file generated by dpdk_setup_ports.py ### + + - version: 2 + interfaces: ['0b:00.0', '0b:00.1'] + prefix: TREX + limit_memory: 4096 + port_info: + - dest_mac: b4:96:91:9f:63:68 + src_mac: 40:a6:b7:0b:55:78 + - dest_mac: b4:96:91:9f:63:69 + src_mac: 40:a6:b7:0b:55:79 + + platform: + master_thread_id: 0 + latency_thread_id: 1 + dual_if: + - socket: 0 + threads: [2,3,4,5,6,7] + + root@tester:/opt/trex/v2.88# + +Replace system scapy with TREX scapy +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +As the know trex issue -- trex scapy lib will be conflict with scapy installed in OS, we need the replace the scapy +in system with trex scapy. + +#. backup your scapy:: + + cp -rf /usr/local/lib/python3.6/dist-packages/scapy /usr/local/lib/python3.6/dist-packages/scapy_backup + +#. unify scapy version with trex:: + + cp -rf /opt/trex/v2.88/external_libs/scapy-2.4.3/scapy/ /usr/local/lib/python3.6/dist-packages/scapy + +Configure DTS +-------------- + +Configure execution.cfg +~~~~~~~~~~~~~~~~~~~~~~~ +Add the performance test suite and set perf=true:: + + root@tester:dts# cat execution.cfg + [Execution1] + crbs=192.168.1.1 + drivername=vfio-pci + build_type=meson + test_suites= + tso, + targets= + x86_64-native-linuxapp-gcc + parameters=nic_type=cfg:perf=true + root@tester:dts# + +Configure $DTS_CFG_FOLDER/crbs.cfg +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Set the pktgen_group=trex or pktgen_group=TREX, this item is case insensitive:: + + root@tester:dts# cat $DTS_CFG_FOLDER/crbs.cfg + [192.168.1.1] + dut_ip=192.168.1.1 + dut_user=root + dut_passwd=dutpwd + os=linux + dut_arch= + tester_ip=192.168.1.2 + tester_passwd=testerpwd + ixia_group= + pktgen_group=trex + channels=4 + bypass_core0=True + +Configure $DTS_CFG_FOLDER/ports.cfg +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This configuration is just same with PF function test, so if you have completed some functional test, +you have no need to modify the $DTS_CFG_FOLDER/ports.cfg, just like below:: + + root@tester:dts# cat $DTS_CFG_FOLDER/ports.cfg + [192.168.1.1] + ports = + pci=0000:05:00.0,peer=0000:0b:00.0; + pci=0000:05:00.1,peer=0000:0b:00.1; + +In addition, it could be configured as below:: + + root@tester:dts# cat $DTS_CFG_FOLDER/ports.cfg + [192.168.1.1] + ports = + pci=0000:05:00.0,peer=TREX:0; + pci=0000:05:00.1,peer=TREX:1; + +We recommend to use the first format configuration, as it has no need to do modification when we do functional test. + +Configure $DTS_CFG_FOLDER/pktgen.cfg +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Fill in the $DTS_CFG_FOLDER/pktgen.cfg with your TREX setting, for the first time, you should set start_trex=yes. +Set the IP address of the device which you installed TREX into item ‘server=’, it should be the tester IP. +The configuration should as below:: + + root@tester:dts# cat $DTS_CFG_FOLDER/pktgen.cfg + [TREX] + trex_root_path=/opt/trex/v2.88 + trex_lib_path=/opt/trex/v2.88/automation/trex_control_plane/interactive + config_file=/etc/trex_cfg.yaml + server=192.168.1.1 + pcap_file=/opt/trex/v2.88/stl/sample.pcap + core_num=4 + #core_mask=0x3 + ip_src=16.0.0.1 + ip_dst=10.0.0.1 + warmup=15 + duration=-1 + start_trex=yes + +As the trex_lib_path may be different in different versions, you could find the correct path as blow command:: + + root@tester:/opt/trex/v2.88# find . -name trex_stl_lib + ./automation/trex_control_plane/interactive/trex_stl_lib + root@tester:/opt/trex/v2.88# + + +Run DTS performance test with TREX +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now you can start DTS performance test with TREX:: + + root@tester:/home/zhaohy/dts# ./dts + dts: + DUT 192.168.1.1 + tester: ssh root@192.168.1.1 + ... + pktgen: ssh root@192.168.1.1 + pktgen: cd /opt/trex/v2.88;./t-rex-64 -i --cfg /etc/trex_cfg.yaml -c 4 + pktgen: Starting Scapy server..... Scapy server is started + Trying to bind to igb_uio ... + /usr/bin/python3 dpdk_nic_bind.py --bind=igb_uio 0000:0b:00.0 0000:0b:00.1 + ... + TestTSO: Test Case test_perf_TSO_2ports Begin + dut.10.240.183.72: + tester: + TestTSO: Executing PMD using 1S/1C/2T + dut.10.240.183.72: x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 1,45 -n 4 -a 0000:05:00.0 -a 0000:05:00.1 --file-prefix=dpdk_31529_20210324143008 -- -i --rxd=512 --txd=512 --burst=32 --rxfreet=64 --mbcache=128 --portmask=0x3 --max-pkt-len=9000 --txpt=36 --txht=0 --txwt=0 --txfreet=32 --txrst=32 + dut.10.240.183.72: EAL: Detected 88 lcore(s) + ... + pktgen: Rx Port 0 stats: + rx_port: 0, rx_bps: 25354096640.000000, rx_pps: 1239130.250000 + pktgen: throughput: pps_rx 5463897.750000, bps_rx 50961129472.000000 + pktgen: traffic completed. + ... + TestTSO: + +------------+---------------+------------+ + | Frame Size | 1S/1C/2T Mpps | % linerate | + +============+===============+============+ + | 128 | 5.371 | 4 | + +------------+---------------+------------+ + | 2500 | 5.464 | 56 | + +------------+---------------+------------+ + TestTSO: Test Case test_perf_TSO_2ports Result PASSED + +FAQ +--- + +dpdk hugepage management conflict issue +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +trex use older dpdk version than we release cycle source code. When dpdk change +the memory management merchanism, trex will meet the following issue. + +Trex should run on an independent platform. DUT/Trex should run on two platforms: + +* one is used as TESTER and trex server, another one is used as DUT.(dts/pktgen) +* one is used as trex server, another one is used as DUT/TESTER.(recommended scheme) + This scheme can make sure that trex run on its full status capability. + +When trex run with dts on the same platform, trex server sometimes boot up +failed for hugepage error. + +.. code-block:: console + + ./t-rex-64 -i --stl -k 4 + + Starting Scapy server..... Scapy server is started + Trying to bind to igb_uio ... + /usr/bin/python3 dpdk_nic_bind.py --bind=igb_uio 0000:85:00.0 0000:8a:00.1 + The ports are bound/configured. + Starting TRex v2.41 please wait ... + EAL: Can only reserve 1766 pages from 4096 requested + Current CONFIG_RTE_MAX_MEMSEG=256 is not enough + Please either increase it or request less amount of memory. + EAL: FATAL: Cannot init memory + + EAL: Cannot init memory + + You might need to run ./trex-cfg once + EAL: Error - exiting with code: 1 + Cause: Invalid EAL arguments + +trex quit when using Niantic +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +when bind dut NNT port to igb_uio, peer port will get a link down status, then +trex server using NNT nic will quit. + +.. code-block:: console + + WATCHDOG: task 'master' has not responded for more than 2.00044 seconds - timeout is 2 seconds + + *** traceback follows *** + + 1 0x55a7c779561a ./_t-rex-64(+0x12761a) [0x55a7c779561a] + 2 0x7f23da4be1b0 /lib64/libpthread.so.0(+0x121b0) [0x7f23da4be1b0] + 3 0x55a7c7942d40 rte_delay_us_block + 128 + 4 0x55a7c798d731 ixgbe_setup_mac_link_multispeed_fiber + 337 + 5 0x55a7c79a8f14 ./_t-rex-64(+0x33af14) [0x55a7c79a8f14] + 6 0x55a7c7954c72 rte_eth_link_get_nowait + 114 + 7 0x55a7c776a988 DpdkTRexPortAttr::update_link_status_nowait() + 24 + 8 0x55a7c77856a6 CGlobalTRex::handle_slow_path() + 118 + 9 0x55a7c7785ad7 CGlobalTRex::run_in_master() + 759 + 10 0x55a7c7785e3c ./_t-rex-64(+0x117e3c) [0x55a7c7785e3c] + 11 0x55a7c793efba rte_eal_mp_remote_launch + 346 + 12 0x55a7c7789e1e main_test(int, char**) + 1038 + 13 0x7f23d9417f2a __libc_start_main + 234 + 14 0x55a7c7719b9d ./_t-rex-64(+0xabb9d) [0x55a7c7719b9d] + + + *** addr2line information follows *** + + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + ??:0 + + + ./t-rex-64: line 80: 25870 Aborted (core dumped) ./_$( + +other issues +~~~~~~~~~~~~ + +#. linux kernel version should not be too low. + +#. Trex only works with even number link peers. + +#. Trex only works with nics, which are using the same driver. + +#. Before boot up trex, please make sure the peer ports are on up status. + +#. If you have ran dpdk on the platform which you want to deploy trex-server, + reboot the platform to make sure that trex-server can work fine. + +#. If using i40e driver, Trex v2.41 version need i40e nic firmware version newer than 5.02. + +#. trex will drop the received packet, which dst mac is the port mac address. From patchwork Wed Apr 6 15:11:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Juraj_Linke=C5=A1?= X-Patchwork-Id: 109291 X-Patchwork-Delegate: thomas@monjalon.net 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 8D063A0508; Wed, 6 Apr 2022 17:14:26 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0F98E42934; Wed, 6 Apr 2022 17:11:45 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 6AFE042900 for ; Wed, 6 Apr 2022 17:11:37 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id CE402184FE8; Wed, 6 Apr 2022 17:11:36 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mQ1UmAA_srP7; Wed, 6 Apr 2022 17:11:35 +0200 (CEST) Received: from entguard.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 45252184FFD; Wed, 6 Apr 2022 17:11:18 +0200 (CEST) From: =?utf-8?q?Juraj_Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com Cc: dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= Subject: [RFC PATCH v1 24/24] dts: merge DTS doc/dts_gsg/usr_guide/usage.rst to DPDK Date: Wed, 6 Apr 2022 15:11:06 +0000 Message-Id: <20220406151106.2915304-25-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> References: <20220406151106.2915304-1-juraj.linkes@pantheon.tech> MIME-Version: 1.0 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 --- dts/doc/dts_gsg/usr_guide/usage.rst | 350 ++++++++++++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100644 dts/doc/dts_gsg/usr_guide/usage.rst diff --git a/dts/doc/dts_gsg/usr_guide/usage.rst b/dts/doc/dts_gsg/usr_guide/usage.rst new file mode 100644 index 0000000000..ba714703c0 --- /dev/null +++ b/dts/doc/dts_gsg/usr_guide/usage.rst @@ -0,0 +1,350 @@ +Usage +===== + +Configuration +------------- + +Configuring your own execution file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First of all, you must configure execution.cfg as below: + +.. code-block:: console + + [Execution1] + crbs= + drivername=vfio-pci + build_type=meson + rx_mode=avx512 + test_suites= + hello_world, + targets= + x86_64-native-linuxapp-gcc + parameters=nic_type=cfg:func=true + +* crbs: IP address of the DUT. The detail information is defined in file $DTS_CFG_FOLDER/crbs.cfg. +* drivername: the driver devices used by DPDK bound to. +* build_type: the tool for building DPDK, it can be meson. +* rx_mode: vector instructions used in tests, it can be novector/sse/avx2/avx512. it is optional, if not set, dpdk uses avx2 by default. +* test_suites: test suites and cases that to be executed. use ``:`` to separate suite and it's cases and use ``\`` to separate different cases. +* targets: DPDK targets to be tested. +* parameters: multiple keywords as following: + + * nic_type: it is the type of the NIC to use. The types are defined in the file settings.py. + There's a special type named as **cfg**, which mean network information will be loaded from file $DTS_CFG_FOLDER/ports.cfg. + If use NIC type such as niantic, fortville_25g, it requires all DUT are the same types and no any same devices connected to Tester, + as DTS will test all devices connected to Tester. Therefore, recommend using **cfg**. + * func=true: run only functional test. + * perf=true: run only performance test. + +.. note:: + + The two options ``func=true`` and ``perf=true`` are mutually exclusive, as the traffic generators for functional and performance are mutually exclusive. + +Here are an example for functional testing: + +.. code-block:: console + + [Execution1] + crbs=192.168.1.1 + drivername=vfio-pci + build_type=meson + test_suites= + unit_tests_eal:test_version\test_common, + targets= + x86_64-default-linuxapp-gcc, + parameters=nic_type=cfg:func=true + + +Configure CRB information +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Then please add the detail information about your CRB in $DTS_CFG_FOLDER/crbs.conf as following: + +.. code-block:: console + + [DUT IP] + dut_ip=xxx.xxx.xxx.xxx + dut_user=root + dut_passwd= + os=linux + dut_arch= + tester_ip=xxx.xxx.xxx.xxx + tester_passwd= + pktgen_group= + channels=4 + bypass_core0=True + dut_cores= + +* DUT IP: section name, same as ``crbs`` in execution.cfg. +* dut_ip: IP address of the DUT, same as ``crbs`` in execution.cfg. +* dut_user: User name of DUT linux account +* dut_passwd: Password of DUT linux account +* tester_ip: IP address of tester +* tester_passwd: Password of Tester linux account, user name should same as dut_user +* pktgen_group: traffic generator name, it can be ``trex`` or ``ixia``, it is optional, if not set, DTS can't do performance tests. +* channels: number of memory channels for DPDK EAL +* bypass_core0: skip the first core when initialize DPDK +* dut_cores: DUT core list, eg: 1,2,3,4,5,18-22, it is optional, if it is ``None`` or not set, all core list will be used. + +Here are an example for functional testing: + +.. code-block:: console + + [192.168.1.1] + dut_ip=192.168.1.1 + dut_user=root + dut_passwd=dutpasswd + os=linux + tester_ip=192.168.1.2 + tester_passwd=testerpasswd + channels=4 + bypass_core0=True + + +Configure port information +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If set ``nic_type=cfg`` in execution.cfg, please add port configuration in $DTS_CFG_FOLDER/ports.cfg as following: + +.. code-block:: console + + [DUT IP] + ports = + pci=,peer=; + pci=,peer=IXIA:X.Y; + pci=,peer=TREX:X; + +It supports three patterns, the first one is for functional testing, the second one is for ``IXIA``, the third one is for ``TRex``: + +* pci: Device pci address of DUT +* peer: info of Tester port which connected to the DUT device: + + * if it is func testing, it is pci address + * if pktgen is ``TRex``, the `X` in ``TREX:X`` is port id in TRex configuration file, e.g. /etc/trex_cfg.yaml. + * if pktgen is ``IXIA``, the `X` is card id ,and the `Y` is port id, which configured in DTS_CFG_FOLDER/pktgen.cfg (./conf/pktgen.cfg by default). + +Here are an example for functional testing: + +.. code-block:: console + + [192.168.1.1] + ports = + pci=0000:06:00.0,peer=0000:81:00.0; + pci=0000:06:00.1,peer=0000:81:00.1; + +Here are an example for IXIA: + +.. code-block:: console + + [192.168.1.1] + ports = + pci=0000:18:00.0,peer=IXIA:1.1; + pci=0000:18:00.1,peer=IXIA:1.2; + +Here are an example for TRex: + +.. code-block:: console + + [192.168.1.1] + ports = + pci=0000:18:00.0,peer=TREX:1; + pci=0000:18:00.1,peer=TREX:1; + + +Configure all test suites +~~~~~~~~~~~~~~~~~~~~~~~~~ + +$DTS_CFG_FOLDER/global_suite.cfg is a global suite configure file which is shared by all suites. + +.. code-block:: console + + [global] + vf_driver=vfio-pci + +* vf_driver: VF driver that for VF testing, recommend keep the default value ``vfio-pci``. + + +Configure your own suites +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Not all test suites have it's own configuration file which depended on script. If it has, the configuration file is $DTS_CFG_FOLDER/[suite_name].cfg +For example, suite metrics has its suite configure file $DTS_CFG_FOLDER/metric.cfg: + +.. code-block:: console + + [suite] + frames_cfg = { 64: 0.07, 128: 0.04, 256: 0.02, 512: 0.01, 1024: 0.01 } + duration = 60 + sample_number = 3 + rates = [100, 80, 40, 20] + + +Configure your pktgen +~~~~~~~~~~~~~~~~~~~~~ + +Pktgen information are configured in $DTS_CFG_FOLDER/pktgen.cfg, pktgen_group must be configured too: + +* traffic generator is ``TRex``, set ``pktgen_group=trex`` in crbs.cfg. +* traffic generator is ``IXIA``, set ``pktgen_group=ixia`` in crbs.cfg. + +Then configure $DTS_CFG_FOLDER/pktgen.cfg as following: + +.. code-block:: console + + [TREX] + trex_root_path=/opt/trex/v2.84/ + trex_lib_path=/opt/trex/v2.84/automation/trex_control_plane/interactive + config_file=/etc/trex_cfg.yaml + server=192.168.1.1 # equal to tester IP, TREX should be installed in tester + pcap_file=/opt/trex/v2.84/stl/sample.pacp + core_num=16 + ip_src=16.0.0.1 + ip_dst=10.0.0.1 + warmup=15 + duration=-1 + start_trex=yes + + [IXIA] + ixia_version=6.62 + ixia_ip=xxx.xxx.xxx.xxx + ixia_ports= + card=1,port=1; + card=1,port=2; + card=1,port=3; + card=1,port=4; + +* TREX: section name for TRex. +* trex_root_path: source code path for TRex +* trex_lib_path: the director where dts can import Trex API +* start_trex: whether DTS start TRex server, suggest 'yes' for one-time test, and 'no' for CI integration + +* IXIA: section name for IXIA. +* ixia_version: the version of IxExplorer. +* ixia_ip: IP of ixia +* ixia_ports: ixia ports connected to DUT. + +Here are an example for TRex: + +.. code-block:: console + + [TREX] + trex_root_path=/opt/trex/v2.84/ + trex_lib_path=/opt/trex/v2.84/automation/trex_control_plane/interactive + config_file=/etc/trex_cfg.yaml + server=192.168.1.1 # equal to tester IP, TREX should be installed in tester + pcap_file=/opt/trex/v2.84/stl/sample.pacp + core_num=16 + ip_src=16.0.0.1 + ip_dst=10.0.0.1 + warmup=15 + duration=-1 + start_trex=yes + +Here are an example for IXIA: + +.. code-block:: console + + [IXIA] + ixia_version=9.00 + ixia_ip=192.168.2.1 + ixia_ports= + card=3,port=1; + card=3,port=2; + ixia_force100g=disable + + +Running the Application +----------------------- + +DTS supports multiple parameters which will select different of working mode of test framework. +In the meantime, DTS can work with none parameter, then every parameter will set to its default value: + +.. code-block:: console + + usage: main.py [-h] [--config-file CONFIG_FILE] [--snapshot SNAPSHOT] [--output OUTPUT] [-s] + [-t TEST_CASES] [-d DIR] [-v] [--debug] [--debugcase] [--re_run RE_RUN] + [--commands COMMANDS] [--update-expected] + +DTS supports the following parameters: + +* ``-h, --help`` + + Display a help message and quit. + +* ``--config-file CONFIG_FILE`` + + Execution file which contains test suites, DPDK target information and so on. + The default value is `execution.cfg`. + +* ``--snapshot SNAPSHOT`` + + Snapshot .tgz file to use as input。 + The deault value is `./dep/dpdk.tar.gz`. + +* ``--output OUTPUT`` + + Output directory where dts log and result saved. + The default value is `./output`. + +* ``-s, --skip-setup`` + + Skip all possible setup steps done on both DUT and tester. + +* ``-t TEST_CASES, --test-cases TEST_CASES`` + + Execute only the specific test cases. + The default value is all test cases. + +* ``-d DIR`` + + Output directory where dpdk package is extracted. + +* ``-v, --verbose`` + + Enable verbose output, all message output on screen. + +* ``--debug`` + + Enable debug mode, user can enter debug mode in process with `ctrl+c` + User can do further debug by attached to sessions or call pdb module by interact interface: + +.. code-block:: console + + help(): show help message + list(): list all connected sessions + connect(name): connect to session directly + exit(): exit dts + quit(): quit debug mode and into normal mode + debug(): call python debug module + +* ``--debugcase`` + + Enable debug mode with test cases. + DTS will hang and wait for user command before executing each test case: + +.. code-block:: console + + rerun(): rerun current case + ctrl + d: exit current case + +* ``--re_run RE_RUN`` + + Times that will re-run when case failed. + The default value is 0, and it must be >=0. + +* ``--update-expected`` + + Enable write-back expected value of performance. + It requires test scripts support. + +Here are examples: + +.. code-block:: console + + ./dts + ./dts -s + ./dts -s -d /home/dpdk + ./dts --debug + ./dts --debug --debugcase + ./dts --output test1