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