pyloxi: deserialize OXM lists
diff --git a/py_gen/templates/common.py b/py_gen/templates/common.py
index 75c6f4c..19a0d9b 100644
--- a/py_gen/templates/common.py
+++ b/py_gen/templates/common.py
@@ -36,6 +36,10 @@
 import util
 import loxi.generic_util
 
+:: if version >= 3:
+import oxm
+:: #endif
+
 # HACK make this module visible as 'common' to simplify code generation
 common = sys.modules[__name__]
 
@@ -64,10 +68,6 @@
             return None
     return [x for x in loxi.generic_util.unpack_list_tlv16(reader, deserializer) if x != None]
 
-def unpack_list_oxm(buf):
-    # TODO
-    return []
-
 :: for ofclass in ofclasses:
 :: include('_ofclass.py', ofclass=ofclass, superclass="object")
 
diff --git a/py_gen/templates/oxm.py b/py_gen/templates/oxm.py
index 66886e0..5d5df7a 100644
--- a/py_gen/templates/oxm.py
+++ b/py_gen/templates/oxm.py
@@ -37,6 +37,16 @@
 import loxi.generic_util
 import loxi
 
+def unpack_list(reader):
+    def deserializer(reader):
+        type_len, = reader.peek('!L')
+        if type_len in parsers:
+            return parsers[type_len](reader)
+        else:
+            raise loxi.ProtocolError("unknown OXM cls=%#x type=%#x masked=%d len=%d (%#x)" % \
+                ((type_len >> 16) & 0xffff, (type_len >> 9) & 0x7f, (type_len >> 8) & 1, type_len & 0xff, type_len))
+    return loxi.generic_util.unpack_list(reader, deserializer)
+
 class OXM(object):
     type_len = None # override in subclass
     pass