pkt_gen: STC - Imix Genome Support 33/65033/4
authorSridhar K. N. Rao <sridhar.rao@spirent.com>
Mon, 12 Nov 2018 14:46:46 +0000 (20:16 +0530)
committerSridhar K. N. Rao <sridhar.rao@spirent.com>
Mon, 21 Jan 2019 04:00:24 +0000 (09:30 +0530)
This patch adds Imix-Genome support to STC.
1. Imix, of type genome, is included in traffic configuration.
2. The genome is converted to appropriated weights and pkt-sizes.
3. Throughput test is run with imix-configuration.
4. genome configuration is added to results.
5. Added Reporting of Average-Frame-Size - if IMIX is configured.
6. Updated genome comments
7. Clarified the reference to RFC 6985.

JIRA: VSPERF-521

Change-Id: I813efb66338ee1d1320a01ce5e0834180461120c
Signed-off-by: Sridhar K. N. Rao <sridhar.rao@spirent.com>
conf/03_traffic.conf
core/results/results_constants.py
docs/testing/developer/devguide/design/vswitchperf_design.rst
docs/testing/user/configguide/trafficgen.rst
tools/pkt_gen/testcenter/testcenter-rfc2544-rest.py
tools/pkt_gen/testcenter/testcenter.py

index 486ab2c..d326907 100644 (file)
@@ -209,6 +209,20 @@ LOG_FILE_TRAFFIC_GEN = 'traffic-gen.log'
 #        'enabled'   - Specifies if the histogram provisioning is enabled or not.
 #        'type'      - Defines how histogram is provided. Currenty only 'Default' is defined.
 #                         'Default' - Default histogram as provided by the Traffic-generator.
+#    'imix'          - A dictionary for IMIX Specification.
+#        'enabled'   - Specifies if IMIX is enabled or NOT.
+#        'type'      - The specification type - denotes how IMIX is specified.
+#                      Currently only 'genome' type is defined.
+#                      Other types (ex: table-of-proportions) can be added in future.
+#        'genome'    - The Genome Encoding of Pkt-Sizes and Ratio for IMIX.
+#                      The ratio is inferred from the number of particular geneome characters.
+#                      Genome encoding is described in RFC 6985. This specification is closest
+#                      to the method described in section 6.2 of RFC 6985.
+#                      Ex: 'aaaaaaaddddg' denotes ratio of 7:4:1 of packets sizes 64:512:1518.
+#                      Note: Exact-sequence is not maintained, only the ratio of packets
+#                      is ensured.
+#                      Data type: str
+#                      Default Value: 'aaaaaaaddddg'
 TRAFFIC = {
     'traffic_type' : 'rfc2544_throughput',
     'frame_rate' : 100,
@@ -264,6 +278,11 @@ TRAFFIC = {
         'enabled': False,
         'type': 'Default',
     },
+    'imix': {
+        'enabled': False,
+        'type': 'genome',
+        'genome': 'aaaaaaaddddg',
+    },
 }
 
 #path to traffic generators directory.
index 967adbf..769938a 100644 (file)
@@ -73,6 +73,11 @@ class ResultsConstants(object):
     CAPTURE_TX = "capture_tx"
     CAPTURE_RX = "capture_rx"
 
+    # IMIX Used
+    IMIX_GENOME = "imix_genome"
+    # IMIX Avg. Frame Size
+    IMIX_AVG_FRAMESIZE = "imix_avg_framesize"
+
     @staticmethod
     def get_traffic_constants():
         """Method returns all Constants used to store results.
@@ -96,4 +101,6 @@ class ResultsConstants(object):
                 ResultsConstants.MIN_LATENCY_NS,
                 ResultsConstants.MAX_LATENCY_NS,
                 ResultsConstants.AVG_LATENCY_NS,
-                ResultsConstants.FRAME_LOSS_PERCENT]
+                ResultsConstants.FRAME_LOSS_PERCENT,
+                ResultsConstants.IMIX_GENOME,
+                ResultsConstants.IMIX_AVG_FRAMESIZE]
index bc54476..50682a9 100644 (file)
@@ -477,6 +477,20 @@ Detailed description of ``TRAFFIC`` dictionary items follows:
          'enabled'   - Specifies if the histogram provisioning is enabled or not.
          'type'      - Defines how histogram is provided. Currenty only 'Default' is defined.
                          'Default' - Default histogram as provided by the Traffic-generator.
+    'imix'           - A dictionary for IMIX Specification.
+        'enabled'    - Specifies if IMIX is enabled or NOT.
+        'type'       - The specification type - denotes how IMIX is specified.
+                       Currently only 'genome' type is defined.
+                       Other types (ex: table-of-proportions) can be added in future.
+        'genome'     - The Genome Encoding of Pkt-Sizes and Ratio for IMIX.
+                       The Ratio is inferred from the number of particular geneome characters
+                       Genome encoding is described in RFC 6985. This specification is closest
+                       to the method described in section 6.2 of RFC 6985.
+                       Ex: 'aaaaaaaddddg' denotes ratio of 7:4:1 of packets sizes 64:512:1518.
+                       Note: Exact-sequence is not maintained, only the ratio of packets
+                       is ensured.
+                       Data type: str
+                       Default Value: 'aaaaaaaddddg'
 
 .. _configuration-of-guest-options:
 
index ae74554..705e539 100644 (file)
@@ -91,6 +91,11 @@ and is configured as follows:
             'enabled': False,
             'type': 'Default',
         },
+        'imix': {
+            'enabled': True,
+            'type': 'genome',
+            'genome': 'aaaaaaaddddg',
+        },
     }
 
 A detailed description of the ``TRAFFIC`` dictionary can be found at
@@ -119,6 +124,13 @@ commandline above to:
     $ ./vsperf --test-params "TRAFFICGEN_PKT_SIZES=(x,y);TRAFFICGEN_DURATION=10;" \
                              "TRAFFICGEN_RFC2544_TESTS=1" $TESTNAME
 
+If you use imix, set the TRAFFICGEN_PKT_SIZES to 0.
+
+.. code-block:: console
+
+    TRAFFICGEN_PKT_SIZES = (0,)
+
+
 .. _trafficgen-dummy:
 
 Dummy
index 1ed1296..4054d0e 100644 (file)
@@ -22,12 +22,26 @@ TestCenter REST APIs. This test supports Python 3.4
 
 '''
 import argparse
+import collections
 import logging
 import os
 import sqlite3
 
 _LOGGER = logging.getLogger(__name__)
 
+GENOME_PKTSIZE_ENCODING = {"a": 64, "b": 128, "c": 256, "d": 512,
+                           "e": 1024, "f": 1280, "g": 1518, "h": 2112}
+
+
+def genome2weights(sequence):
+    """ Convert genome sequence to packetsize weights"""
+    weights = collections.defaultdict(int)
+    for char in GENOME_PKTSIZE_ENCODING:
+        charcount = sequence.count(char)
+        if charcount:
+            weights[GENOME_PKTSIZE_ENCODING[char]] = charcount
+    return weights
+
 
 def create_dir(path):
     """Create the directory as specified in path """
@@ -291,6 +305,12 @@ def main():
                                 action="store_true",
                                 help="latency histogram is required in output?",
                                 dest="latency_histogram")
+    optional_named.add_argument("--imix",
+                                required=False,
+                                default="",
+                                help=("IMIX specification as genome"
+                                      "Encoding - RFC 6985"),
+                                dest="imix")
     parser.add_argument("-v",
                         "--verbose",
                         required=False,
@@ -377,7 +397,7 @@ def main():
         # Create the DeviceGenEthIIIfParams object
         stc.create("DeviceGenEthIIIfParams",
                    under=east_device_gen_params,
-                   attributes={'UseDefaultPhyMac':True})
+                   attributes={'UseDefaultPhyMac': True})
 
         # Configuring Ipv4 interfaces
         stc.create("DeviceGenIpv4IfParams",
@@ -400,7 +420,7 @@ def main():
         # Create the DeviceGenEthIIIfParams object
         stc.create("DeviceGenEthIIIfParams",
                    under=west_device_gen_params,
-                   attributes={'UseDefaultPhyMac':True})
+                   attributes={'UseDefaultPhyMac': True})
 
         # Configuring Ipv4 interfaces
         stc.create("DeviceGenIpv4IfParams",
@@ -443,6 +463,19 @@ def main():
             gBucketSizeList = stc.get(wLatHist, 'BucketSizeList')
             # gLimitSizeList  = stc.get(wLatHist, 'LimitList')
 
+        # IMIX configuration
+        fld = None
+        if args.imix:
+            args.frame_size_list = []
+            weights = genome2weights(args.imix)
+            fld = stc.create('FrameLengthDistribution', under=project)
+            def_slots = stc.get(fld, "children-framelengthdistributionslot")
+            stc.perform("Delete", params={"ConfigList": def_slots})
+            for fsize in weights:
+                stc.create('framelengthdistributionslot', under=fld,
+                           attributes={'FixedFrameLength': fsize,
+                                       'Weight': weights[fsize]})
+
         # Create the RFC 2544 'metric test
         if args.metric == "throughput":
             if args.verbose:
@@ -460,7 +493,8 @@ def main():
                                 "RateUpperLimit": args.rate_upper_limit_pct,
                                 "Resolution": args.resolution_pct,
                                 "SearchMode": args.search_mode,
-                                "TrafficPattern": args.traffic_pattern})
+                                "TrafficPattern": args.traffic_pattern,
+                                "FrameSizeDistributionList": fld})
         elif args.metric == "backtoback":
             stc.perform("Rfc2544SetupBackToBackTestCommand",
                         params={"AcceptableFrameLoss":
index 7afa3d8..af30cd7 100644 (file)
@@ -332,7 +332,7 @@ class TestCenter(trafficgen.ITrafficGenerator):
 
         return self.get_rfc2889_addr_learning_results(filec)
 
-    def get_rfc2544_results(self, filename):
+    def get_rfc2544_results(self, filename, genome=None):
         """
         Reads the CSV file and return the results
         """
@@ -367,6 +367,10 @@ class TestCenter(trafficgen.ITrafficGenerator):
                     row["AverageLatency(us)"]) * 1000
                 result[ResultsConstants.FRAME_LOSS_PERCENT] = float(
                     row["PercentLoss"])
+                if genome:
+                    result[ResultsConstants.IMIX_GENOME] = genome
+                    result[ResultsConstants.IMIX_AVG_FRAMESIZE] = float(
+                        row["AvgFrameSize"])
         return result
 
     def send_cont_traffic(self, traffic=None, duration=30):
@@ -426,6 +430,13 @@ class TestCenter(trafficgen.ITrafficGenerator):
                 if traffic['latency_histogram']['type'] == 'Default':
                     args.append("--latency_histogram")
 
+        genome = ''
+        if traffic and 'imix' in traffic:
+            if traffic['imix']['enabled']:
+                if traffic['imix']['type'] == 'genome':
+                    genome = traffic['imix']['genome']
+                    args.append('--imix' + ' ' + genome)
+
         if settings.getValue("TRAFFICGEN_STC_VERBOSE") == "True":
             args.append("--verbose")
             verbose = True
@@ -440,7 +451,7 @@ class TestCenter(trafficgen.ITrafficGenerator):
         if verbose:
             self._logger.info("file: %s", filec)
 
-        return self.get_rfc2544_results(filec)
+        return self.get_rfc2544_results(filec, genome)
 
     def send_rfc2544_back2back(self, traffic=None, tests=1, duration=20,
                                lossrate=0.0):