add load.FlowRemovedLoad
diff --git a/tests/load.py b/tests/load.py
index 2631f36..7f9e005 100644
--- a/tests/load.py
+++ b/tests/load.py
@@ -235,3 +235,68 @@
                self.assertNotEqual(self.controller.message_send(request), -1,
                                "Error installing flow mod")
             self.checkBarrier()
+
+class FlowRemovedLoad(base_tests.SimpleDataPlane):
+    """
+    Generate lots of flow-removed messages
+
+    We keep track of the number of flow-removed messages we get but do not
+    assert on it. The goal of this test is just to make sure the controller
+    stays connected.
+    """
+
+    def checkBarrier(self):
+        msg, pkt = self.controller.transact(ofp.message.barrier_request(), timeout=60)
+        self.assertNotEqual(msg, None, "Barrier failed")
+        while self.controller.packets:
+           msg = self.controller.packets.pop(0)[0]
+           self.assertNotEqual(msg.type, ofp.OFPT_ERROR, "Error received")
+
+    def runTest(self):
+        delete_all_flows(self.controller)
+        self.checkBarrier()
+        msg, _ = self.controller.transact(ofp.message.table_stats_request())
+
+        # Some switches report an extremely high max_entries that would cause
+        # us to run out of memory attempting to create all the flow-mods.
+        num_flows = min(msg.entries[0].max_entries, 32678)
+
+        logging.info("Creating %d flow-mods messages", num_flows)
+
+        requests = []
+        for i in range(num_flows):
+            match = ofp.match()
+            match.wildcards = ofp.OFPFW_ALL & ~ofp.OFPFW_DL_VLAN & ~ofp.OFPFW_DL_DST
+            match.vlan_vid = ofp.OFP_VLAN_NONE
+            match.eth_dst = [0, 1, 2, 3, i / 256, i % 256]
+            act = ofp.action.output()
+            act.port = ofp.OFPP_CONTROLLER
+            request = ofp.message.flow_add()
+            request.buffer_id = 0xffffffff
+            request.priority = num_flows - i
+            request.out_port = ofp.OFPP_NONE
+            request.flags = ofp.OFPFF_SEND_FLOW_REM
+            request.match = match
+            request.actions.append(act)
+            requests.append(request)
+
+        logging.info("Adding %d flows", num_flows)
+        random.shuffle(requests)
+        for request in requests:
+            self.controller.message_send(request)
+        self.checkBarrier()
+
+        # Trigger a flood of flow-removed messages
+        delete_all_flows(self.controller)
+
+        count = 0
+        while True:
+            (response, raw) = self.controller.poll(ofp.OFPT_FLOW_REMOVED)
+            if not response:
+                break
+            count += 1
+
+        # Make sure the switch is still connected
+        self.checkBarrier()
+
+        logging.info("FlowRemovedLoad got %d/%d flow_removed messages." % (count, num_flows))