Added barrier under load test, LoadBarrier

This test is still...in testing.  It assumes a loopback port is
configured (which can be specified with lb_port, defaults to 1).
A flow is inserted to create a storm of packet in messages from
the loopback.  Then a number of barrier messages are called.
The test passes if all barrier replies are received.  After the
barrier replies are received, the flow table is cleared.

The test is not run by default.
diff --git a/tests/load.py b/tests/load.py
new file mode 100644
index 0000000..d168a17
--- /dev/null
+++ b/tests/load.py
@@ -0,0 +1,134 @@
+"""
+Prototype test cases related to operation under load
+
+It is recommended that these definitions be kept in their own
+namespace as different groups of tests will likely define 
+similar identifiers.
+
+  The function test_set_init is called with a complete configuration
+dictionary prior to the invocation of any tests from this file.
+
+  The switch is actively attempting to contact the controller at the address
+indicated in oft_config
+
+In general these test cases make some assumption about the external
+configuration of the switch under test.  For now, the assumption is
+that the first two OF ports are connected by a loopback cable.
+"""
+
+import copy
+
+import logging
+
+import unittest
+
+import oftest.controller as controller
+import oftest.cstruct as ofp
+import oftest.message as message
+import oftest.dataplane as dataplane
+import oftest.action as action
+import oftest.parse as parse
+import basic
+import time
+
+from testutils import *
+
+#@var load_port_map Local copy of the configuration map from OF port
+# numbers to OS interfaces
+load_port_map = None
+#@var load_logger Local logger object
+load_logger = None
+#@var load_config Local copy of global configuration data
+load_config = None
+
+# For test priority
+#@var test_prio Set test priority for local tests
+test_prio = {}
+
+
+def test_set_init(config):
+    """
+    Set up function for packet action test classes
+
+    @param config The configuration dictionary; see oft
+    """
+
+    global load_port_map
+    global load_logger
+    global load_config
+
+    load_logger = logging.getLogger("load")
+    load_logger.info("Initializing test set")
+    load_port_map = config["port_map"]
+    load_config = config
+
+class LoadBarrier(basic.SimpleProtocol):
+    """
+    Test barrier under load with loopback
+
+    This test assumes there is a pair of ports on the switch with
+    a loopback cable connected and that spanning tree is disabled.
+    A flow is installed to cause a storm of packet-in messages
+    when a packet is sent to the loopbacked interface.  After causing 
+    this storm, a barrier request is sent.
+
+    The test succeeds if the barrier response is received.  Otherwise
+    the test fails.
+    """
+    def runTest(self):
+        # Set up flow to send from port 1 to port 2 and copy to CPU
+        # Test parameter gives LB port base (assumes consecutive)
+        lb_port = test_param_get(self.config, 'lb_port', default=1)
+        barrier_count = test_param_get(self.config, 'barrier_count', 
+                                       default=10)
+
+        # Set controller to filter packet ins
+        self.controller.filter_packet_in = True
+        self.controller.pkt_in_filter_limit = 10
+
+        pkt = simple_tcp_packet()
+        match = parse.packet_to_flow_match(pkt)
+        match.wildcards &= ~ofp.OFPFW_IN_PORT
+        match.in_port = lb_port
+        act = action.action_output()
+        act.port = lb_port + 1
+
+        request = message.flow_mod()
+        request.match = match
+        request.hard_timeout = 2 * barrier_count
+
+        request.buffer_id = 0xffffffff
+        self.assertTrue(request.actions.add(act), "Could not add action")
+
+        act = action.action_output()
+        act.port = ofp.OFPP_CONTROLLER
+        self.assertTrue(request.actions.add(act), "Could not add action")
+
+        rv = self.controller.message_send(request)
+        self.assertTrue(rv != -1, "Error installing flow mod")
+        self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
+
+        # Create packet out and send to port lb_port + 1
+        msg = message.packet_out()
+        msg.data = str(pkt)
+        act = action.action_output()
+        act.port = lb_port + 1
+        self.assertTrue(msg.actions.add(act), 'Could not add action to msg')
+        load_logger.info("Sleeping before starting storm")
+        time.sleep(1) # Root causing issue with fast disconnects
+        load_logger.info("Sending packet out to %d" % (lb_port + 1))
+        rv = self.controller.message_send(msg)
+        self.assertTrue(rv == 0, "Error sending out message")
+
+        for idx in range(0, barrier_count):
+            self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
+            # To do:  Add some interesting functionality here
+            load_logger.info("Barrier %d completed" % idx)
+
+        # Clear the flow table when done
+        load_logger.debug("Deleting all flows from switch")
+        rc = delete_all_flows(self.controller, load_logger)
+        self.assertEqual(rc, 0, "Failed to delete all flows")
+
+# Do not run by default; still mysterious disconnects often
+test_prio["LoadBarrier"] = -1