From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 14CAE567E for ; Wed, 9 Sep 2015 09:20:12 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP; 09 Sep 2015 00:20:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,495,1437462000"; d="scan'208";a="800655070" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by orsmga002.jf.intel.com with ESMTP; 09 Sep 2015 00:20:11 -0700 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id t897K9oG013405; Wed, 9 Sep 2015 15:20:09 +0800 Received: from shecgisg003.sh.intel.com (localhost [127.0.0.1]) by shecgisg003.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id t897K7kf015681; Wed, 9 Sep 2015 15:20:09 +0800 Received: (from qxu10@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id t897K6C2015677; Wed, 9 Sep 2015 15:20:06 +0800 From: Qian Xu To: dts@dpdk.org Date: Wed, 9 Sep 2015 15:20:04 +0800 Message-Id: <1441783204-15643-1-git-send-email-qian.q.xu@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dts] [PATCH] Update the suite to remove promisc and UDP for lpm case, add socket sensitive. X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Sep 2015 07:20:13 -0000 The major updates are as below: 1. Remove promisc mode in the sample command and ensure the traffic is sent to the correct MAC address. 2. Update 2 ports and 4 ports case list, which can cover 10G, 40G Nics. 3. Make the lcore's socket in the commands automatically change with the NIC's socket. 4. Remove UDP in traffic settings. 5. Update config file to have best perf on FVL. Signed-off-by: Qian Xu diff --git a/tests/TestSuite_l3fwd.py b/tests/TestSuite_l3fwd.py index 65fa6f7..0e09256 100644 --- a/tests/TestSuite_l3fwd.py +++ b/tests/TestSuite_l3fwd.py @@ -41,55 +41,29 @@ from plotting import Plotting from test_case import TestCase from exception import VerifyFailure from settings import HEADER_SIZE +from etgen import IxiaPacketGenerator - -class TestL3fwd(TestCase): +class TestL3fwd(TestCase,IxiaPacketGenerator): path = "./examples/l3fwd/build/" - test_cases_2_ports = {"1S/1C/1T": "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.0})'", - "1S/1C/2T": "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.1})'", - "1S/2C/1T": "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}), (P1,0,C{1.2.0})'" + 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/1C/2T": "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.1})'", + "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})'", + "2S/2C/1T": "%s -c %s -n %d -- -p %s --config '(P0,0,C{0.1.0}), (P1,0,C{0.2.0}),(P0,1,C{1.3.0}), (P1,1,C{1.4.0})'", } test_cases_4_ports = [(1, "1S/1C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.1.0}),(P3,0,C{1.1.0})'"), - (1, "1S/1C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.1.1}),(P3,0,C{1.1.1})'"), - (1, "1S/2C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.2.0}),(P3,0,C{1.2.0})'"), + "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.1.0}),(P3,0,C{1.1.0})'"), (1, "1S/2C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.1}),(P2,0,C{1.2.0}),(P3,0,C{1.2.1})'"), + "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.1}),(P2,0,C{1.2.0}),(P3,0,C{1.2.1})'"), (1, "1S/4C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.2.0}),(P2,0,C{1.3.0}),(P3,0,C{1.4.0})'"), - (1, "2S/1C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P1,0,C{0.1.0}),(P2,0,C{1.1.0}),(P3,0,C{1.1.0})'"), - (1, "2S/1C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P1,0,C{0.1.1}),(P2,0,C{1.1.0}),(P3,0,C{1.1.1})'"), - (1, "2S/2C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P1,0,C{0.2.0}),(P2,0,C{1.1.0}),(P3,0,C{1.2.0})'"), - (2, "1S/1C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.0}),(P1,1,C{1.1.0}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.1.0}),(P3,1,C{1.1.0})'"), - (2, "1S/1C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.0}),(P1,1,C{1.1.0}),(P2,0,C{1.1.1}),(P2,1,C{1.1.1}),(P3,0,C{1.1.1}),(P3,1,C{1.1.1})'"), - (2, "1S/2C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.0}),(P1,1,C{1.1.0}),(P2,0,C{1.2.0}),(P2,1,C{1.2.0}),(P3,0,C{1.2.0}),(P3,1,C{1.2.0})'"), - (2, "1S/2C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.1}),(P1,1,C{1.1.1}),(P2,0,C{1.2.0}),(P2,1,C{1.2.0}),(P3,0,C{1.2.1}),(P3,1,C{1.2.1})'"), - (2, "1S/4C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.2.0}),(P1,1,C{1.2.0}),(P2,0,C{1.3.0}),(P2,1,C{1.3.0}),(P3,0,C{1.4.0}),(P3,1,C{1.4.0})'"), - (2, "1S/4C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.1}),(P1,0,C{1.2.0}),(P1,1,C{1.2.1}),(P2,0,C{1.3.0}),(P2,1,C{1.3.1}),(P3,0,C{1.4.0}),(P3,1,C{1.4.1})'"), - (2, "2S/1C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.0}),(P1,0,C{0.1.0}),(P1,1,C{0.1.0}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.1.0}),(P3,1,C{1.1.0})'"), - (2, "2S/1C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.0}),(P1,0,C{0.1.1}),(P1,1,C{0.1.1}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.1.1}),(P3,1,C{1.1.1})'"), + "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}),(P1,0,C{1.2.0}),(P2,0,C{1.3.0}),(P3,0,C{1.4.0})'"), + (2, "1S/8C/1T", + "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}),(P0,1,C{1.2.0}),(P1,0,C{1.3.0}),(P1,1,C{1.4.0}),(P2,0,C{1.5.0}),(P2,1,C{1.6.0}),(P3,0,C{1.7.0}),(P3,1,C{1.8.0})'"), (2, "2S/2C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.0}),(P1,0,C{0.2.0}),(P1,1,C{0.2.0}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.2.0}),(P3,1,C{1.2.0})'"), - (2, "2S/2C/2T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.1}),(P1,0,C{0.2.0}),(P1,1,C{0.2.1}),(P2,0,C{1.1.0}),(P2,1,C{1.1.1}),(P3,0,C{1.2.0}),(P3,1,C{1.2.1})'"), - (2, "2S/4C/1T", - "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.2.0}),(P1,0,C{0.3.0}),(P1,1,C{0.4.0}),(P2,0,C{1.1.0}),(P2,1,C{1.2.0}),(P3,0,C{1.3.0}),(P3,1,C{1.4.0})'") + "%s -c %s -n %d -- -p %s --config '(P0,0,C{1.1.0}),(P1,0,C{1.2.0}),(P2,0,C{0.3.0}),(P3,0,C{0.4.0})'"), ] queues_4_ports = [] @@ -120,8 +94,7 @@ class TestL3fwd(TestCase): "{IPv4(13,101,0,0), 24, P3}", ] - frame_sizes = [64] # 65, 128 - + frame_sizes = [64,128] # 65, 128 methods = ['lpm', 'exact'] # @@ -313,18 +286,30 @@ class TestL3fwd(TestCase): if not ports: ports = self.dut.get_ports(socket=0) + self.tester.extend_external_packet_generator(TestL3fwd, 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/4C/2T") + 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") pat = re.compile("P([0123])") + # Update config file and rebuild to get best perf on FVL + self.dut.send_expect("sed -i -e 's/CONFIG_RTE_PCI_CONFIG=n/CONFIG_RTE_PCI_CONFIG=y/' ./config/common_linuxapp", "#", 20) + self.dut.send_expect("sed -i -e 's/CONFIG_RTE_PCI_EXTENDED_TAG=.*$/CONFIG_RTE_PCI_EXTENDED_TAG=\"on\"/' ./config/common_linuxapp", "#", 20) + self.dut.build_install_dpdk(self.target) + # Prepare long prefix match table, replace P(x) port pattern lpmStr = "static struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {\\\n" @@ -372,16 +357,16 @@ class TestL3fwd(TestCase): Return a list of packets that implements the flows described in the l3fwd test plan. - """ + """ return [ - 'IP(src="1.2.3.4",dst="10.100.0.1")/UDP(sport=10,dport=1)', - 'IP(src="1.2.3.4",dst="10.101.0.1")/UDP(sport=10,dport=1)', - 'IP(src="1.2.3.4",dst="11.100.0.1")/UDP(sport=11,dport=1)', - 'IP(src="1.2.3.4",dst="11.101.0.1")/UDP(sport=11,dport=1)', - 'IP(src="1.2.3.4",dst="12.100.0.1")/UDP(sport=12,dport=1)', - 'IP(src="1.2.3.4",dst="12.101.0.1")/UDP(sport=12,dport=1)', - 'IP(src="1.2.3.4",dst="13.100.0.1")/UDP(sport=13,dport=1)', - 'IP(src="1.2.3.4",dst="13.101.0.1")/UDP(sport=13,dport=1)'] + '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) @@ -404,6 +389,9 @@ class TestL3fwd(TestCase): """ output_pattern = re.compile("P([0123]),([0123]),(C\{\d.\d.\d\})") + pat2 = re.compile("C\{\d") + repl1 = "C{" + str(self.port_socket) + bps = dict() pps = dict() @@ -411,9 +399,14 @@ class TestL3fwd(TestCase): global corelist corelist = [] - + + while output_pattern.search(command_line): + # If one socket case, we update the socket to ensure the core used by l3fwd is on the same socket of the NIC. + if cores_config.find('1S')>=0: + command_line = pat2.sub(repl1,command_line) command_line = output_pattern.sub(self.repl, command_line) + self.logger.debug("%s\n" % str(corelist)) core_mask = dts.create_mask(set(corelist)) @@ -439,7 +432,11 @@ class TestL3fwd(TestCase): tx_interface = self.tester.get_local_port(valports[rxPort - 1]) rx_interface = self.tester.get_local_port(valports[rxPort]) - tgen_input.append((tx_interface, rx_interface, "dst%d.pcap" % valports[rxPort])) + # Make sure the traffic send to the correct MAC address + if rxPort % 2 == 0: + tgen_input.append((tx_interface, rx_interface, "dst%d.pcap" % valports[rxPort+1])) + else: + tgen_input.append((tx_interface, rx_interface, "dst%d.pcap" % valports[rxPort-1])) # FIX ME bps[method], pps[method] = self.tester.traffic_generator_throughput(tgen_input) @@ -490,7 +487,7 @@ class TestL3fwd(TestCase): for frame_size in TestL3fwd.frame_sizes: # Prepare traffic flow - payload_size = frame_size - HEADER_SIZE['udp'] - \ + payload_size = frame_size - \ HEADER_SIZE['ip'] - HEADER_SIZE['eth'] for _port in range(4): @@ -532,28 +529,37 @@ class TestL3fwd(TestCase): for frame_size in TestL3fwd.frame_sizes: # Prepare traffic flow - payload_size = frame_size - HEADER_SIZE['udp'] - \ + payload_size = frame_size - \ HEADER_SIZE['ip'] - HEADER_SIZE['eth'] - - flows = ['Ether()/%s/("X"*%d)' % (flow, payload_size) for flow in self.flows()[:4]] + for _port in range(2): + dmac = self.dut.get_mac_address(valports[_port]) + flows = ['Ether(dst=%s)/%s/("X"*%d)' % (dmac, flow, payload_size) for flow in self.flows()[_port *2:(_port +1)*2]] + self.tester.scapy_append('wrpcap("dst%d.pcap", [%s])' %(valports[_port],string.join(flows,','))) + self.tester.scapy_execute() dts.report("Flows for 2 ports, %d frame size.\n" % (frame_size), annex=True) dts.report("%s" % string.join(flows, '\n'), frame=True, annex=True) - self.tester.scapy_append('wrpcap("test2ports.pcap", [%s])' % string.join(flows, ',')) - self.tester.scapy_execute() # 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(TestL3fwd.test_cases_2_ports) for key in 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] = dts.create_mask(set(corelist)) @@ -589,8 +595,10 @@ class TestL3fwd(TestCase): txIntf = self.tester.get_local_port(valports[rxPort - 1]) rxIntf = self.tester.get_local_port(valports[rxPort]) - - tgenInput.append((txIntf, rxIntf, "test2ports.pcap")) + if rxPort % 2 == 0: + tgenInput.append((txIntf, rxIntf, "dst%d.pcap" %valports[rxPort+1])) + else: + tgenInput.append((txIntf, rxIntf, "dst%d.pcap" %valports[rxPort-1])) _, pps = self.tester.traffic_generator_throughput(tgenInput) self.verify(pps > 0, "No traffic detected") -- 2.1.0