import OpenFlow 1.2 protocol module and basic test cases from CPqD/oftest12

For now these tests will live in a separate directory. The goal is to merge
them where possible but this has to wait for an OpenFlow protocol module that
supports all versions of OpenFlow.
diff --git a/src/python/of12/match_list.py b/src/python/of12/match_list.py
new file mode 100644
index 0000000..2a9660c
--- /dev/null
+++ b/src/python/of12/match_list.py
@@ -0,0 +1,45 @@
+import struct
+import match as match
+from match import oxm_tlv
+from binascii import b2a_hex
+from base_list import ofp_base_list
+
+
+class match_list(ofp_base_list):
+
+    def __init__(self):
+        ofp_base_list.__init__(self)
+        self.tlvs = self.items
+        self.name = "match"
+        self.class_list = match.match_class_list
+
+    def __len__(self):
+        return sum([len(i) for i in self])
+    
+    def unpack(self, binary_string, bytes=None):
+        if bytes <= 4:
+            return binary_string[4:]
+        if bytes == None:
+            bytes = len(binary_string)
+        offset = 0
+        cur_string = binary_string
+        while offset < bytes:
+            read = 0
+            oxm_class, oxm_fieldhm, oxm_length = struct.unpack("!HBB", cur_string[read:read+4])   
+            #Found padding bytes?
+            if not oxm_class:
+                break
+            oxm_field = oxm_fieldhm >> 1
+            oxm_hasmask = oxm_fieldhm & 0x00000001
+            payload = struct.unpack("!" + str(oxm_length) + "s", cur_string[read+4:read+4+oxm_length])[0]
+            if oxm_hasmask:
+                value, mask = payload[:oxm_length/2], payload[oxm_length/2:]    
+            else: 
+                value, mask = payload, None
+            oxm = oxm_tlv(oxm_field, oxm_hasmask, oxm_length, value,mask, oxm_class)
+            self.tlvs.append(oxm)
+            read = 4 + oxm_length
+            offset += read
+            cur_string = cur_string[read:]
+            
+        return cur_string