copy in of11 package

These modules were copied from the oft-1.1 branch.
diff --git a/src/python/of11/instruction_list.py b/src/python/of11/instruction_list.py
new file mode 100644
index 0000000..bce8cc7
--- /dev/null
+++ b/src/python/of11/instruction_list.py
@@ -0,0 +1,97 @@
+"""
+OpenFlow instruction list class
+"""
+
+import action
+import instruction
+from action_list import action_list
+from base_list import ofp_base_list
+from cstruct import ofp_header
+import unittest
+
+# Instruction list
+
+instruction_object_map = {
+    action.OFPIT_GOTO_TABLE          : instruction.instruction_goto_table,
+    action.OFPIT_WRITE_METADATA      : instruction.instruction_write_metadata,      
+    action.OFPIT_WRITE_ACTIONS       : instruction.instruction_write_actions,       
+    action.OFPIT_APPLY_ACTIONS       : instruction.instruction_apply_actions,       
+    action.OFPIT_CLEAR_ACTIONS       : instruction.instruction_clear_actions,       
+    action.OFPIT_EXPERIMENTER        : instruction.instruction_experimenter        
+}
+
+class instruction_list(ofp_base_list):
+    """
+    Maintain a list of instructions
+
+    Data members:
+    @arg instructions An array of instructions such as write_actions
+
+    Methods:
+    @arg pack: Pack the structure into a string
+    @arg unpack: Unpack a string to objects, with proper typing
+    @arg add: Add an action to the list; you can directly access
+    the action member, but add will validate that the added object 
+    is an action.
+
+    """
+
+    def __init__(self):
+        ofp_base_list.__init__(self)
+        self.instructions = self.items
+        self.name = "instruction"
+        self.class_list = instruction.instruction_class_list
+
+    def unpack(self, binary_string, bytes=None):
+        """
+        Unpack a list of instructions
+        
+        Unpack instructions from a binary string, creating an array
+        of objects of the appropriate type
+
+        @param binary_string The string to be unpacked
+
+        @param bytes The total length of the instruction list in bytes.  
+        Ignored if decode is True.  If bytes is None and decode is false, the
+        list is assumed to extend through the entire string.
+
+        @return The remainder of binary_string that was not parsed
+
+        """
+        if bytes == None:
+            bytes = len(binary_string)
+        bytes_done = 0
+        count = 0
+        cur_string = binary_string
+        while bytes_done < bytes:
+            hdr = instruction.ofp_instruction()
+            hdr.unpack(cur_string)
+            if hdr.len < action.OFP_ACTION_HEADER_BYTES:
+                print "ERROR: Action too short"
+                break
+            if not hdr.type in instruction_object_map.keys():
+                print "WARNING: Skipping unknown action ", hdr.type, hdr.len
+            else:
+                self.instructions.append(instruction_object_map[hdr.type]())
+                self.instructions[count].unpack(cur_string)
+                count += 1
+            cur_string = cur_string[hdr.len:]
+            bytes_done += hdr.len
+        return cur_string
+
+class Instruction_List_Test(unittest.TestCase):
+    def runTest(self):
+        # instructions header is 8 bytes
+        l = instruction_list()
+        act = action.action_output()
+        act.port = 7
+        inst = instruction.instruction_apply_actions()
+        self.assertTrue(inst.actions.add(act)) 
+        self.assertTrue(l.add(inst))
+        pkt = l.pack()
+        # 24 == 8 (list header) + (apply header) 8 + (output action) 8 
+        self.assertEqual(len(pkt),24)
+       
+        l = instruction_list()
+        self.assertTrue(l.add(instruction.instruction_goto_table()))
+