pyloxi: rewrite deserialization to use OFReader
diff --git a/py_gen/templates/action.py b/py_gen/templates/action.py
index 1c7a75a..d8f7c80 100644
--- a/py_gen/templates/action.py
+++ b/py_gen/templates/action.py
@@ -37,15 +37,12 @@
import loxi.generic_util
import loxi
-def unpack_list(buf):
- if len(buf) % 8 != 0: raise loxi.ProtocolError("action list length not a multiple of 8")
- def deserializer(buf):
- type, length = struct.unpack_from("!HH", buf)
- if length % 8 != 0: raise loxi.ProtocolError("action length not a multiple of 8")
- parser = parsers.get(type)
- if not parser: raise loxi.ProtocolError("unknown action type %d" % type)
- return parser(buf)
- return loxi.generic_util.unpack_list(deserializer, "!2xH", buf)
+def unpack_list(reader):
+ def deserializer(reader, typ):
+ parser = parsers.get(typ)
+ if not parser: raise loxi.ProtocolError("unknown action type %d" % typ)
+ return parser(reader)
+ return loxi.generic_util.unpack_list_tlv16(reader, deserializer)
class Action(object):
type = None # override in subclass
@@ -57,23 +54,21 @@
:: #endfor
:: if version == of_g.VERSION_1_0:
-def parse_vendor(buf):
+def parse_vendor(reader):
:: else:
-def parse_experimenter(buf):
+def parse_experimenter(reader):
:: #endif
- if len(buf) < 16:
- raise loxi.ProtocolError("experimenter action too short")
- experimenter, = struct.unpack_from("!L", buf, 4)
+ experimenter, = reader.peek("!4xL")
if experimenter == 0x005c16c7: # Big Switch Networks
- subtype, = struct.unpack_from("!L", buf, 8)
+ subtype, = reader.peek("!8xL")
elif experimenter == 0x00002320: # Nicira
- subtype, = struct.unpack_from("!H", buf, 8)
+ subtype, = reader.peek("!8xH")
else:
raise loxi.ProtocolError("unexpected experimenter id %#x" % experimenter)
if subtype in experimenter_parsers[experimenter]:
- return experimenter_parsers[experimenter][subtype](buf)
+ return experimenter_parsers[experimenter][subtype](reader)
else:
raise loxi.ProtocolError("unexpected BSN experimenter subtype %#x" % subtype)