From patchwork Fri Aug 25 16:19:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jiale, SongX" X-Patchwork-Id: 130744 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 8B56E430FE; Fri, 25 Aug 2023 10:10:47 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8696341148; Fri, 25 Aug 2023 10:10:47 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id 2CAE640695 for ; Fri, 25 Aug 2023 10:10:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1692951045; x=1724487045; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=QjrMMqIAnn/qf5hdWUN9jAZk+DdQlRof7wZeYy7dY7M=; b=KgqNY0b4Xpzljx1cCdr3vvnAtWX5XBYPiQDCk8F6wWDXzxP/GVKVkTB0 kuFeklgNu+1BaFc9ml9Y9VjvGPoW7Enjnee/3Wb8WIvPFlT93B4lq06xg PmZPqz1r2WDjOA3JysbXhDGSsH95HBu539Pvwv8a4OZhpadOZQKGus63c GewNkYl346faySoy0gbsuVYjeHtgBSmwxJ6cneer8bsAyYB3GMUvTESW0 RAsKwU3yahsuxMLnoUSLaUWCkFv6+2FQ0L2eKbeuKN72hp6uZoDcFGUIX wXZ8HJc0B7hGu1IPX4UIzHLIwP2BFMViUHmut3In9Fy/bYNM7sRv/DhmN Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10812"; a="461023449" X-IronPort-AV: E=Sophos;i="6.02,195,1688454000"; d="scan'208";a="461023449" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Aug 2023 01:10:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10812"; a="766879830" X-IronPort-AV: E=Sophos;i="6.02,195,1688454000"; d="scan'208";a="766879830" Received: from unknown (HELO localhost.localdomain) ([10.239.252.96]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Aug 2023 01:10:42 -0700 From: Jiale Song To: dts@dpdk.org Cc: Jiale Song Subject: [dts] [PATCH V2 1/3] test_plans/index: add new test plan for mev cpfl support hairpin queue Date: Fri, 25 Aug 2023 16:19:21 +0000 Message-Id: <20230825161923.2832805-2-songx.jiale@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230825161923.2832805-1-songx.jiale@intel.com> References: <20230825161923.2832805-1-songx.jiale@intel.com> MIME-Version: 1.0 X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org add new test plan for mev cpfl support hairpin queue. Signed-off-by: Jiale Song --- test_plans/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test_plans/index.rst b/test_plans/index.rst index 2ac4850d..d54279ce 100644 --- a/test_plans/index.rst +++ b/test_plans/index.rst @@ -304,3 +304,5 @@ The following are the test plans for the DPDK DTS automated test system. vmdq_dcb_test_plan acl_test_plan power_negative_test_plan + + mev_cpfl_hairpin_queue_test_plan From patchwork Fri Aug 25 16:19:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jiale, SongX" X-Patchwork-Id: 130745 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 11227430FF; Fri, 25 Aug 2023 10:10:48 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ACBDD42D13; Fri, 25 Aug 2023 10:10:47 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id D9C5741148 for ; Fri, 25 Aug 2023 10:10:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1692951047; x=1724487047; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=5z2rXUGTxa7+Mi/hMn/gqcMxr7v2KH0dMBCTPqq90k0=; b=jU2eXxe+Wt2Z3CETJgt9CHjBJbwWhGrruhxS3YV1jRuvswERk5o/LLdj 7M4/skbVAzgcTfo1+dsuzxw9fKUcdwTfsO316yD9D8BpsgfRivlhSZVeo RlHoNWCV5izdbFZUfkskZchjISpV5DvfT41Ua9iPiaX4oP9FSCNuCcP9U G/rG6liAu6WCr9z8s5KmH6o4qhD3byye4I5+2YAf/h2T4UQHEW0QiHZZE sunNPIYiW8/C/zM3vDPeWbckwXYKan1dfiIkPznnq16Ei4maERaIFppEI jgIKUWYw33V97rfYfjGNkeKjJDxj8g4LEleGOQiDo0SCz+8RcxopRwZ/w A==; X-IronPort-AV: E=McAfee;i="6600,9927,10812"; a="461023452" X-IronPort-AV: E=Sophos;i="6.02,195,1688454000"; d="scan'208";a="461023452" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Aug 2023 01:10:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10812"; a="766879833" X-IronPort-AV: E=Sophos;i="6.02,195,1688454000"; d="scan'208";a="766879833" Received: from unknown (HELO localhost.localdomain) ([10.239.252.96]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Aug 2023 01:10:44 -0700 From: Jiale Song To: dts@dpdk.org Cc: Jiale Song Subject: [dts] [PATCH V2 2/3] test_plans/mev_cpfl_hairpin_queue: mev cpfl support hairpin queue Date: Fri, 25 Aug 2023 16:19:22 +0000 Message-Id: <20230825161923.2832805-3-songx.jiale@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230825161923.2832805-1-songx.jiale@intel.com> References: <20230825161923.2832805-1-songx.jiale@intel.com> MIME-Version: 1.0 X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org enabling Port2Port forwarding as hairpin queue implementation in dpdk cpfl PMD. Signed-off-by: Jiale Song --- .../mev_cpfl_hairpin_queue_test_plan.rst | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 test_plans/mev_cpfl_hairpin_queue_test_plan.rst diff --git a/test_plans/mev_cpfl_hairpin_queue_test_plan.rst b/test_plans/mev_cpfl_hairpin_queue_test_plan.rst new file mode 100644 index 00000000..0f2ee4bf --- /dev/null +++ b/test_plans/mev_cpfl_hairpin_queue_test_plan.rst @@ -0,0 +1,100 @@ +============================== +MEV CPFL Support Hairpin Queue +============================== + +Description +=========== +Enabling Port2Port forwarding as hairpin queue implementation in dpdk cpfl PMD. +launch testpmd not start forwarding, multi hairpin queues receive and transmit packet. +start forwarding, multi data queues receive and transmit packet; + +Prerequisites +============= +1. CI release >= MEV 0.81(3921):: + + [root@mev-acc-rl ~]# cat /etc/issue + MEV ACC mev-hw-b0-ci-ts.release.3921 + +2. During IMC boot, press 'N' when you see 'start init app and auxiliary script [Y/N]'.:: + + cd /etc/dpcp + cp cfg/cp_init_use_case_2.cfg ./cp_init.cfg + cp cp_init.cfg cp_init.cfg.bak + sed -i 's/pf_allowed_to_create_p2p = 5;/pf_allowed_to_create_p2p = 8;/g' cp_init.cfg + sed -i 's/cpf_host = 4;/cpf_host = 0;/g' cp_init.cfg + +3. Update customized package:: + + copy package to /etc/dpcp/package/ and rename with default_pkg.pkg. + cd /etc/dpcp/package/ + rm default_pkg.pkg + ssh-keygen -f "/root/.ssh/known_hosts" -R "100.0.0.100" + scp default_pkg.pkg root@100.0.0.100:/etc/dpcp/package/ + +4. Run /etc/init.d/run_default_init_app + +Test Case +========= +Common Steps +------------ +1. Launch testpmd but not start forwarding. + +2. Configure port to receive packets on IMC:: + + cli_client --query --config --verbose + devmem 0x202920C100 64 0x804 + +3. Create rule on IMC:: + + vi rule_1.txt + opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x20,0x24,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1d,0x64,00,00,00,00,00,00,00,00,00,00,00,00, + 0xa,0x2,0x1d,0x2,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0} act=set_q{qnum=0x151 no_implicit_vsi=1 prec=5} act=count{counter_id=0x10 slot=0x0 prec=0x3} + + cli_client -x -f rule_1.txt + +4. Send match packet from tester and check tester can receive the transmit packet:: + + tcpdump -i ens21f0 -env -Q in + sendp([Ether(dst="de:ad:be:ef:20:24")/IP(src="10.2.29.100", dst="10.2.29.2")/UDP()],iface="ens21f0",count=1) + +5. Send mismatch packets form tester and check tester can't receive the transmit packet:: + + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.101", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.4")/UDP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/TCP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2"),iface="ens21f0",count=1) + +6. Start testpmd forwarding and send mismatch packets, check testpmd can receive and transmit packets:: + + testpmd> start + testpmd> set verbose 1 + testpmd> show port stats all + +7. Send mismatch packets form tester and check tester can't receive the transmit packet:: + + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.101", dst="10.2.29.2")/UDP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.4")/UDP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2")/TCP(),iface="ens21f0",count=1) + sendp(Ether(dst="de:ad:be:ef:20:25")/IP(src="10.2.29.100", dst="10.2.29.2"),iface="ens21f0",count=1) + +Test case 1: single_hairpin_queue +--------------------------------- +Test subcase 1: single_hairpin_queue_single_data_queue +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +./dpdk-testpmd -l 1-2 -n 4 -a af:00.6,vport=0 -- -i --rxq=1 --txq=1 --hairpinq=1 --hairpin-mode=0 + +Test subcase 2: single_hairpin_queue_multi_data_queue +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +./dpdk-testpmd -l 1-2 -n 4 -a ca:00.6,vport=0 -- -i --rxq=16 --txq=16 --hairpinq=1 --hairpin-mode=0 + +Test case 2: multi_hairpin_queue +--------------------------------- +Test subcase 1: multi_hairpin_queue_single_data_queue +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +./dpdk-testpmd -l 1-2 -n 4 -a ca:00.6,vport=0 -- -i --rxq=1 --txq=1 --hairpinq=16 --hairpin-mode=0 + +Test subcase 2: multi_hairpin_queue_multi_data_queues +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +./dpdk-testpmd -l 1-2 -n 4 -a ca:00.6,vport=0 -- -i --rxq=16 --txq=16 --hairpinq=16 --hairpin-mode=0 From patchwork Fri Aug 25 16:19:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jiale, SongX" X-Patchwork-Id: 130746 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 D676A430FE; Fri, 25 Aug 2023 10:10:49 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D160C42D12; Fri, 25 Aug 2023 10:10:49 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id 24F6640695 for ; Fri, 25 Aug 2023 10:10:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1692951048; x=1724487048; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4DatfW4XDl4KEmpVfM96qQXbUuO53S9NKcKfiE1IXHg=; b=kcU3TzCh0p6Bv5+twZj4fhgqqsLCap/yxYQfBtpUMfefNMrtWAml4A9Z 8OX45JcUoQxuBYUpZWCqg9wOWbO6xaRRq3dCYoN/YJBfIF26yHMAA3aMh +gBHJB8WN+q5/d8exAaGezdh/rwbzr6U/qj3AAV278Ar9ssM1Sesp9u6n MrxJFqEvwlc38BB7YDk6GNzbhXusycbQ2cQsR17s3HTWbkOIxR0EefnXf ZCHBmc4Edf3sOD9HdoTKWO5kJrJctut1evtWt+fLZZUgG/zXsSVzYzdW0 kpbij7BQKQiAYb/+Gz2ZGO3h3OxvU+49qwEyLg9rJ9BLCp2NugWI20sNi Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10812"; a="461023460" X-IronPort-AV: E=Sophos;i="6.02,195,1688454000"; d="scan'208";a="461023460" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Aug 2023 01:10:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10812"; a="766879836" X-IronPort-AV: E=Sophos;i="6.02,195,1688454000"; d="scan'208";a="766879836" Received: from unknown (HELO localhost.localdomain) ([10.239.252.96]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Aug 2023 01:10:46 -0700 From: Jiale Song To: dts@dpdk.org Cc: Jiale Song Subject: [dts] [PATCH V2 3/3] tests/mev_cpfl_hairpin_queue: mev cpfl support hairpin queue Date: Fri, 25 Aug 2023 16:19:23 +0000 Message-Id: <20230825161923.2832805-4-songx.jiale@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230825161923.2832805-1-songx.jiale@intel.com> References: <20230825161923.2832805-1-songx.jiale@intel.com> MIME-Version: 1.0 X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org enabling Port2Port forwarding as hairpin queue implementation in dpdk cpfl PMD. Signed-off-by: Jiale Song --- tests/TestSuite_mev_cpfl_hairpin_queue.py | 257 ++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 tests/TestSuite_mev_cpfl_hairpin_queue.py diff --git a/tests/TestSuite_mev_cpfl_hairpin_queue.py b/tests/TestSuite_mev_cpfl_hairpin_queue.py new file mode 100644 index 00000000..b2909e3d --- /dev/null +++ b/tests/TestSuite_mev_cpfl_hairpin_queue.py @@ -0,0 +1,257 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2023 Intel Corporation +# +import re +import time + +from framework.packet import Packet +from framework.pmd_output import PmdOutput +from framework.test_case import TestCase + +match_pkts = { + "rule_1_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="de:ad:be:ef:20:24")/IP(src="10.2.29.100", dst="10.2.29.2")/UDP()', + "rule_2_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="00:06:00:00:02:18")/IP(src="133.133.10.20", dst="133.133.10.10")/UDP()', + "rule_3_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="de:ad:be:ef:05:34")/IP(src="10.2.28.10", dst="10.2.28.20")/UDP()', + "rule_4_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="de:ad:be:ef:10:14")/IP(src="10.2.28.10", dst="10.2.28.20")/TCP()', + "rule_5_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="00:05:00:00:03:17")/IP(src="133.133.10.60", dst="133.133.10.20")/UDP()', + "rule_6_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="de:ad:be:ef:08:84")/IP(src="10.2.28.19", dst="10.2.28.29")/UDP()', + "rule_7_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="00:05:00:00:03:18")/IP(src="133.133.10.60", dst="133.133.10.10")/TCP()', + "rule_8_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="dc:ad:be:ef:04:29")/IP(src="10.2.28.39", dst="10.2.28.49")/UDP()', + "rule_9_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="de:ad:be:ef:10:14")/IP(src="10.2.28.10", dst="10.2.28.20")/TCP()', + "rule_10_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="00:08:00:00:03:19")/IP(src="133.133.10.60", dst="133.133.10.30")/TCP()', + "rule_11_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="00:06:00:00:02:18")/IP(src="10.2.29.100", dst="10.2.29.2")/TCP()', + "rule_12_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="00:07:00:00:05:19")/IP(src="133.133.10.20", dst="133.133.10.10")/TCP()', + "rule_13_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="00:05:00:00:03:17")/IP(src="133.133.10.60", dst="133.133.10.20")/TCP()', + "rule_14_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="dc:ad:be:ef:04:29")/IP(src="10.2.28.39", dst="10.2.28.49")/TCP()', + "rule_15_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="de:ad:be:ef:08:84")/IP(src="10.2.28.19", dst="10.2.28.29")/TCP()', + "rule_16_match_pkt": 'Ether(src="00:11:22:33:44:55", dst="da:ad:be:ef:06:19")/IP(src="10.2.28.29", dst="10.2.28.39")/TCP()', +} + +hairpin_rules = { + "rule_1": "opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x20,0x24,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1d,0x64,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1d,0x2,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_2": "opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,00,0x06,0x00,0x00,0x02,0x18,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0x85,0x85,0xa,0x14,00,00,00,00,00,00,00,00,00,00,00,00,\ +0x85,0x85,0xa,0xa,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_3": "opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x05,0x34,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0xa,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x14,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_4": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x10,0x14,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0xa,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x14,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_5": "opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,00,0x05,0x00,0x00,0x03,0x17,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0x85,0x85,0xa,0x3c,00,00,00,00,00,00,00,00,00,00,00,00,\ +0x85,0x85,0xa,0x14,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_6": "opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x08,0x84,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0x13,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x1d,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_7": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,00,0x05,0x00,0x00,0x03,0x18,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0x85,0x85,0xa,0x3c,00,00,00,00,00,00,00,00,00,00,00,00,\ +0x85,0x85,0xa,0xa,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_8": "opcode=0x1303 prof_id=0x34 sub_prof_id=0x0 cookie=0xa2b87 key=0x18,0x0,00,00,00,00,0xdc,0xad,0xbe,0xef,0x04,0x29,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0x27,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x31,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_9": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x10,0x14,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0xa,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x14,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_10": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,00,0x08,0x00,0x00,0x03,0x19,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0x85,0x85,0xa,0x3c,00,00,00,00,00,00,00,00,00,00,00,00,\ +0x85,0x85,0xa,0x1e,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_11": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,00,0x06,0x00,0x00,0x02,0x18,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1d,0x64,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1d,0x2,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_12": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,00,0x07,0x00,0x00,0x05,0x19,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0x85,0x85,0xa,0x14,00,00,00,00,00,00,00,00,00,00,00,00,\ +0x85,0x85,0xa,0xa,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_13": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,00,0x05,0x00,0x00,0x03,0x17,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0x85,0x85,0xa,0x3c,00,00,00,00,00,00,00,00,00,00,00,00,\ +0x85,0x85,0xa,0x14,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_14": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,0xdc,0xad,0xbe,0xef,0x04,0x29,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0x27,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x31,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_15": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,0xde,0xad,0xbe,0xef,0x08,0x84,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0x13,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x1d,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", + "rule_16": "opcode=0x1303 prof_id=0x32 sub_prof_id=0x0 cookie=0xa2b87 key=0x1a,0x0,00,00,00,00,0xda,0xad,0xbe,0xef,0x06,0x19,0x0,0x0,0x0,0x0,00,00,00,00,00,00,0xa,0x2,0x1c,0x1d,00,00,00,00,00,00,00,00,00,00,00,00,\ +0xa,0x2,0x1c,0x27,00,00,00,00,00,00,00,00,00,00,00,00 act=set_vsi{act_val=0 val_type=2 dst_pe=0 slot=0x0}", +} + +mismatch_pkts = { + "mac_ipv4": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IP(src="192.168.0.2",dst="192.168.0.3")/("X"*480)', + "mac_ipv6": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IPv6(src="2001::2",dst="2001::3")/("X"*480)', + "mac_ipv4_udp": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IP(src="10.2.28.12", dst="10.2.28.22")/UDP(sport=1026, dport=1027)/("X"*480)', + "mac_ipv4_tcp": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IP(src="10.2.28.12", dst="10.2.28.22")/TCP(sport=1026, dport=1027)/("X"*480)', + "mac_ipv4_sctp": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IP(src="10.2.28.12", dst="10.2.28.22")/SCTP(sport=1026, dport=1027)/("X"*480)', + "mac_ipv6_udp": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IPv6(src="2001::2",dst="2001::3")/UDP(sport=1026, dport=1027)/("X"*480)', + "mac_ipv6_tcp": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IPv6(src="2001::2",dst="2001::3")/TCP(sport=1026, dport=1027)/("X"*480)', + "mac_ipv6_sctp": 'Ether(src="00:11:22:33:44:55", dst="02:70:80:C6:67:CE")/IPv6(src="2001::2",dst="2001::3")/SCTP(sport=1026, dport=1027)/("X"*480)', +} + + +class TestMevHairpinQueue(TestCase): + def set_up_all(self): + """ + Run at the start of each test suite. + Generic filter Prerequistites + """ + self.verify( + self.nic in ["mev-cpfl"], + "%s nic not support hairpin queue" % self.nic, + ) + self.dut_ports = self.dut.get_ports(self.nic) + self.ports_socket = self.dut.get_numa_id(self.dut_ports[0]) + # Verify that enough ports are available + self.verify(len(self.dut_ports) >= 1, "Insufficient ports") + self.tester_port0 = self.tester.get_local_port(self.dut_ports[0]) + self.tester_iface0 = self.tester.get_interface(self.tester_port0) + self.pkt = Packet() + self.pmdout = PmdOutput(self.dut) + self.pf_pci = self.dut.ports_info[self.dut_ports[0]]["pci"] + self.imc_rule_dir = "/home/rule/" + + def set_up(self): + """ + Run before each test case. + """ + pass + + def launch_testpmd(self, rxq, txq, hairpinq): + """ + start testpmd + """ + # Prepare testpmd EAL and parameters + out = self.pmdout.start_testpmd( + "Default", + param="--rxq=%d --txq=%d --hairpinq=%d --hairpin-mode=0" + % (rxq, txq, hairpinq), + ) + qnum = re.findall("hairpin: vport 0, Rxq id (\w+)", out) + return qnum + + def start_testpmd(self): + self.pmdout.execute_cmd("set verbose 1") + self.pmdout.execute_cmd("start") + # test link status + res = self.pmdout.wait_link_status_up("all", timeout=15) + self.verify(res is True, "There have port link is down") + + def create_imc_rule(self, count, rules): + self.dut.imc_session.send_expect("mkdir -p %s" % (self.imc_rule_dir), "# ") + self.dut.imc_session.send_expect("cd %s" % (self.imc_rule_dir), "# ") + self.dut.imc_session.send_expect("rm rule_*.txt", "# ") + for i in range(count): + rule = rules["rule_%d" % (i + 1)] + self.dut.imc_session.send_expect( + "echo '%s' > rule_%d.txt" % (rule, i + 1), "# " + ) + output = self.dut.imc_session.send_expect( + "cli_client -x -f rule_%d.txt" % (i + 1), "# " + ) + self.verify("WARNING" not in output, "Found bad key in rule") + self.verify("File successfully processed" in output, "Create rule failed") + + def delete_imc_rule(self, count): + self.dut.imc_session.send_expect("cd %s" % (self.imc_rule_dir), "# ") + self.dut.imc_session.send_expect("ls", "# ") + for i in range(count): + self.dut.imc_session.send_expect( + "sed -i 's/opcode=0x1303/opcode=0x1305/g' rule_%d.txt" % (i + 1), "# " + ) + output = self.dut.imc_session.send_expect( + "cli_client -x -f rule_%d.txt" % (i + 1), "# " + ) + self.verify("WARNING" not in output, "Found bad key in rule") + self.verify("File successfully processed" in output, "Create rule failed") + + def send_packets(self, packets, tx_port, count=1): + self.pkt.update_pkt(packets) + self.pkt.send_pkt(crb=self.tester, tx_port=tx_port, count=count) + + def check_tcpdump_pkts(self, pkts, count, receive=True): + filters = [{"layer": "ether", "config": {"src": "00:11:22:33:44:55"}}] + inst = self.tester.tcpdump_sniff_packets(self.tester_iface0, filters=filters) + self.pmdout.execute_cmd("clear port stats all") + for i in range(len(pkts)): + pkt = pkts[i] + self.pkt.update_pkt(pkt) + self.pkt.send_pkt(crb=self.tester, tx_port=self.tester_iface0, count=1) + self.pmdout.execute_cmd("show port stats all") + p = self.tester.load_tcpdump_sniff_packets(inst) + if receive: + self.verify( + len(p) == count, + "Expected to receive %d packages, but received %d packages" + % (count, len(p)), + ) + else: + self.verify( + len(p) == 0, + "Expected to receive 0 packages, but received %d packages" % (len(p)), + ) + + def validate_hairpin_queue(self, count, rules, match_pkts): + mismatch_pkt = list(mismatch_pkts.values()) + self.create_imc_rule(count, rules) + self.check_tcpdump_pkts(match_pkts, count, receive=True) + self.check_tcpdump_pkts(mismatch_pkt, count, receive=False) + self.start_testpmd() + self.check_tcpdump_pkts(mismatch_pkt, count=8, receive=True) + self.delete_imc_rule(count) + + def test_single_hairpin_queue(self): + """ + Test Case 1: Launch 1 hairpin queue + """ + self.logger.info( + "====================Test subcase 1: single_hairpin_queue_single_data_queue====================" + ) + qnum = self.launch_testpmd(rxq=1, txq=1, hairpinq=1) + rules = {} + match_pkt = [match_pkts["rule_4_match_pkt"]] + rules["rule_1"] = ( + hairpin_rules["rule_4"] + + " act=set_q{qnum=%s no_implicit_vsi=1 prec=5}" % qnum[0] + ) + self.validate_hairpin_queue(count=1, rules=rules, match_pkts=match_pkt) + self.pmdout.execute_cmd("stop") + self.pmdout.quit() + + self.logger.info( + "====================Test subcase 2: single_hairpin_queue_multi_data_queue====================" + ) + qnum = self.launch_testpmd(rxq=16, txq=16, hairpinq=1) + match_pkt = [match_pkts["rule_1_match_pkt"]] + rules["rule_1"] = ( + hairpin_rules["rule_1"] + + " act=set_q{qnum=%s no_implicit_vsi=1 prec=5}" % qnum[0] + ) + self.validate_hairpin_queue(count=1, rules=rules, match_pkts=match_pkt) + + def test_multi_hairpin_queues(self): + """ + Test Case 2: Launch 16 hairpin queues + """ + self.logger.info( + "====================Test subcase 1: multi_hairpin_queue_single_data_queue====================" + ) + qnum = self.launch_testpmd(rxq=1, txq=1, hairpinq=16) + match_pkt = list(match_pkts.values()) + rules = {} + for i in range(16): + rules["rule_%d" % (i + 1)] = ( + hairpin_rules["rule_%d" % (i + 1)] + + " act=set_q{qnum=%s no_implicit_vsi=1 prec=5}" % qnum[i] + ) + self.validate_hairpin_queue(count=16, rules=rules, match_pkts=match_pkt) + self.pmdout.execute_cmd("stop") + self.pmdout.quit() + + self.logger.info( + "====================Test subcase 2: multi_hairpin_queue_multi_data_queues====================" + ) + qnum = self.launch_testpmd(rxq=16, txq=16, hairpinq=16) + for i in range(16): + rules["rule_%d" % (i + 1)] = ( + hairpin_rules["rule_%d" % (i + 1)] + + " act=set_q{qnum=%s no_implicit_vsi=1 prec=5}" % qnum[i] + ) + self.validate_hairpin_queue(count=16, rules=rules, match_pkts=match_pkt) + + def tear_down(self): + """ + Run after each test case. + """ + self.pmdout.quit() + self.dut.kill_all() + + def tear_down_all(self): + """ + Run after each test suite. + """ + self.dut.kill_all()