xena_cont_learning: Adds learning preemption to continuous traffic 01/27401/1
authorChristian Trautman <ctrautma@redhat.com>
Mon, 23 Jan 2017 18:33:56 +0000 (13:33 -0500)
committerChristian Trautman <ctrautma@redhat.com>
Mon, 23 Jan 2017 18:33:56 +0000 (13:33 -0500)
Adds a configurable learning preemptive option when running
xena continuous traffic tests. This resolves a missing packet
or two when running OVS tests at flow rates that should not
drop packets.

JIRA: VSPERF-473

Change-Id: I056578ed9c9181287d97aea55a002f09aac14e81
Signed-off-by: Christian Trautman <ctrautma@redhat.com>
conf/03_traffic.conf
conf/10_custom.conf
docs/configguide/trafficgen.rst
tools/pkt_gen/xena/XenaDriver.py
tools/pkt_gen/xena/xena.py

index 7232466..4931e97 100644 (file)
@@ -374,6 +374,11 @@ TRAFFICGEN_XENA_2544_TPUT_VALUE_RESOLUTION = '0.5'
 TRAFFICGEN_XENA_2544_TPUT_USEPASS_THRESHHOLD = 'false'
 TRAFFICGEN_XENA_2544_TPUT_PASS_THRESHHOLD = '0.0'
 
+# Xena Continuous traffic options
+# Please reference xena documentation before making changes to these settings
+TRAFFICGEN_XENA_CONT_PORT_LEARNING_ENABLED = True
+TRAFFICGEN_XENA_CONT_PORT_LEARNING_DURATION = 3
+
 # Xena Configuration -- END
 ###########################
 
index 498ac29..ece733d 100644 (file)
@@ -88,6 +88,11 @@ TRAFFICGEN_XENA_2544_TPUT_VALUE_RESOLUTION = '0.5'
 TRAFFICGEN_XENA_2544_TPUT_USEPASS_THRESHHOLD = 'false'
 TRAFFICGEN_XENA_2544_TPUT_PASS_THRESHHOLD = '0.0'
 
+# Xena Continuous traffic options
+# Please reference xena documentation before making changes to these settings
+TRAFFICGEN_XENA_CONT_PORT_LEARNING_ENABLED = True
+TRAFFICGEN_XENA_CONT_PORT_LEARNING_DURATION = 3
+
 ###################################################
 # MoonGen Configuration and Connection Info-- BEGIN
 
index 5190bc8..b66a178 100644 (file)
@@ -516,6 +516,19 @@ Each value modifies the behavior of rfc 2544 throughput testing. Refer to your
 Xena documentation to understand the behavior changes in modifying these
 values.
 
+Continuous Traffic Testing
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Xena continuous traffic by default does a 3 second learning preemption to allow
+the DUT to receive learning packets before a continuous test is performed. If
+a custom test case requires this learning be disabled, you can disable the option
+or modify the length of the learning by modifying the following settings.
+
+.. code-block:: console
+
+    TRAFFICGEN_XENA_CONT_PORT_LEARNING_ENABLED = False
+    TRAFFICGEN_XENA_CONT_PORT_LEARNING_DURATION = 3
+
 MoonGen
 -------
 
index 04a99e9..e144514 100644 (file)
@@ -57,6 +57,7 @@ CMD_LOGOFF = 'c_logoff'
 CMD_OWNER = 'c_owner'
 CMD_PORT = ';Port:'
 CMD_PORT_IP = 'p_ipaddress'
+CMD_PORT_LEARNING = 'p_autotrain'
 CMD_RESERVE = 'p_reservation reserve'
 CMD_RELEASE = 'p_reservation release'
 CMD_RELINQUISH = 'p_reservation relinquish'
@@ -560,6 +561,14 @@ class XenaPort(object):
             "on" if on else "off"), self)
         return self._manager.driver.ask_verify(command)
 
+    def set_port_learning(self, interval):
+        """Start port learning with the interval in seconds specified. 0 disables port learning
+        :param: interval as int
+        :return: Boolean True if response OK, False if error.
+        """
+        command = make_port_command('{} {}'.format(CMD_PORT_LEARNING, interval), self)
+        return self._manager.driver.ask_verify(command)
+
     def set_port_ip(self, ip_addr, cidr, gateway, wild='255'):
         """
         Set the port ip address of the specific port
index 20577e8..f5415d5 100755 (executable)
@@ -383,6 +383,15 @@ class Xena(ITrafficGenerator):
         # Clear port configuration for a clean start
         self.xmanager.ports[0].reset_port()
         self.xmanager.ports[1].reset_port()
+        if settings.getValue('TRAFFICGEN_XENA_CONT_PORT_LEARNING_ENABLED'):
+            # turn on port learning
+            self.xmanager.ports[0].set_port_learning(1)
+            self.xmanager.ports[1].set_port_learning(1)
+            sleep(settings.getValue('TRAFFICGEN_XENA_CONT_PORT_LEARNING_DURATION'))
+            # turn off port learning
+            self.xmanager.ports[0].set_port_learning(0)
+            self.xmanager.ports[1].set_port_learning(0)
+            sleep(1)
         self.xmanager.ports[0].clear_stats()
         self.xmanager.ports[1].clear_stats()