From: "Xu, HuilongX" <huilongx.xu@intel.com>
To: "Xu, Qian Q" <qian.q.xu@intel.com>, "dts@dpdk.org" <dts@dpdk.org>
Subject: Re: [dts] [PATCH 1/2] Add updated vmdq test suite.
Date: Tue, 15 Sep 2015 10:33:18 +0000 [thread overview]
Message-ID: <DF2A19295B96364286FEB7F3DDA27A463171EF17@SHSMSX101.ccr.corp.intel.com> (raw)
In-Reply-To: <82F45D86ADE5454A95A89742C8D1410E01DDBB1D@shsmsx102.ccr.corp.intel.com>
Hi qian,
Would need add vmdq function test case, or only run performance test?
If only run performance test, I think not need add in execution files.
I suggest you can add a new execution file for performance test.
Thanks a lot
> -----Original Message-----
> From: Xu, Qian Q
> Sent: Tuesday, September 15, 2015 5:09 PM
> To: Xu, HuilongX; dts@dpdk.org
> Subject: RE: [dts] [PATCH 1/2] Add updated vmdq test suite.
>
> Huilong
> It's a performance test, do you want to test?
>
> Thanks
> Qian
>
>
> -----Original Message-----
> From: Xu, HuilongX
> Sent: Tuesday, September 15, 2015 4:45 PM
> To: Xu, Qian Q; dts@dpdk.org
> Subject: RE: [dts] [PATCH 1/2] Add updated vmdq test suite.
>
> Hi qian,
> Could you add this test in execution.conf and execution_FVL.conf for
> Niantic and FVL NIC test?
> Thanks a lot
>
> > -----Original Message-----
> > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Qian Xu
> > Sent: Tuesday, September 15, 2015 2:35 PM
> > To: dts@dpdk.org
> > Subject: [dts] [PATCH 1/2] Add updated vmdq test suite.
> >
> > Updated vmdq test suite, and it works for both FVL and Niantic. The
> > major changes are as below:
> > 1. Support FVL 4x10g, 2x10g, 2x40g.
> > 2. Update the traffic to make the MAC address and VLAN id changes
> together.
> > Then the packet loss is 0 at low traffic.
> > 3. Set the max pools number for major NICs: FVL 40G, 10G, Niantic, 1G.
> > 4. Update the core config.
> >
> > Signed-off-by: Qian Xu <qian.q.xu@intel.com>
> >
> > diff --git a/tests/TestSuite_vmdq.py b/tests/TestSuite_vmdq.py new
> > file mode 100644 index 0000000..5949bce
> > --- /dev/null
> > +++ b/tests/TestSuite_vmdq.py
> > @@ -0,0 +1,262 @@
> > +# <COPYRIGHT_TAG>
> > +
> > +"""
> > +DPDK Test suite.
> > +
> > +Tests for vmdq.
> > +
> > +"""
> > +
> > +import dts
> > +import re
> > +from etgen import IxiaPacketGenerator from test_case import TestCase
> > +from time import sleep
> > +
> > +
> > +class TestVmdq(TestCase, IxiaPacketGenerator):
> > + dut_ports = []
> > + ip_dot1q_header_size = 22
> > + default_framesize = 64
> > + default_payload = default_framesize - ip_dot1q_header_size
> > + current_frame_size = 0
> > + destmac_port0 = "52:54:00:12:00:00"
> > + destmac_port1 = "52:54:00:12:01:00"
> > + da_repeat = 1
> > + vlan_repeat = 1
> > + queues = 8
> > +
> > + def set_up_all(self):
> > + """
> > + Run at the start of each test suite.
> > + """
> > +
> > + self.tester.extend_external_packet_generator(TestVmdq, self)
> > +
> > + self.dut.send_expect("sed -i
> > 's/CONFIG_RTE_MAX_QUEUES_PER_PORT=256/CONFIG_RTE_MAX_QUEUES_PER_PORT=1
> > 024/
> > ' ./config/common_linuxapp", "# ", 5)
> > +
> > + self.dut.build_install_dpdk(self.target)
> > + # Update the max queue per port for Fortville.
> > + self.dut.send_expect("sed -i 's/define MAX_QUEUES 128/define
> > MAX_QUEUES 1024/' ./examples/vmdq/main.c", "#", 5)
> > +
> > + self.dut_ports = self.dut.get_ports(self.nic)
> > + print self.dut_ports
> > + self.verify(len(self.dut_ports) >= 2, "Insufficient ports")
> > +
> > + self.core_configs = []
> > + self.core_configs.append({'cores': '1S/1C/1T', 'mpps': {}})
> > + self.core_configs.append({'cores': '1S/2C/1T', 'mpps': {}})
> > + self.core_configs.append({'cores': '1S/2C/2T', 'mpps': {}})
> > + self.core_configs.append({'cores': '1S/4C/1T', 'mpps': {}})
> > +
> > + self.ports_socket = self.dut.get_numa_id(self.dut_ports[0])
> > + out = self.dut.send_expect("make -C examples/vmdq", "#", 10)
> > + self.verify("Error" not in out, "Compilation error")
> > +
> > +
> > + def validateApproxEqual(self, lines):
> > + """
> > + Check that all the rx queue stats are within a 30% range.
> > + """
> > +
> > + minimum = 1000000
> > + maximun = 0
> > +
> > + # Need to use Python re package because dts.regexp only
> > + handles 1
> > group,
> > + # we need 4.
> > + scanner = re.compile(
> > + "^Pool [0-9]+: ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)$")
> > + for l in lines:
> > + m = scanner.search(l)
> > + if m is None:
> > + # Line at the end, "Finished handling signal", ignore
> > + pass
> > + else:
> > + for stat in m.groups():
> > + if stat < minimum:
> > + minimum = stat
> > + if stat > maximun:
> > + maximun = stat
> > + self.verify(maximun - minimum <= minimum *
> > + 0.3, "Too wide variation in queue stats")
> > +
> > + def Npools_128queues(self, npools):
> > + """
> > + MAX queues is 128
> > + queues/pools = 128/npools
> > + """
> > +
> > + TestVmdq.current_frame_size = TestVmdq.default_framesize
> > +
> > + self.dut_ports = self.dut.get_ports(self.nic)
> > +
> > + core_list = self.dut.get_core_list("1S/4C/1T",
> > socket=self.ports_socket)
> > + core_mask = dts.create_mask(core_list)
> > +
> > + port_mask = dts.create_mask([self.dut_ports[0],
> > self.dut_ports[1]])
> > + # Run the application
> > + out = self.dut.send_expect("./examples/vmdq/build/vmdq_app -n
> > + 4 -
> > c %s -- -p %s --nb-pools %s&" %
> > + (core_mask, port_mask,
> > + str(npools)),
> > "reading queues", 120)
> > +
> > + # Transmit traffic
> > + tx_port = self.tester.get_local_port(self.dut_ports[0])
> > + rx_port = self.tester.get_local_port(self.dut_ports[1])
> > + tx_mac = self.tester.get_mac(tx_port)
> > +
> > + self.vlan_repeat = npools
> > + self.da_repeat = npools
> > + tgen_input = []
> > + for p in range(8):
> > + self.tester.scapy_append('dmac="%s"' % self.destmac_port0)
> > + self.tester.scapy_append('smac="%s"' % tx_mac)
> > + self.tester.scapy_append(
> > + 'flows = [Ether(src=smac,
> > dst=dmac)/Dot1Q(vlan=0,prio=%d)]'%p)
> > + self.tester.scapy_append('wrpcap("test%d.pcap", flows)' %p)
> > + self.tester.scapy_execute()
> > + tgen_input.append((tx_port, rx_port, "test%d.pcap" %p))
> > +
> > + loss = self.tester.traffic_generator_loss(tgen_input, 10)
> > + print "loss is %s !" % loss
> > +
> > + # Verify the accurate
> > + self.verify(loss < 0.001, "Excessive packet loss")
> > + self.validateApproxEqual(out.split("\r\n"))
> > +
> > + def set_up(self):
> > + """
> > + Run before each test case.
> > + """
> > + self.dut.kill_all()
> > +
> > + def test_perf_vmdq_64pools_queues(self):
> > + """
> > + This function call " Npools_128queues" with differen number
> > + of pools. Details see below. if not sure, set it as 8 pools.
> > + """
> > + if self.nic in ("niantic", "springfountain"):
> > + self.Npools_128queues(64)
> > + elif self.nic in ("fortville_spirit",
> "fortville_spirit_single"):
> > + self.Npools_128queues(63)
> > + elif self.nic in ("fortville_eagle"):
> > + self.Npools_128queues(34)
> > + else:
> > + self.Npools_128queues(8)
> > +
> > + def test_perf_vmdq_performance(self):
> > + """
> > + Try different configuration and different packe size
> > + """
> > +
> > + self.tester.get_interface(
> > + self.tester.get_local_port(self.dut_ports[0]))
> > +
> > + frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
> > + for config in self.core_configs:
> > +
> > + print dts.BLUE(config["cores"])
> > + self.dut.kill_all()
> > +
> > + core_config = config['cores']
> > + core_list =
> > self.dut.get_core_list(core_config,socket=self.ports_socket)
> > + core_mask = dts.create_mask(core_list)
> > + portmask = dts.create_mask(self.dut.get_ports())
> > + if self.nic in ("niantic", "springfountain"):
> > + self.queues = 64
> > + self.dut.send_expect(
> > + "examples/vmdq/build/vmdq_app -n %d -c %s -- -p
> > + %s --
> > nb-pools 64&" %
> > + (self.dut.get_memory_channels(), core_mask,
> > + portmask),
> > "reading queues", 30)
> > + elif self.nic in ("fortville_spirit",
> > "fortville_spirit_single"):
> > + self.queues = 63
> > + self.dut.send_expect(
> > + "examples/vmdq/build/vmdq_app -n %d -c %s -- -p
> > + %s --
> > nb-pools 63&" %
> > + (self.dut.get_memory_channels(), core_mask,
> > + portmask),
> > "reading queues", 30)
> > + elif self.nic in ("fortville_eagle"):
> > + self.queues = 34
> > + self.dut.send_expect(
> > + "examples/vmdq/build/vmdq_app -n %d -c %s -- -p
> > + %s --
> > nb-pools 34&" %
> > + (self.dut.get_memory_channels(), core_mask,
> > + portmask),
> > "reading queues", 30)
> > + else:
> > + self.queues = 8
> > + self.dut.send_expect(
> > + "examples/vmdq/build/vmdq_app -n %d -c %s -- -p
> > + %s --
> > nb-pools 8&" %
> > + (self.dut.get_memory_channels(), core_mask,
> > + portmask),
> > "reading queues", 30)
> > +
> > + tx_port = self.tester.get_local_port(self.dut_ports[0])
> > + rx_port = self.tester.get_local_port(self.dut_ports[1])
> > +
> > + print dts.GREEN("Waiting for application to initialize")
> > + sleep(5)
> > +
> > + for frame_size in frame_sizes:
> > +
> > + TestVmdq.current_frame_size = frame_size
> > +
> > + print dts.BLUE(str(frame_size))
> > +
> > + self.tester.scapy_append('dstmac="%s"' %
> > self.destmac_port0)
> > + tx_mac = self.tester.get_mac(tx_port)
> > + self.tester.scapy_append('srcmac="%s"' % tx_mac)
> > + self.tester.scapy_append(
> > + 'flows =
> > [Ether(src=srcmac,dst=dstmac)/Dot1Q(vlan=0)/("X"*%d)]' %
> > + (frame_size - TestVmdq.ip_dot1q_header_size))
> > + self.tester.scapy_append('wrpcap("test1.pcap", flows)')
> > + self.tester.scapy_execute()
> > +
> > + self.tester.scapy_append('dstmac="%s"' %
> > self.destmac_port1)
> > + tx_mac = self.tester.get_mac(rx_port)
> > + self.tester.scapy_append('srcmac="%s"' % tx_mac)
> > + self.tester.scapy_append(
> > + 'flows =
> > [Ether(src=srcmac,dst=dstmac)/Dot1Q(vlan=0)/("X"*%d)]' %
> > + (frame_size - TestVmdq.ip_dot1q_header_size))
> > + self.tester.scapy_append('wrpcap("test2.pcap", flows)')
> > + self.tester.scapy_execute()
> > +
> > + self.vlan_repeat = self.queues
> > + self.da_repeat = self.queues
> > +
> > + tgen_input = []
> > + tgen_input.append((tx_port, rx_port, "test1.pcap"))
> > + tgen_input.append((rx_port, tx_port, "test2.pcap"))
> > + _, pps =
> > self.tester.traffic_generator_throughput(tgen_input)
> > + config['mpps'][frame_size] = pps/1000000.0
> > +
> > + for n in range(len(self.core_configs)):
> > + for size in frame_sizes:
> > + self.verify(
> > + self.core_configs[n]['mpps'][size] is not 0, "No
> > traffic detected")
> > +
> > + # Print results
> > + dts.results_table_add_header(
> > + ['Frame size'] + [n['cores'] for n in self.core_configs])
> > +
> > + for size in frame_sizes:
> > + dts.results_table_add_row(
> > + [size] + [n['mpps'][size] for n in
> > + self.core_configs])
> > +
> > + dts.results_table_print()
> > +
> > + # Override etgen.dot1q function
> > + def dot1q(self, port, prio, id, vlan, type):
> > + """
> > + Change Ixia configuration
> > + """
> > +
> > + self.add_tcl_cmd("vlan config -mode vIncrement")
> > + self.add_tcl_cmd("vlan config -step 1")
> > + self.add_tcl_cmd("vlan config -repeat %d" % self.vlan_repeat)
> > + self.add_tcl_cmd("stream config -framesize %d" %
> > + TestVmdq.current_frame_size)
> > + super(TestVmdq, self).dot1q(port, prio, id, vlan, type)
> > +
> > + def ether(self, port, src, dst, type):
> > + """
> > + Configure Ether protocal.
> > + """
> > + self.add_tcl_cmd("protocol config -ethernetType ethernetII")
> > + self.add_tcl_cmd('stream config -sa "%s"' %
> > self.macToTclFormat(src))
> > + self.add_tcl_cmd('stream config -da "%s"' %
> > self.macToTclFormat(dst))
> > + self.add_tcl_cmd('stream config -daRepeatCounter increment')
> > + self.add_tcl_cmd('stream config -daStep 1')
> > + self.add_tcl_cmd('stream config -numDA %d' % self.da_repeat)
> > +
> > +
> > --
> > 2.1.0
next prev parent reply other threads:[~2015-09-15 10:33 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-15 6:35 Qian Xu
2015-09-15 6:35 ` [dts] [PATCH 2/2] Add updated test plan for vmdq Qian Xu
2015-09-15 8:44 ` [dts] [PATCH 1/2] Add updated vmdq test suite Xu, HuilongX
2015-09-15 9:09 ` Xu, Qian Q
2015-09-15 10:33 ` Xu, HuilongX [this message]
2015-09-15 11:47 ` Xu, Qian Q
2015-09-16 2:06 ` Liu, Yong
2015-09-16 2:14 ` Xu, Qian Q
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DF2A19295B96364286FEB7F3DDA27A463171EF17@SHSMSX101.ccr.corp.intel.com \
--to=huilongx.xu@intel.com \
--cc=dts@dpdk.org \
--cc=qian.q.xu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).