From patchwork Tue Jun 15 10:46:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Dong X-Patchwork-Id: 94208 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 7CA1DA0C47; Tue, 15 Jun 2021 12:46:28 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6E6544067A; Tue, 15 Jun 2021 12:46:28 +0200 (CEST) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id E99A440140 for ; Tue, 15 Jun 2021 12:46:25 +0200 (CEST) IronPort-SDR: KHkn+hrRnUHEkqHo2ujEmV0hUf7NZ4Ez4AffFtvug9T2BOF3QvsYG1+X2a6eTYpWo692l8qYdB rd+/gjL1vQsw== X-IronPort-AV: E=McAfee;i="6200,9189,10015"; a="291598475" X-IronPort-AV: E=Sophos;i="5.83,275,1616482800"; d="scan'208";a="291598475" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2021 03:46:24 -0700 IronPort-SDR: jVTctqBBnobSWEEo434v4K54v/HMtedxzjpfK+30pH8SuT8vTvGKGhQU/a54BCVpFzyPoQMCtw rLUB+5meLeXQ== X-IronPort-AV: E=Sophos;i="5.83,275,1616482800"; d="scan'208";a="484428172" Received: from unknown (HELO localhost.localdomain.sh.intel.com) ([10.240.182.57]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2021 03:46:22 -0700 From: Jun Dong To: junx.dong@intel.com Cc: dts@dpdk.org Date: Tue, 15 Jun 2021 18:46:08 +0800 Message-Id: <20210615104613.14658-1-junx.dong@intel.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [dts] [PATCH V1 1/6] dts/*: remove fm10k related modules and patch 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 Sender: "dts" 1. remove dep/fm10k-add-a-unit-test-for-FTAG-based-forwarding patch. 2. remove nics/atwood module. 3. remove nics/br module. 4. remove nics/rrc module. 5. remove tests/TestSuite_fm10k_perf test suite. Signed-off-by: Jun Dong --- ...-unit-test-for-FTAG-based-forwarding.patch | 287 -------- nics/atwood.py | 173 ----- nics/br.py | 275 -------- nics/rrc.py | 272 -------- tests/TestSuite_fm10k_perf.py | 617 ------------------ 5 files changed, 1624 deletions(-) delete mode 100644 dep/fm10k-add-a-unit-test-for-FTAG-based-forwarding.patch delete mode 100644 nics/atwood.py delete mode 100644 nics/br.py delete mode 100644 nics/rrc.py delete mode 100644 tests/TestSuite_fm10k_perf.py diff --git a/dep/fm10k-add-a-unit-test-for-FTAG-based-forwarding.patch b/dep/fm10k-add-a-unit-test-for-FTAG-based-forwarding.patch deleted file mode 100644 index b756b511..00000000 --- a/dep/fm10k-add-a-unit-test-for-FTAG-based-forwarding.patch +++ /dev/null @@ -1,287 +0,0 @@ -From 0882390c731f8d39f81e52b0669651f5484683eb Mon Sep 17 00:00:00 2001 -From: Wang Xiao -Date: Wed, 10 Aug 2016 11:26:23 +0800 -Subject: [PATCH] fm10k: add a unit test for FTAG based forwarding - -This patch adds a unit test case for FTAG functional test. Before running -the test, set PORT0_GLORT and PORT1_GLORT environment variables, and ensure -two fm10k ports are used for dpdk, glort info for each port can be shown in -TestPoint. In the unit test, a packet will be forwarded to the target port -by the switch without changing the destination mac address. - -diff --git a/app/test/test_fm10k_ftag.c b/app/test/test_fm10k_ftag.c -new file mode 100644 -index 0000000..c75a7b1 ---- /dev/null -+++ b/app/test/test_fm10k_ftag.c -@@ -0,0 +1,267 @@ -+/*- -+ * 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. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "test.h" -+ -+#define RX_RING_SIZE 128 -+#define TX_RING_SIZE 512 -+ -+#define NUM_MBUFS 8191 -+#define MBUF_CACHE_SIZE 250 -+#define BURST_SIZE 32 -+ -+struct fm10k_ftag { -+ uint16_t swpri_type_user; -+ uint16_t vlan; -+ uint16_t sglort; -+ uint16_t dglort; -+}; -+ -+static const struct rte_eth_conf port_conf_default = { -+ .rxmode = { .max_rx_pkt_len = ETHER_MAX_LEN } -+}; -+ -+/* -+ * Initializes a given port using global settings and with the RX buffers -+ * coming from the mbuf_pool passed as a parameter. -+ */ -+static inline int -+port_init(uint8_t port, struct rte_mempool *mbuf_pool) -+{ -+ struct rte_eth_conf port_conf = port_conf_default; -+ const uint16_t rx_rings = 1, tx_rings = 1; -+ int retval; -+ uint16_t q; -+ struct ether_addr addr; -+ -+ if (port >= rte_eth_dev_count()) -+ return -1; -+ -+ /* Configure the Ethernet device. */ -+ retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); -+ if (retval != 0) -+ return retval; -+ -+ /* Allocate and set up 1 RX queue per Ethernet port. */ -+ for (q = 0; q < rx_rings; q++) { -+ retval = rte_eth_rx_queue_setup(port, q, RX_RING_SIZE, -+ rte_eth_dev_socket_id(port), NULL, mbuf_pool); -+ if (retval < 0) -+ return retval; -+ } -+ -+ /* Allocate and set up 1 TX queue per Ethernet port. */ -+ for (q = 0; q < tx_rings; q++) { -+ retval = rte_eth_tx_queue_setup(port, q, TX_RING_SIZE, -+ rte_eth_dev_socket_id(port), NULL); -+ if (retval < 0) -+ return retval; -+ } -+ -+ /* Start the Ethernet port. */ -+ retval = rte_eth_dev_start(port); -+ if (retval < 0) -+ return retval; -+ -+ /* Display the port MAC address. */ -+ rte_eth_macaddr_get(port, &addr); -+ printf("Port %u MAC: %02" PRIx8 " %02" PRIx8 " %02" PRIx8 -+ " %02" PRIx8 " %02" PRIx8 " %02" PRIx8 "\n", -+ (unsigned)port, -+ addr.addr_bytes[0], addr.addr_bytes[1], -+ addr.addr_bytes[2], addr.addr_bytes[3], -+ addr.addr_bytes[4], addr.addr_bytes[5]); -+ -+ return 0; -+} -+ -+static int set_glort_value(const char *str, uint16_t *glort) -+{ -+ const char *glort_str; -+ char *end = NULL; -+ -+ glort_str = getenv(str); -+ if (glort_str == NULL) { -+ printf("Please set environment value %s first\n", str); -+ return -1; -+ } -+ *glort = (uint16_t)strtoul(glort_str, &end, 16); -+ if ((glort_str[0] == '\0') || (end == NULL) || (*end != '\0')) { -+ printf("Glort value is not valid\n"); -+ return -1; -+ } -+ return 0; -+} -+ -+static int test_ftag_rxtx(void) -+{ -+ uint8_t port = 0; -+ uint16_t glort[2]; -+ -+ struct rte_mbuf *bufs[BURST_SIZE]; -+ uint16_t nb_rx, nb_tx, i; -+ struct fm10k_ftag *ftag_addr; -+ int ret = 0; -+ -+ /* Get the glort value of the two ports */ -+ if ((set_glort_value("PORT0_GLORT", &glort[0]) < 0) || -+ (set_glort_value("PORT1_GLORT", &glort[1]) < 0)) -+ return -1; -+ -+ /* Receive packets coming from EPL on any of the two ports */ -+ printf("Please send some packets from Ethernet port to one PEP\n"); -+ do { -+ port ^= 1; -+ nb_rx = rte_eth_rx_burst(port, 0, bufs, BURST_SIZE); -+ } while (nb_rx <= 0); -+ printf("Receive %d packets on port %d\n", nb_rx, port); -+ -+ /* Check sglort value on mbuf->vlan_tci_outer. */ -+ for (i = 0; i < nb_rx; i++) { -+ if (bufs[i]->vlan_tci_outer == 0) { -+ printf("Find a packet with sglort 0\n"); -+ return -1; -+ } -+ } -+ printf("test for FTAG RX passed\n"); -+ -+ /* Put an FTAG header on each of the packets received and set FTAG -+ * TX flag -+ **/ -+ for (i = 0; i < nb_rx; i++) { -+ ftag_addr = (struct fm10k_ftag *)rte_pktmbuf_prepend(bufs[i], -+ sizeof(struct fm10k_ftag)); -+ ftag_addr->swpri_type_user = 0; -+ ftag_addr->vlan = 0; -+ ftag_addr->dglort = rte_cpu_to_be_16(glort[port ^ 1]); -+ ftag_addr->sglort = rte_cpu_to_be_16(glort[port]); -+ bufs[i]->timesync = 1; -+ } -+ -+ /* Send packets to the other port by method of FTAG based forwarding */ -+ nb_tx = rte_eth_tx_burst(port, 0, bufs, nb_rx); -+ if (nb_tx <= 0) { -+ printf("Can not send out packets with FTAG\n"); -+ return -1; -+ } -+ if (unlikely(nb_tx < nb_rx)) { -+ do { -+ rte_pktmbuf_free(bufs[nb_tx]); -+ } while (++nb_tx < nb_rx); -+ } -+ printf("Send out %d packets with FTAG on port %d\n", nb_tx, port); -+ -+ /* Wait enough time for a burst of packets forwarding */ -+ rte_delay_us(100); -+ -+ nb_rx = rte_eth_rx_burst(port ^ 1, 0, bufs, BURST_SIZE); -+ printf("Receive %d packets on port %d\n", nb_rx, port ^ 1); -+ if (nb_rx < nb_tx) { -+ printf("Packet loss happens in FTAG TX test\n"); -+ ret = -1; -+ } -+ -+ /* check if the sglort value is right on the other port */ -+ for (i = 0; i < nb_rx; i++) { -+ if (bufs[i]->vlan_tci_outer != glort[port]) { -+ printf("sglort of the received packet is not right\n"); -+ ret = -1; -+ break; -+ } -+ } -+ for (i = 0; i < nb_rx; i++) -+ rte_pktmbuf_free(bufs[i]); -+ -+ if (!ret) -+ printf("test for FTAG TX passed\n"); -+ return ret; -+} -+ -+static int -+test_fm10k_ftag(void) -+{ -+ uint16_t nb_ports; -+ uint16_t portid, pid; -+ struct rte_mempool *mbuf_pool; -+ int ret = 0; -+ -+ printf("Dump the devices args\n"); -+ rte_eal_devargs_dump(stdout); -+ -+ nb_ports = rte_eth_dev_count(); -+ if (nb_ports != 2) { -+ printf("2 ports needed for fm10k ftag based forwarding test\n"); -+ return -1; -+ } -+ -+ /* Creates a new mempool in memory to hold the mbufs. */ -+ mbuf_pool = rte_mempool_lookup("MBUF_POOL_FTAG"); -+ if (mbuf_pool == NULL) -+ mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL_FTAG", -+ NUM_MBUFS * nb_ports, MBUF_CACHE_SIZE, 0, -+ RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); -+ -+ if (mbuf_pool == NULL) -+ rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n"); -+ -+ /* Initialize all ports. */ -+ for (portid = 0; portid < nb_ports; portid++) -+ if (port_init(portid, mbuf_pool) != 0) { -+ for (pid = 0; pid < portid; pid++) { -+ rte_eth_dev_stop(portid); -+ //rte_eth_dev_close(portid); -+ } -+ rte_exit(EXIT_FAILURE, "Cannot init port %"PRIu8 "\n", -+ portid); -+ } -+ -+ if (test_ftag_rxtx() < 0) -+ ret = -1; -+ -+ /* port tear down */ -+ for (portid = 0; portid < nb_ports; portid++) { -+ rte_eth_dev_stop(portid); -+ //rte_eth_dev_close(portid); -+ } -+ -+ return ret; -+} -+ -+REGISTER_TEST_COMMAND(fm10k_ftag_autotest, test_fm10k_ftag); --- -1.9.3 - diff --git a/nics/atwood.py b/nics/atwood.py deleted file mode 100644 index cf7a551b..00000000 --- a/nics/atwood.py +++ /dev/null @@ -1,173 +0,0 @@ -# BSD LICENSE -# -# Copyright(c) 2010-2016 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. - -from crb import Crb -from config import PortConf, PORTCONF -from exception import PortConfigParseException -from utils import GREEN -from net_device import NetDevice -from dts import drivername - -TP_BINARY = 'TestPoint' - -FUNC_RULES = [ - # disable cut through for jumbo frame case - 'set port config 1,2 tx_cut_through off', - # disable mac learning - 'set port config 0..2 learning off', - #redirect PEP0 to EPL0 - 'create acl 0', - 'create acl-rule 0 0', - 'add acl-rule condition 0 0 src-port 0', - 'add acl-rule action 0 0 redirect 1', - 'add acl-rule action 0 0 count', - 'apply acl', - ] - -PERF_RULES = [ - 'set port config 0..1 parser_cfg L4', # frame parser up to L4 - # good for performance - 'set api attribute boolean api.paritySweeper.enable false', - 'reg dbg set 0 CM_SOFTDROP_WM 0x5f005f00 0 0', - 'reg dbg set 0 CM_SHARED_WM 0x5f00 0 0', - ] - -class CtrlCrb(Crb): - """ - Simplified Crb class for RedRockCanyou control session - """ - - def __init__(self, crb): - self.crb = crb - self.NAME = 'dut_atwood_control' - super(CtrlCrb, self).__init__(crb, None, self.NAME) - - def get_ip_address(self): - return self.crb['IP'] - - def get_password(self): - return self.crb['pass'] - - -class Atwood(NetDevice): - """ - Class for RedRockCanyou, inherit from NetDevice class - """ - - def __init__(self, host, domain_id, bus_id, devfun_id): - super(Atwood, self).__init__(host, domain_id, bus_id, devfun_id) - self.tp_path = "~" - self.host = host - - # load port config - portconf = PortConf(PORTCONF) - portconf.load_ports_config(host.crb['IP']) - pci_addr = ':'.join((domain_id, bus_id, devfun_id)) - if not portconf.check_port_available(pci_addr): - raise PortConfigParseException("Atwood must configured") - - port_cfg = portconf.get_ports_config()[pci_addr] - - if 'tp_ip' not in list(port_cfg.keys()): - raise PortConfigParseException("Atwood must configure test point ip") - if 'passwd' not in list(port_cfg.keys()): - raise PortConfigParseException("Atwood must configure host password") - - crb = {} - crb['IP'] = port_cfg['tp_ip'] - crb['pass'] = port_cfg['passwd'] - - if 'tp_path' in list(port_cfg.keys()): - self.tp_path = port_cfg['tp_path'] - - # create additional session - self.ctrl_crb = CtrlCrb(crb) - - def setup(self): - # setup function should be called after bind to igb_uio - self.bind_driver(driver=drivername) - self.start_testpoint() - - def optimize_perf(self, peer=""): - pass - - def stop(self): - # stop testpoint - self.stop_testpoint() - - def close(self): - # close session - if self.ctrl_crb.session: - self.ctrl_crb.session.close() - self.ctrl_crb.session = None - if self.ctrl_crb.alt_session: - self.ctrl_crb.alt_session.close() - self.ctrl_crb.alt_session = None - - def start_testpoint(self): - """ - Before any execution, must enable test point first - """ - self.ctrl_crb.send_expect("cd %s" % self.tp_path, "# ") - if self.tp_path != "~": - command = './' + TP_BINARY - else: - command = TP_BINARY - - self.ctrl_crb.send_expect("%s" % command, "<0>%", 120) - for rule in FUNC_RULES: - self.ctrl_crb.send_expect("%s" %rule, "<0>%") - - def stop_testpoint(self): - """ - Exit test point - """ - self.ctrl_crb.send_expect("quit", "# ") - - def get_control(self): - return self.ctrl_crb - - def add_vlan(self, vlan_id=0): - self.ctrl_crb.send_expect("create vlan %d" % vlan_id, "<0>%") - self.ctrl_crb.send_expect("add vlan port %d 0,1" % vlan_id, "<0>%") - - def delete_vlan(self, vlan_id=0): - self.ctrl_crb.send_expect("del vlan port %d 0,1" % vlan_id, "<0>%") - self.ctrl_crb.send_expect("del vlan %d" % vlan_id, "<0>%") - - def add_txvlan(self, vlan_id=0): - self.ctrl_crb.send_expect("set vlan tagging %d 1 tag" % vlan_id, "<0>%") - - def delete_txvlan(self, vlan_id=0): - self.ctrl_crb.send_expect("set vlan tagging %d 1 untag" % vlan_id, "<0>%") - - def enable_jumbo(self, framesize=0): - self.ctrl_crb.send_expect("set port config 1 max_frame_size %d" % framesize, "<0>%") diff --git a/nics/br.py b/nics/br.py deleted file mode 100644 index 88125e54..00000000 --- a/nics/br.py +++ /dev/null @@ -1,275 +0,0 @@ -# BSD LICENSE -# -# Copyright(c) 2010-2016 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 re -from crb import Crb -from config import PortConf, PORTCONF -from exception import PortConfigParseException -from utils import GREEN -from net_device import NetDevice -from dts import drivername - -TP_BINARY = 'TestPoint' - -FUNC_RULES = [ - # disable cut through for jumbo frame case - 'set port config 0,11 tx_cut_through off', - # disable mac learning - 'set port config 0..11 learning off', - #redirect PEP0 to EPL0 - 'create acl 0', - 'create acl-rule 0 0', - 'add acl-rule condition 0 0 src-port 0', - 'add acl-rule action 0 0 redirect 1', - 'add acl-rule action 0 0 count', - #redirect PEP1 to EPL1 - 'create acl 1', - 'create acl-rule 1 0', - 'add acl-rule condition 1 0 src-port 11', - 'add acl-rule action 1 0 redirect 5', - 'add acl-rule action 1 0 count', - 'apply acl', - ] - -PERF_RULES = [ - 'set port config 0..11 parser_cfg L4', # frame parser up to L4 - # good for performance - 'set api attribute boolean api.paritySweeper.enable false', - 'reg dbg set 0 CM_SOFTDROP_WM 0x5f005f00 0 0', - 'reg dbg set 0 CM_SHARED_WM 0x5f00 0 0', - #redirect EPL0 to PEP0 - 'create acl-rule 0 1', - 'add acl-rule condition 0 1 src-port 1', - 'add acl-rule action 0 1 redirect 0', - 'add acl-rule action 0 1 count', - 'create acl-rule 1 1', - 'add acl-rule condition 1 1 src-port 5', - 'add acl-rule action 1 1 redirect 11', - 'add acl-rule action 1 1 count', - 'apply acl', - ] - -class CtrlCrb(Crb): - """ - Simplified Crb class for Boulder_rapid control session - """ - - def __init__(self, crb): - self.crb = crb - self.NAME = 'dut_boulderapid_control' - super(CtrlCrb, self).__init__(crb, None, self.NAME) - - def get_ip_address(self): - return self.crb['IP'] - - def get_password(self): - return self.crb['pass'] - - -class BoulderRapid(NetDevice): - """ - Class for BoulderRapid, inherit from NetDevice class - """ - - def __init__(self, host, domain_id, bus_id, devfun_id): - super(BoulderRapid, self).__init__(host, domain_id, bus_id, devfun_id) - - self.tp_path = "~" - self.sec_port = False - self.host = host - - # load port config - portconf = PortConf(PORTCONF) - portconf.load_ports_config(host.crb['IP']) - pci_addr = ':'.join((domain_id, bus_id, devfun_id)) - if not portconf.check_port_available(pci_addr): - raise PortConfigParseException("BoulderRapid must configured") - - port_cfg = portconf.get_ports_config()[pci_addr] - - # secondary port do not need reinitialize - if 'sec_port' in list(port_cfg.keys()): - print(GREEN("Skip init second port test point session")) - if 'first_port' not in list(port_cfg.keys()): - raise PortConfigParseException("BoulderRapid second port must configure first port") - # find net_device by pci_addr - first_addr = port_cfg['first_port'] - port_info = self.host.get_port_info(first_addr) - if port_info is None: - raise PortConfigParseException("BoulderRapid first port not found") - # get additional session - netdev = port_info['port'] - self.ctrl_crb = netdev.get_control() - self.sec_port = True - return - - - if 'tp_ip' not in list(port_cfg.keys()): - raise PortConfigParseException("BoulderRapid must configure test point ip") - if 'passwd' not in list(port_cfg.keys()): - raise PortConfigParseException("BoulderRapid must configure host password") - - crb = {} - crb['IP'] = port_cfg['tp_ip'] - crb['pass'] = port_cfg['passwd'] - - if 'tp_path' in list(port_cfg.keys()): - self.tp_path = port_cfg['tp_path'] - - # create additional session - self.ctrl_crb = CtrlCrb(crb) - - def setup(self): - # setup function called after bind to igb_uio - self.start_testpoint() - - def optimize_perf(self, peer0="", peer1=""): - # rule which can optimize performance - if self.sec_port is False: - # applied rules - for rule in PERF_RULES: - self.ctrl_crb.send_expect("%s" %rule, "<0>%") - # add default mac rule - self.ctrl_crb.send_expect("add mac %s 1 locked port 1" % peer1, "<0>%") - self.ctrl_crb.send_expect("add mac %s 1 locked port 5" % peer0, "<0>%") - - def stop(self): - # second port do not need any operation - if self.sec_port: - return - - # stop testpoint - self.stop_testpoint() - - def close(self): - # second port do not need any operation - if self.sec_port: - return - - # close session - if self.ctrl_crb.session: - self.ctrl_crb.session.close() - self.ctrl_crb.session = None - if self.ctrl_crb.alt_session: - self.ctrl_crb.alt_session.close() - self.ctrl_crb.alt_session = None - - def start_testpoint(self): - """ - Before any execution, must enable test point first - """ - if self.sec_port: - print(GREEN("Skip start second port testpoint")) - return - - self.ctrl_crb.send_expect("cd %s" % self.tp_path, "# ") - if self.tp_path != "~": - command = './' + TP_BINARY - else: - command = TP_BINARY - - # special commands for tp 4.1.6 - command += " --api.platform.config.switch.0.uioDevName:text:/dev/uio0" - command += " --api.platform.pktInterface:text:pti" - - self.ctrl_crb.send_expect("%s" % command, "<0>%", 120) - for rule in FUNC_RULES: - self.ctrl_crb.send_expect("%s" %rule, "<0>%") - - def stop_testpoint(self): - """ - Exit test point - """ - self.ctrl_crb.send_expect("quit", "# ") - - def get_control(self): - return self.ctrl_crb - - def add_vlan(self, vlan_id=0): - self.ctrl_crb.send_expect("create vlan %d" % vlan_id, "<0>%") - if self.sec_port: - self.ctrl_crb.send_expect("add vlan port %d 1,0" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("add vlan port %d 5,11" % vlan_id, "<0>%") - - def delete_vlan(self, vlan_id=0): - if self.sec_port: - self.ctrl_crb.send_expect("del vlan port %d 1,0" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("del vlan port %d 5,11" % vlan_id, "<0>%") - self.ctrl_crb.send_expect("del vlan %d" % vlan_id, "<0>%") - - def add_txvlan(self, vlan_id=0): - if self.sec_port: - self.ctrl_crb.send_expect("set vlan tagging %d 1 tag" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("set vlan tagging %d 5 tag" % vlan_id, "<0>%") - - def delete_txvlan(self, vlan_id=0): - if self.sec_port: - self.ctrl_crb.send_expect("set vlan tagging %d 1 untag" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("set vlan tagging %d 5 untag" % vlan_id, "<0>%") - - def enable_jumbo(self, framesize=0): - if self.sec_port: - self.ctrl_crb.send_expect("set port config 1 max_frame_size %d" % framesize, "<0>%") - else: - self.ctrl_crb.send_expect("set port config 5 max_frame_size %d" % framesize, "<0>%") - - def get_glortid_bymac(self, dmac): - out = self.ctrl_crb.send_expect("show mac table all", "<0>%") - pattern = r"([0-9a-f]{2}:){5}([0-9a-f]{2})" - s = re.compile(pattern) - res = s.search(dmac) - if res is None: - print(RED("search none mac filter")) - return None - else: - mac_filter = res.group(2) - pattern = r"(?<=%s)+([\sA-Za-z0-9/])+([0-9]{4})" %mac_filter - s = re.compile(pattern) - res = s.search(out) - if res is None: - print(RED("search none port value")) - return None - else: - port_value = res.group(2) - out = self.ctrl_crb.send_expect("show stacking logical-port all", "<0>%") - pattern = r"([0-9a-z]{6})+(\s)+(%s)+" %port_value - s = re.compile(pattern) - res = s.search(out) - if res is None: - print(RED("search none port glort id")) - return None - else: - port_glortid = res.group(1) - return port_glortid diff --git a/nics/rrc.py b/nics/rrc.py deleted file mode 100644 index d0198858..00000000 --- a/nics/rrc.py +++ /dev/null @@ -1,272 +0,0 @@ -# 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. - -import re -from crb import Crb -from config import PortConf, PORTCONF -from exception import PortConfigParseException -from utils import GREEN -from net_device import NetDevice - -DEF_PASSWD = 's' -TP_BINARY = 'TestPoint' - -FUNC_RULES = [ - # disable cut through for jumbo frame case - 'set port config 20,22 tx_cut_through off', - # disable mac learning - 'set port config 0..22 learning off', - #redirect PEP0 to EPL0 - 'create acl 0', - 'create acl-rule 0 0', - 'add acl-rule condition 0 0 src-port 20', - 'add acl-rule action 0 0 redirect 1', - 'add acl-rule action 0 0 count', - #redirect PEP1 to EPL1 - 'create acl 1', - 'create acl-rule 1 0', - 'add acl-rule condition 1 0 src-port 22', - 'add acl-rule action 1 0 redirect 5', - 'add acl-rule action 1 0 count', - 'apply acl', - ] - -PERF_RULES = [ - 'set port config 0..11 parser_cfg L4', # frame parser up to L4 - # good for performance - 'set api attribute boolean api.paritySweeper.enable false', - 'reg dbg set 0 CM_SOFTDROP_WM 0x5f005f00 0 0', - 'reg dbg set 0 CM_SHARED_WM 0x5f00 0 0', - # rule for direct rx traffic - # mac filter will be useless, so only enable for perf - 'create acl-rule 0 1', - 'add acl-rule condition 0 1 src-port 1', - 'add acl-rule action 0 1 redirect 20', - 'add acl-rule action 0 1 count', - 'create acl-rule 1 1', - 'add acl-rule condition 1 1 src-port 5', - 'add acl-rule action 1 1 redirect 22', - 'add acl-rule action 1 1 count', - 'apply acl', - ] - -class CtrlCrb(Crb): - """ - Simplified Crb class for RedRockCanyou control session - """ - - def __init__(self, crb): - self.crb = crb - self.NAME = 'dut_RRC_CONTROL' - super(CtrlCrb, self).__init__(crb, None, self.NAME) - - def get_ip_address(self): - return self.crb['IP'] - - def get_password(self): - return self.crb['pass'] - - -class RedRockCanyou(NetDevice): - """ - Class for RedRockCanyou, inherit from NetDevice class - """ - - def __init__(self, host, domain_id, bus_id, devfun_id): - super(RedRockCanyou, self).__init__(host, domain_id, bus_id, devfun_id) - - self.tp_path = "~" - self.sec_port = False - self.host = host - - # load port config - portconf = PortConf(PORTCONF) - portconf.load_ports_config(host.crb['IP']) - pci_addr = ':'.join((domain_id, bus_id, devfun_id)) - if not portconf.check_port_available(pci_addr): - raise PortConfigParseException("RRC must configured") - - port_cfg = portconf.get_ports_config()[pci_addr] - - # secondary port do not need reinitialize - if 'sec_port' in list(port_cfg.keys()): - print(GREEN("Skip init second port test point session")) - if 'first_port' not in list(port_cfg.keys()): - raise PortConfigParseException("RRC second port must configure first port") - # find net_device by pci_addr - first_addr = port_cfg['first_port'] - port_info = self.host.get_port_info(first_addr) - if port_info is None: - raise PortConfigParseException("RRC first port not found") - # get additional session - netdev = port_info['port'] - self.ctrl_crb = netdev.get_control() - self.sec_port = True - return - - if 'tp_ip' not in list(port_cfg.keys()): - raise PortConfigParseException("RRC must configure test point ip") - - crb = {} - crb['IP'] = port_cfg['tp_ip'] - if 'passwd' not in list(port_cfg.keys()): - crb['pass'] = DEF_PASSWD - else: - crb['pass'] = port_cfg['passwd'] - - if 'tp_path' in list(port_cfg.keys()): - self.tp_path = port_cfg['tp_path'] - - # create additional session - self.ctrl_crb = CtrlCrb(crb) - - def setup(self): - # setup function should be called after bind to igb_uio - self.start_testpoint() - - def optimize_perf(self, peer0="", peer1=""): - # rule which can optimize performance - if self.sec_port is False: - # applied rules - for rule in PERF_RULES: - self.ctrl_crb.send_expect("%s" %rule, "<0>%") - # add default mac rule - self.ctrl_crb.send_expect("add mac %s 1 locked port 1" % peer0, "<0>%") - self.ctrl_crb.send_expect("add mac %s 1 locked port 5" % peer1, "<0>%") - - def stop(self): - # second port do not need any operation - if self.sec_port: - return - - # stop testpoint - self.stop_testpoint() - - def close(self): - # second port do not need any operation - if self.sec_port: - return - - # close session - if self.ctrl_crb.session: - self.ctrl_crb.session.close() - self.ctrl_crb.session = None - if self.ctrl_crb.alt_session: - self.ctrl_crb.alt_session.close() - self.ctrl_crb.alt_session = None - - def start_testpoint(self): - """ - Before any execution, must enable test point first - """ - if self.sec_port: - print(GREEN("Skip start second port testpoint")) - return - self.ctrl_crb.send_expect("cd %s" % self.tp_path, "# ") - if self.tp_path != "~": - command = './' + TP_BINARY - else: - command = TP_BINARY - - self.ctrl_crb.send_expect("%s" % command, "<0>%", 120) - for rule in FUNC_RULES: - self.ctrl_crb.send_expect("%s" %rule, "<0>%") - - def stop_testpoint(self): - """ - Exit test point - """ - self.ctrl_crb.send_expect("quit", "# ") - - def get_control(self): - return self.ctrl_crb - - def add_vlan(self, vlan_id=0): - self.ctrl_crb.send_expect("create vlan %d" % vlan_id, "<0>%") - if self.sec_port: - self.ctrl_crb.send_expect("add vlan port %d 5,22" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("add vlan port %d 1,20" % vlan_id, "<0>%") - - def delete_vlan(self, vlan_id=0): - if self.sec_port: - self.ctrl_crb.send_expect("del vlan port %d 5,22" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("del vlan port %d 1,20" % vlan_id, "<0>%") - self.ctrl_crb.send_expect("del vlan %d" % vlan_id, "<0>%") - - def add_txvlan(self, vlan_id=0): - if self.sec_port: - self.ctrl_crb.send_expect("set vlan tagging %d 5 tag" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("set vlan tagging %d 1 tag" % vlan_id, "<0>%") - - def delete_txvlan(self, vlan_id=0): - if self.sec_port: - self.ctrl_crb.send_expect("set vlan tagging %d 5 untag" % vlan_id, "<0>%") - else: - self.ctrl_crb.send_expect("set vlan tagging %d 1 untag" % vlan_id, "<0>%") - - def enable_jumbo(self, framesize=0): - if self.sec_port: - self.ctrl_crb.send_expect("set port config 5 max_frame_size %d" % framesize, "<0>%") - else: - self.ctrl_crb.send_expect("set port config 1 max_frame_size %d" % framesize, "<0>%") - - def get_glortid_bymac(self, dmac): - out = self.ctrl_crb.send_expect("show mac table all", "<0>%") - pattern = r"([0-9a-f]{2}:){5}([0-9a-f]{2})" - s = re.compile(pattern) - res = s.search(dmac) - if res is None: - print("search none mac filter") - return None - else: - mac_filter = res.group(2) - pattern = r"(?<=%s)+([\sA-Za-z0-9/])+([0-9]{4})" %mac_filter - s = re.compile(pattern) - res = s.search(out) - if res is None: - print("search none port value") - return None - else: - port_value = res.group(2) - out = self.ctrl_crb.send_expect("show stacking logical-port all", "<0>%") - pattern = r"([0-9a-z]{6})+(\s)+(%s)+" %port_value - s = re.compile(pattern) - res = s.search(out) - if res is None: - print("search none port glort id") - return None - else: - port_glortid = res.group(1) - return port_glortid - diff --git a/tests/TestSuite_fm10k_perf.py b/tests/TestSuite_fm10k_perf.py deleted file mode 100644 index 5ff411dd..00000000 --- a/tests/TestSuite_fm10k_perf.py +++ /dev/null @@ -1,617 +0,0 @@ -# BSD LICENSE -# -# Copyright(c) 2010-2019 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. - -""" -DPDK Test suite. -Layer-3 forwarding test script. -""" - -import utils -import string -import re -import os -from test_case import TestCase -from exception import VerifyFailure -from settings import HEADER_SIZE -from utils import * -from pktgen import PacketGeneratorHelper - -class TestFM10kL3fwd(TestCase): - - path = "./examples/l3fwd/build/" - - test_cases_2_ports = { - "1S/1C/1T": "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.0})'", - "1S/2C/1T": "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}), (P1,0,C{1.2.0})'", - "1S/4C/1T": "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}), (P1,0,C{1.2.0}), (P0,1,C{1.3.0}), (P1,1,C{1.4.0})'", - "1S/8C/1T": "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}), (P0,1,C{1.2.0}), (P0,2,C{1.3.0}), (P0,3,C{1.4.0})," +\ - "(P1,0,C{1.5.0}),(P1,1,C{1.6.0}), (P1,2,C{1.7.0}), (P1,3,C{1.8.0})'", - "1S/16C/1T": "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}), (P0,1,C{1.2.0}), (P0,2,C{1.3.0}), (P0,3,C{1.4.0})," +\ - "(P0,4,C{1.1.1}), (P0,5,C{1.2.1}), (P0,6,C{1.3.1}), (P0,7,C{1.4.1})," +\ - "(P1,0,C{1.5.0}), (P1,1,C{1.6.0}), (P1,2,C{1.7.0}), (P1,3,C{1.8.0})," +\ - "(P1,4,C{1.5.1}), (P1,5,C{1.6.1}), (P1,6,C{1.7.1}), (P1,7,C{1.8.1})'" - } - - host_table = [ - "{{IPv4(10,100,0,1), IPv4(1,2,3,4), 1, 10, IPPROTO_UDP}, P0}", - "{{IPv4(10,101,0,1), IPv4(1,2,3,4), 1, 10, IPPROTO_UDP}, P0}", - "{{IPv4(11,100,0,1), IPv4(1,2,3,4), 1, 11, IPPROTO_UDP}, P1}", - "{{IPv4(11,101,0,1), IPv4(1,2,3,4), 1, 11, IPPROTO_UDP}, P1}", - "{{IPv4(12,100,0,1), IPv4(1,2,3,4), 1, 12, IPPROTO_UDP}, P2}", - "{{IPv4(12,101,0,1), IPv4(1,2,3,4), 1, 12, IPPROTO_UDP}, P2}", - "{{IPv4(13,100,0,1), IPv4(1,2,3,4), 1, 13, IPPROTO_UDP}, P3}", - "{{IPv4(13,101,0,1), IPv4(1,2,3,4), 1, 13, IPPROTO_UDP}, P3}", - ] - - lpm_table = [ - "{IPv4(10,100,0,0), 24, P0}", - "{IPv4(10,101,0,0), 24, P0}", - "{IPv4(11,100,0,0), 24, P1}", - "{IPv4(11,101,0,0), 24, P1}", - "{IPv4(12,100,0,0), 24, P2}", - "{IPv4(12,101,0,0), 24, P2}", - "{IPv4(13,100,0,0), 24, P3}", - "{IPv4(13,101,0,0), 24, P3}", - ] - - frame_sizes = [64, 128, 256, 512, 2048] # 65, 128 - methods = ['lpm'] - - # Insert or move non-test functions here. - def portRepl(self, match): - """ - Function to replace P([0123]) pattern in tables - """ - - portid = match.group(1) - self.verify(int(portid) in range(4), "invalid port id") - if int(portid) >= len(valports): - return '0' - else: - return '%s' % valports[int(portid)] - - def set_up_all(self): - """ - Run at the start of each test suite. - L3fwd Prerequisites - """ - # Based on h/w type, choose how many ports to use - ports = self.dut.get_ports(socket=1) - if not ports: - ports = self.dut.get_ports(socket=0) - - self.tester.extend_external_packet_generator(TestFM10kL3fwd, self) - # Verify that enough ports are available - self.verify(len(ports) >= 2, "Insufficient ports for speed testing") - - netdev = self.dut.ports_info[ports[0]]['port'] - - self.port_socket = netdev.socket - - # Verify that enough threads are available - cores = self.dut.get_core_list("2S/8C/2T") - self.verify(cores is not None, "Insufficient cores for speed testing") - - global valports - valports = [_ for _ in ports if self.tester.get_local_port(_) != -1] - - self.verify(len(valports) >= 2, "Insufficient active ports for speed testing") - - self.main_file = "examples/l3fwd/main.c" - self.pf_file = "drivers/net/fm10k/base/fm10k_pf.c" - # Update config file and rebuild to get best perf on FVL - if "redrockcanyou" in self.nic: - self.dut.send_expect("sed -i -e 's/FM10K_TQDLOC_BASE_32_DESC/FM10K_TQDLOC_BASE_128_DESC/' %s" % self.pf_file, "# ") - self.dut.send_expect("sed -i -e 's/FM10K_TQDLOC_SIZE_32_DESC/FM10K_TQDLOC_SIZE_128_DESC/' %s" % self.pf_file, "# ") - self.dut.send_expect("sed -i -e 's/FM10K_TDLEN_ITR_SCALE_GEN3;$/FM10K_TDLEN_ITR_SCALE_GEN3 * 2;/' %s" % self.pf_file, "# ") - - self.dut.build_install_dpdk(self.target) - - self.l3fwd_test_results = {'header': [], - 'data': []} - - self.rebuild_l3fwd() - - # get dts output path - if self.logger.log_path.startswith(os.sep): - self.output_path = self.logger.log_path - else: - cur_path = os.path.dirname( - os.path.dirname(os.path.realpath(__file__))) - self.output_path = os.sep.join([cur_path, self.logger.log_path]) - # create an instance to set stream field setting - self.pktgen_helper = PacketGeneratorHelper() - - def rebuild_l3fwd(self): - pat = re.compile("P([0123])") - # Prepare long prefix match table, replace P(x) port pattern - lpmStr = "static struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {\\\n" - for idx in range(len(TestFM10kL3fwd.lpm_table)): - TestFM10kL3fwd.lpm_table[idx] = pat.sub(self.portRepl, TestFM10kL3fwd.lpm_table[idx]) - lpmStr = lpmStr + ' ' * 4 + TestFM10kL3fwd.lpm_table[idx] + ",\\\n" - lpmStr = lpmStr + "};" - self.logger.debug(lpmStr) - - # Prepare host route table, replace P(x) port pattern - exactStr = "static struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {\\\n" - for idx in range(len(TestFM10kL3fwd.host_table)): - TestFM10kL3fwd.host_table[idx] = pat.sub(self.portRepl, TestFM10kL3fwd.host_table[idx]) - exactStr = exactStr + ' ' * 4 + TestFM10kL3fwd.host_table[idx] + ",\\\n" - exactStr = exactStr + "};" - self.logger.debug(exactStr) - - # Compile l3fwd with LPM lookup. - self.dut.send_expect(r"sed -i '/ipv4_l3fwd_route_array\[\].*{/,/^\}\;/c\\%s' examples/l3fwd/main.c" % lpmStr, "# ") - out = self.dut.build_dpdk_apps("./examples/l3fwd", "USER_FLAGS=-DAPP_LOOKUP_METHOD=1") - self.verify("Error" not in out, "compilation error 1") - self.verify("No such file" not in out, "compilation error 2") - - # Backup the LPM exe and clean up the build. - self.dut.send_expect("mv -f examples/l3fwd/build/l3fwd examples/l3fwd/build/l3fwd_lpm", "# ") - out = self.dut.send_expect("make clean -C examples/l3fwd", "# ") - - def flows(self): - """ - Return a list of packets that implements the flows described in the - l3fwd test plan. - - """ - return [ - 'IP(src="1.2.3.4",dst="11.100.0.1")', - 'IP(src="1.2.3.4",dst="11.101.0.1")', - 'IP(src="1.2.3.4",dst="10.100.0.1")', - 'IP(src="1.2.3.4",dst="10.101.0.1")', - 'IP(src="1.2.3.4",dst="13.100.0.1")', - 'IP(src="1.2.3.4",dst="13.101.0.1")', - 'IP(src="1.2.3.4",dst="12.100.0.1")', - 'IP(src="1.2.3.4",dst="12.101.0.1")'] - - def repl(self, match): - pid = match.group(1) - qid = match.group(2) - self.logger.debug("%s\n" % match.group(3)) - lcid = self.dut.get_lcore_id(match.group(3)) - self.logger.debug("%s\n" % lcid) - - global corelist - corelist.append(int(lcid)) - - self.verify(int(pid) in range(4), "invalid port id") - self.verify(lcid, "invalid thread id") - - return '%s,%s,%s' % (str(valports[int(pid)]), qid, lcid) - - def set_up(self): - """ - Run before each test case. - """ - pass - - def fm10k_rxmode_set(self, mode="default"): - """ - Change rxmode setting for RRC vector choice - RRC rxmode choice will depend on rxmod - """ - if mode == "scatter": - # enable ip checkcsum - self.dut.send_expect("sed -i -e 's/.hw_ip_checksum = .*$/.hw_ip_checksum = 1,/g' %s" % self.main_file, "# ") - # enable scatter mode - self.dut.send_expect("sed -i -e 's/.enable_scatter = .*$/.enable_scatter = 1,/g' %s" % self.main_file, "# ") - elif mode == "scatter_vector": - # disable ip checksum - self.dut.send_expect("sed -i -e 's/.hw_ip_checksum = .*$/.hw_ip_checksum = 0,/g' %s" % self.main_file, "# ") - # enable scatter mode - self.dut.send_expect("sed -i -e 's/.enable_scatter = .*$/.enable_scatter = 1,/g' %s" % self.main_file, "# ") - elif mode == "vector": - # disable ip checksum - self.dut.send_expect("sed -i -e 's/.hw_ip_checksum = .*$/.hw_ip_checksum = 0,/g' %s" % self.main_file, "# ") - # default l3fwd parameter, scatter will be disabled - self.dut.send_expect("sed -i -e 's/.enable_scatter = .*$/.enable_scatter = 0,/g' %s" % self.main_file, "# ") - elif mode == "default": - # disable ip checksum - self.dut.send_expect("sed -i -e 's/.hw_ip_checksum = .*$/.hw_ip_checksum = 1,/g' %s" % self.main_file, "# ") - # default l3fwd parameter, scatter will be disabled - self.dut.send_expect("sed -i -e 's/.enable_scatter = .*$/.enable_scatter = 0,' %s" % self.main_file, "# ") - - # rebuild l3fwd - self.rebuild_l3fwd() - - def test_perf_fm10k_legacy_perf(self): - # add setting for scatter - # self.dut.send_expect("sed -i -e '/.hw_ip_checksum = .*$/a\\.enable_scatter = 0,' %s" % self.main_file, "# ") - - # mode_settings = [{'rxmode': 'default', 'txmode': 'default'}, {'rxmode': 'vector', 'txmode': 'vector'}] - mode_settings = [{'rxmode': 'default', 'txmode': 'default'}] - for mode in mode_settings: - self.fm10k_rxmode_set(mode = mode['rxmode']) - if mode['txmode'] == 'default': - # need --enable-jumbo parameter - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - if "--enable-jumbo" not in TestFM10kL3fwd.test_cases_2_ports[key]: - TestFM10kL3fwd.test_cases_2_ports[key] += " --enable-jumbo" - else: - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - TestFM10kL3fwd.test_cases_2_ports[key].replace(" --enable-jumbo", "") - - print((GREEN("Performance test for rxmode %s txmode %s" % (mode['rxmode'], mode['txmode'])))) - self.perf_l3fwd_2ports() - - # remove setting for scatter - self.dut.send_expect("sed -i -e '/.enable_scatter= .*$/d' %s" % self.main_file, "# ") - - def test_perf_fm10k_vec_perf(self): - # add setting for scatter - # self.dut.send_expect("sed -i -e '/.hw_ip_checksum = .*$/a\\.enable_scatter = 0,' %s" % self.main_file, "# ") - - # mode_settings = [{'rxmode': 'default', 'txmode': 'default'}, {'rxmode': 'vector', 'txmode': 'vector'}] - mode_settings = [{'rxmode': 'vector', 'txmode': 'vector'}] - for mode in mode_settings: - self.fm10k_rxmode_set(mode = mode['rxmode']) - if mode['txmode'] == 'default': - # need --enable-jumbo parameter - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - if "--enable-jumbo" not in TestFM10kL3fwd.test_cases_2_ports[key]: - TestFM10kL3fwd.test_cases_2_ports[key] += " --enable-jumbo" - else: - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - TestFM10kL3fwd.test_cases_2_ports[key].replace(" --enable-jumbo", "") - - print((GREEN("Performance test for rxmode %s txmode %s" % (mode['rxmode'], mode['txmode'])))) - self.perf_l3fwd_2ports() - - # remove setting for scatter - self.dut.send_expect("sed -i -e '/.enable_scatter= .*$/d' %s" % self.main_file, "# ") - - def perf_l3fwd_2ports(self): - """ - L3fwd main 2 ports. - """ - - header_row = ["Frame", "mode", "S/C/T", "Mpps", "% linerate", "latency_max(us)", "latency_min(us)", "latency_avg(us)"] - self.l3fwd_test_results['header'] = header_row - self.result_table_create(header_row) - self.l3fwd_test_results['data'] = [] - - mac = ["02:00:00:00:00:00", "02:00:00:00:00:01"] - for frame_size in TestFM10kL3fwd.frame_sizes: - - # Prepare traffic flow - payload_size = frame_size - \ - HEADER_SIZE['ip'] - HEADER_SIZE['eth'] - flows = [] - pcaps = {} - for _port in range(2): - dmac = self.dut.get_mac_address(valports[_port]) - cnt = 0 - for layer in self.flows()[_port * 2: (_port + 1) * 2]: - flow = 'Ether(dst="%s", src="%s")/%s/("X"*%d)' % ( - dmac, mac[_port], flow, payload_size) - flows.append(flow) - pcap = os.sep.join([ - self.output_path, - "dst{0}_{1}.pcap".format(valports[_port], cnt)]) - self.tester.scapy_append('wrpcap("%s", [%s])' % (pcap, flow)) - self.tester.scapy_execute() - if valports[_port] not in pcaps: - pcaps[valports[_port]] = [] - pcaps[valports[_port]].append(pcap) - cnt += 1 - - self.rst_report("Flows for 2 ports, %d frame size.\n" % (frame_size), - annex=True) - self.rst_report("%s" % string.join(flows, '\n'), - frame=True, annex=True) - - # Prepare the command line - global corelist - pat = re.compile("P([0123]),([01234567]),(C\{\d.\d.\d\})") - - pat2 = re.compile("C\{\d") - repl1 = "C{" + str(self.port_socket) - - coreMask = {} - rtCmdLines = dict(TestFM10kL3fwd.test_cases_2_ports) - for key in list(rtCmdLines.keys()): - corelist = [] - while pat.search(rtCmdLines[key]): - # Change the socket to the NIC's socket - if key.find('1S') >= 0: - rtCmdLines[key] = pat2.sub(repl1, rtCmdLines[key]) - rtCmdLines[key] = pat.sub(self.repl, rtCmdLines[key]) - - self.logger.info("%s\n" % str(corelist)) - coreMask[key] = utils.create_mask(set(corelist)) - - # measure by two different mode - # methods = TestFM10kL3fwd.methods - - for mode in TestFM10kL3fwd.methods: - - # start l3fwd - index = 0 - subtitle = [] - for cores in list(rtCmdLines.keys()): - - info = "Executing l3fwd using %s mode, 2 ports, %s and %d frame size.\n" % ( - mode, cores, frame_size) - - self.logger.info(info) - self.rst_report(info, annex=True) - - subtitle.append(cores) - cmdline = rtCmdLines[cores] % (TestFM10kL3fwd.path + "l3fwd_" + mode, coreMask[cores], - self.dut.get_memory_channels(), utils.create_mask(valports[:2])) - - if frame_size > 1518: - cmdline = cmdline + " --max-pkt-len %d" % frame_size - self.rst_report(cmdline + "\n", frame=True, annex=True) - - out = self.dut.send_expect(cmdline, "L3FWD:", 120) - - # Measure test - tgenInput = [] - for rxPort in range(2): - # No use on rx/tx limitation - if rxPort % 2 == 0: - txIntf = self.tester.get_local_port(valports[rxPort + 1]) - else: - txIntf = self.tester.get_local_port(valports[rxPort - 1]) - - rxIntf = self.tester.get_local_port(valports[rxPort]) - port_id = valports[rxPort+1] if rxPort % 2 == 0 else \ - valports[rxPort-1] - for pcap in pcaps[port_id]: - tgenInput.append((txIntf, rxIntf, pcap)) - - vm_config = self.set_fields() - # clear streams before add new streams - self.tester.pktgen.clear_streams() - # run packet generator - streams = self.pktgen_helper.prepare_stream_from_tginput(tgenInput, 100, - vm_config, self.tester.pktgen) - _, pps = self.tester.pktgen.measure_throughput(stream_ids=streams) - - self.verify(pps > 0, "No traffic detected") - pps /= 1000000.0 - linerate = self.wirespeed(self.nic, frame_size, 2) - pct = pps * 100 / linerate - - # clear streams before add new streams - self.tester.pktgen.clear_streams() - # run packet generator - streams = self.pktgen_helper.prepare_stream_from_tginput(tgenInput, 100, - vm_config, self.tester.pktgen) - latencys = self.tester.pktgen.measure_latency(stream_ids=streams) - - index += 1 - - # Stop l3fwd - self.dut.send_expect("^C", "#") - print(latencys) - - for latency in latencys: - if latency['max'] > 0: - data_row = [frame_size, mode, cores, str(pps), str(pct), str(latency['max']/1000), str(latency['min']/1000), str(latency['average']/1000)] - utils.result_table_add(data_row) - self.l3fwd_test_results['data'].append(data_row) - - self.result_table_print() - - def perf_rfc2544(self): - - header_row = ["Frame", "mode", "S/C/T", "tx_pkts(1min)", "LR_rx_pkts(1min)", "LR_loss_pkts(1min)", "% zero_loss_rate(0.01%loss)"] - self.l3fwd_test_results['header'] = header_row - self.result_table_create(header_row) - self.l3fwd_test_results['data'] = [] - - for frame_size in TestFM10kL3fwd.frame_sizes: - - # Prepare traffic flow - payload_size = frame_size - \ - HEADER_SIZE['ip'] - HEADER_SIZE['eth'] - pcaps = {} - flows = [] - for _port in range(2): - index = valports[_port] - dmac = self.dut.get_mac_address(index) - cnt = 0 - for layer in self.flows()[_port * 2: (_port + 1) * 2]: - flow = 'Ether(dst="%s")/%s/("X"*%d)' % ( - dmac, layer, payload_size) - flows.append(flow) - pcap = os.sep.join([ - self.output_path, - "dst{0}_{1}.pcap".format(index, cnt)]) - self.tester.scapy_append('wrpcap("%s", [%s])' % ( - pcap, flow)) - self.tester.scapy_execute() - if index not in pcaps: - pcaps[index] = [] - pcaps[index].append(pcap) - cnt += 1 - - self.rst_report("Flows for 2 ports, %d frame size.\n" % (frame_size), - annex=True) - self.rst_report("%s" % string.join(flows, '\n'), - frame=True, annex=True) - - # Prepare the command line - global corelist - pat = re.compile("P([0123]),([0123]),(C\{\d.\d.\d\})") - - pat2 = re.compile("C\{\d") - repl1 = "C{" + str(self.port_socket) - - coreMask = {} - rtCmdLines = dict(TestFM10kL3fwd.test_cases_2_ports) - for key in list(rtCmdLines.keys()): - corelist = [] - while pat.search(rtCmdLines[key]): - # Change the socket to the NIC's socket - if key.find('1S') >= 0: - rtCmdLines[key] = pat2.sub(repl1, rtCmdLines[key]) - rtCmdLines[key] = pat.sub(self.repl, rtCmdLines[key]) - - self.logger.info("%s\n" % str(corelist)) - coreMask[key] = utils.create_mask(set(corelist)) - - # measure by two different mode - for mode in TestFM10kL3fwd.methods: - - # start l3fwd - index = 0 - subtitle = [] - for cores in list(rtCmdLines.keys()): - - # in order to save time, only some of the cases will be run. - if mode == "lpm" and (cores == "1S/1C/1T" or cores == "1S/4C/1T"): - info = "Executing l3fwd using %s mode, 2 ports, %s and %d frame size.\n" % ( - mode, cores, frame_size) - - self.logger.info(info) - self.rst_report(info, annex=True) - - subtitle.append(cores) - cmdline = rtCmdLines[cores] % (TestFM10kL3fwd.path + "l3fwd_" + mode, coreMask[cores], - self.dut.get_memory_channels(), utils.create_mask(valports[:2])) - - if frame_size > 1518: - cmdline = cmdline + " --max-pkt-len %d" % frame_size - self.rst_report(cmdline + "\n", frame=True, annex=True) - - out = self.dut.send_expect(cmdline, "L3FWD:", 120) - - # Measure test - tgenInput = [] - for rxPort in range(2): - # No use on rx/tx limitation - if rxPort % 2 == 0: - txIntf = self.tester.get_local_port(valports[rxPort + 1]) - else: - txIntf = self.tester.get_local_port(valports[rxPort - 1]) - - rxIntf = self.tester.get_local_port(valports[rxPort]) - - port_id = valports[rxPort+1] if rxPort % 2 == 0 else \ - valports[rxPort-1] - for pcap in pcaps[port_id]: - tgenInput.append((txIntf, rxIntf, pcap)) - - vm_config = self.set_fields() - # clear streams before add new streams - self.tester.pktgen.clear_streams() - # run packet generator - streams = self.pktgen_helper.prepare_stream_from_tginput(tgenInput, - 100, vm_config, self.tester.pktgen) - # set traffic option - traffic_opt = {'pdr': 0.01, 'duration': 5} - zero_loss_rate, tx_pkts, rx_pkts = self.tester.pktgen.measure_rfc2544(stream_ids=streams, options=traffic_opt) - - loss_pkts = tx_pkts - rx_pkts - self.dut.send_expect("^C", "#") - - tx_pkts = human_read_number(tx_pkts) - rx_pkts = human_read_number(rx_pkts) - loss_pkts = human_read_number(loss_pkts) - - data_row = [frame_size, mode, cores, str(tx_pkts), str(rx_pkts), loss_pkts, zero_loss_rate] - self.result_table_add(data_row) - self.l3fwd_test_results['data'].append(data_row) - else: - pass - - index += 1 - - self.result_table_print() - - def test_perf_rfc2544_vec(self): - # add setting for scatter - - # mode_settings = [{'rxmode': 'default', 'txmode': 'default'}, {'rxmode': 'vector', 'txmode': 'vector'}] - mode_settings = [{'rxmode': 'vector', 'txmode': 'vector'}] - for mode in mode_settings: - self.fm10k_rxmode_set(mode = mode['rxmode']) - if mode['txmode'] == 'default': - # need --enable-jumbo parameter - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - if "--enable-jumbo" not in TestFM10kL3fwd.test_cases_2_ports[key]: - TestFM10kL3fwd.test_cases_2_ports[key] += " --enable-jumbo" - else: - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - TestFM10kL3fwd.test_cases_2_ports[key].replace(" --enable-jumbo", "") - - print((GREEN("Performance test for rxmode %s txmode %s" % (mode['rxmode'], mode['txmode'])))) - self.perf_rfc2544() - - # remove setting for scatter - self.dut.send_expect("sed -i -e '/.enable_scatter= .*$/d' %s" % self.main_file, "# ") - - def test_perf_rfc2544_legacy(self): - # add setting for scatter - - # mode_settings = [{'rxmode': 'default', 'txmode': 'default'}, {'rxmode': 'vector', 'txmode': 'vector'}] - mode_settings = [{'rxmode': 'default', 'txmode': 'default'}] - for mode in mode_settings: - self.fm10k_rxmode_set(mode = mode['rxmode']) - if mode['txmode'] == 'default': - # need --enable-jumbo parameter - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - if "--enable-jumbo" not in TestFM10kL3fwd.test_cases_2_ports[key]: - TestFM10kL3fwd.test_cases_2_ports[key] += " --enable-jumbo" - else: - for key in list(TestFM10kL3fwd.test_cases_2_ports.keys()): - TestFM10kL3fwd.test_cases_2_ports[key].replace(" --enable-jumbo", "") - - print((GREEN("Performance test for rxmode %s txmode %s" % (mode['rxmode'], mode['txmode'])))) - self.perf_rfc2544() - - # remove setting for scatter - self.dut.send_expect("sed -i -e '/.enable_scatter= .*$/d' %s" % self.main_file, "# ") - - def set_fields(self): - ''' set ip protocol field behavior ''' - fields_config = { - 'ip': {'src': {'action': 'random'}}, } - return fields_config - - def tear_down(self): - """ - Run after each test case. - """ - pass - - def tear_down_all(self): - """ - Run after each test suite. - """ - # remove setting for scatter - self.dut.send_expect("sed -i -e '/.enable_scatter= .*$/d' %s" % self.main_file, "# ") - pass