From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 9BAC9A0679 for ; Sun, 28 Apr 2019 04:45:38 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6EEEC1B4FC; Sun, 28 Apr 2019 04:45:37 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 6D5511B4A0 for ; Sun, 28 Apr 2019 04:45:34 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Apr 2019 19:45:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,403,1549958400"; d="scan'208";a="146438577" Received: from itecstvdts01.sh.intel.com ([10.67.111.114]) by fmsmga007.fm.intel.com with ESMTP; 27 Apr 2019 19:45:33 -0700 From: yufengmx To: dts@dpdk.org Cc: yufengmx Date: Sun, 28 Apr 2019 10:49:01 +0800 Message-Id: <1556419751-41723-5-git-send-email-yufengx.mo@intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1556419751-41723-1-git-send-email-yufengx.mo@intel.com> References: <1556419751-41723-1-git-send-email-yufengx.mo@intel.com> Subject: [dts] [next][PATCH V1 4/14] doc/pktgen: migrate from etgen api to pktgen api 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: , Errors-To: dts-bounces@dpdk.org Sender: "dts" migrate from etgen api to pktgen api. The document describes a convenient way to meet with the simple packet generator usage scenario. Pktgen offer a helper class to be compatible with old coding style in suite source code. Signed-off-by: yufengmx --- doc/dts_gsg/migrate_from_etgen_to_pktgen.rst | 214 +++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 doc/dts_gsg/migrate_from_etgen_to_pktgen.rst diff --git a/doc/dts_gsg/migrate_from_etgen_to_pktgen.rst b/doc/dts_gsg/migrate_from_etgen_to_pktgen.rst new file mode 100644 index 0000000..bee7190 --- /dev/null +++ b/doc/dts_gsg/migrate_from_etgen_to_pktgen.rst @@ -0,0 +1,214 @@ + +================= +etgen replacement +================= +pktgen usage please refer to doc **pktgen_prog_guide.rst**. + +import new class +---------------- + +#. import a new module:: + +.. code-block:: python + + from pktgen import PacketGeneratorHelper + +initialize an instance in `def set_up_all(self)` +------------------------------------------------ + +.. code-block:: python + + def set_up_all(self): + ... + self.pktgen_helper = PacketGeneratorHelper() + +create streams for pktgen instance +---------------------------------- +each pcap file should only contain one packet. + +.. code-block:: python + + pcap1 = os.sep.join([self.pktgen.output_path, "{0}.pcap".format(port)]) + flow1 = "Ether()/IP()/UDP()/("X")" + self.tester.scapy_append('wrpcap("%s", [flow])' % (pcap1, flow1)) + self.tester.scapy_execute() + + pcap2 = os.sep.join([self.pktgen.output_path, "{0}.pcap".format(port)]) + flow2 = "Ether()/IP()/UDP()/("X")" + self.tester.scapy_append('wrpcap("%s", [flow])' % (pcap2, flow2)) + self.tester.scapy_execute() + + tgen_input = [] + tgen_input.append([tx_port, rx_port, pcap1]) + tgen_input.append([tx_port, rx_port, pcap2]) + +pcap field variable(optional) +----------------------------- +If no protocol layer field vary requirement, ignore this content. + +field key definition +~~~~~~~~~~~~~~~~~~~~ + +#. ip protocol layer:: + # protocol layer name + 'mac': { + # field name + 'src': { + # field value vary range + 'range': 64, + # field value vary step + 'step': 1, + # action: inc/dec/random + 'action': 'inc'}, + 'dst': {'range': 64, 'step': 1, 'action': 'inc'}, + } + +#. mac protocol layer:: + # protocol layer name + 'mac': { + # field name + 'src': { + # field value vary range + 'range': 64, + # field value vary step + 'step': 1, + # action: inc/dec/random + 'action': 'inc'}, + 'dst': {'range': 64, 'step': 1, 'action': 'inc'}, + } + +#. vlan protocol layer:: + # protocol layer name + 'vlan': { + '0': { + # field value vary range + 'range': 64, + # field value vary step + 'step': 1, + # action: inc/dec/random + 'action': 'inc'},} + +usage example +~~~~~~~~~~~~~ + +.. code-block:: python + + def set_up_all(self): + ... + self.pktgen_helper = PacketGeneratorHelper() + ... + + def set_fields(self): + fields_config = { + 'ip': { + 'src': {'range': 64, 'action': 'inc'}, + 'dst': {'action': 'random'}},} + return fields_config + + def test_perf_xxxx(self): + ... + vm_config= self.set_fields() # optional + # clear streams before add new streams + self.tester.pktgen.clear_streams() + # run packet generator + ratePercent = 100 + streams = self.pktgen_helper.prepare_stream_from_tginput( + tgenInput, ratePercent, vm_config, self.tester.pktgen) + _, pps = self.tester.pktgen.measure_throughput(stream_ids=streams) + ... + +change etgen interface to pktgen interface +------------------------------------------ +pktgen interface use the same input parameter/return value definition as +etgen interface. + +throughput +~~~~~~~~~~ + +etgen:: + +.. code-block:: python + + self.tester.traffic_generator_throughput(tgen_input) + +pktgen:: + +.. code-block:: python + + vm_config= self.set_fields() # optional + # clear streams before add new streams + self.tester.pktgen.clear_streams() + # run packet generator + ratePercent = 100 + streams = self.pktgen_helper.prepare_stream_from_tginput( + tgenInput, ratePercent, vm_config, self.tester.pktgen) + _, pps = self.tester.pktgen.measure_throughput(stream_ids=streams) + +loss +~~~~ + +etgen:: + +.. code-block:: python + + self.tester.traffic_generator_loss(tgen_input) + +pktgen:: + +.. code-block:: python + + vm_config= self.set_fields() # optional + # clear streams before add new streams + self.tester.pktgen.clear_streams() + # run packet generator + ratePercent = 100 + streams = self.pktgen_helper.prepare_stream_from_tginput( + tgenInput, ratePercent, vm_config, self.tester.pktgen) + result = self.tester.pktgen.measure_loss(stream_ids=streams) + +latency +~~~~~~~ + +etgen:: + +.. code-block:: python + + self.tester.traffic_generator_latency(tgen_input) + +pktgen:: + +.. code-block:: python + + vm_config= self.set_fields() # optional + # clear streams before add new streams + self.tester.pktgen.clear_streams() + # run packet generator + ratePercent = 100 + streams = self.pktgen_helper.prepare_stream_from_tginput( + tgenInput, ratePercent, vm_config, self.tester.pktgen) + latencys = self.tester.pktgen.measure_latency(stream_ids=streams) + +rfc2544 +~~~~~~~ + +etgen:: + +.. code-block:: python + + self.tester.run_rfc2544(tgen_input) + +pktgen:: + +.. code-block:: python + + vm_config= self.set_fields() # optional + # clear streams before add new streams + self.tester.pktgen.clear_streams() + # run packet generator + ratePercent = 100 + streams = self.pktgen_helper.prepare_stream_from_tginput( + tgenInput, ratePercent, 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) \ No newline at end of file -- 1.9.3