diff --git a/oft b/oft
index d0db9c3..92709ab 100755
--- a/oft
+++ b/oft
@@ -36,6 +36,7 @@
 from oftest import config
 import oftest.ofutils
 import oftest.help_formatter
+import loxi
 
 try:
     import scapy.all as scapy
@@ -350,19 +351,12 @@
 logging.info("++++++++ " + time.asctime() + " ++++++++")
 
 # Pick an OpenFlow protocol module based on the configured version
-# This will go away once we have a single protocol module that
-# can handle all OpenFlow versions.
-if config["openflow_version"] == "1.0":
-    import of10
-    sys.modules["ofp"] = of10
-elif config["openflow_version"] == "1.1":
-    import of11
-    sys.modules["ofp"] = of11
-elif config["openflow_version"] == "1.2":
-    import of12
-    sys.modules["ofp"] = of12
-else:
-    assert(False)
+wire_versions = {
+    "1.0": 1,
+    "1.1": 2,
+    "1.2": 3,
+}
+sys.modules["ofp"] = loxi.protocol(wire_versions[config["openflow_version"]])
 
 # HACK: testutils.py imports controller.py, which needs the ofp module
 import oftest.testutils
diff --git a/src/python/loxi/__init__.py b/src/python/loxi/__init__.py
new file mode 100644
index 0000000..9fcc9bf
--- /dev/null
+++ b/src/python/loxi/__init__.py
@@ -0,0 +1,33 @@
+#
+# Copyright 2012, 2013, Big Switch Networks, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Automatically generated by LOXI from template toplevel_init.py
+# Do not modify
+
+def protocol(ver):
+    """
+    Import and return the protocol module for the given wire version.
+    """
+    if ver == 1:
+        import of10
+        return of10
+    else:
+        raise ValueError
+
+class ProtocolError(Exception):
+    """
+    Raised when failing to deserialize an invalid OpenFlow message.
+    """
+    pass
diff --git a/src/python/loxi/of10/__init__.py b/src/python/loxi/of10/__init__.py
new file mode 100644
index 0000000..9b3bf53
--- /dev/null
+++ b/src/python/loxi/of10/__init__.py
@@ -0,0 +1,22 @@
+#
+# Copyright 2012, 2013, Big Switch Networks, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Automatically generated by LOXI from template init.py
+# Do not modify
+
+import action, common, const, message
+from const import *
+from common import *
+from loxi import ProtocolError
diff --git a/src/python/loxi/of10/action.py b/src/python/loxi/of10/action.py
new file mode 100644
index 0000000..c6129a5
--- /dev/null
+++ b/src/python/loxi/of10/action.py
@@ -0,0 +1,1029 @@
+#
+# Copyright 2012, 2013, Big Switch Networks, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Automatically generated by LOXI from template action.py
+# Do not modify
+
+import struct
+import const
+import util
+import loxi
+
+def unpack_list(buf):
+    if len(buf) % 8 != 0: raise loxi.ProtocolError("action list length not a multiple of 8")
+    actions = []
+    offset = 0
+    while offset < len(buf):
+        type, length = struct.unpack_from("!HH", buf, offset)
+        if length == 0: raise loxi.ProtocolError("action length is 0")
+        if length % 8 != 0: raise loxi.ProtocolError("action length not a multiple of 8")
+        if offset + length > len(buf): raise loxi.ProtocolError("action length overruns list length")
+        parser = parsers.get(type)
+        if not parser: raise loxi.ProtocolError("unknown action type %d" % type)
+        actions.append(parser(buffer(buf, offset, length)))
+        offset += length
+    return actions
+
+class Action(object):
+    type = None # override in subclass
+    pass
+
+class bsn_mirror(Action):
+    type = const.OFPAT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 1
+
+    def __init__(self, dest_port=None, vlan_tag=None, copy_stage=None, pad=None):
+        if dest_port != None:
+            self.dest_port = dest_port
+        else:
+            self.dest_port = 0
+        if vlan_tag != None:
+            self.vlan_tag = vlan_tag
+        else:
+            self.vlan_tag = 0
+        if copy_stage != None:
+            self.copy_stage = copy_stage
+        else:
+            self.copy_stage = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!L", self.dest_port))
+        packed.append(struct.pack("!L", self.vlan_tag))
+        packed.append(struct.pack("!B", self.copy_stage))
+        packed.append(struct.pack("!3B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = bsn_mirror()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 24: raise loxi.ProtocolError("bsn_mirror length is %d, should be 24" % _length)
+        experimenter = struct.unpack_from('!L', buf, 4)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 8)[0]
+        assert(subtype == 1)
+        obj.dest_port = struct.unpack_from('!L', buf, 12)[0]
+        obj.vlan_tag = struct.unpack_from('!L', buf, 16)[0]
+        obj.copy_stage = struct.unpack_from('!B', buf, 20)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 21))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.dest_port != other.dest_port: return False
+        if self.vlan_tag != other.vlan_tag: return False
+        if self.copy_stage != other.copy_stage: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_mirror {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("dest_port = ");
+                q.text("%#x" % self.dest_port)
+                q.text(","); q.breakable()
+                q.text("vlan_tag = ");
+                q.text("%#x" % self.vlan_tag)
+                q.text(","); q.breakable()
+                q.text("copy_stage = ");
+                q.text("%#x" % self.copy_stage)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class bsn_set_tunnel_dst(Action):
+    type = const.OFPAT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 2
+
+    def __init__(self, dst=None):
+        if dst != None:
+            self.dst = dst
+        else:
+            self.dst = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!L", self.dst))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = bsn_set_tunnel_dst()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("bsn_set_tunnel_dst length is %d, should be 16" % _length)
+        experimenter = struct.unpack_from('!L', buf, 4)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 8)[0]
+        assert(subtype == 2)
+        obj.dst = struct.unpack_from('!L', buf, 12)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.dst != other.dst: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_set_tunnel_dst {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("dst = ");
+                q.text("%#x" % self.dst)
+            q.breakable()
+        q.text('}')
+
+class enqueue(Action):
+    type = const.OFPAT_ENQUEUE
+
+    def __init__(self, port=None, pad=None, queue_id=None):
+        if port != None:
+            self.port = port
+        else:
+            self.port = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0]
+        if queue_id != None:
+            self.queue_id = queue_id
+        else:
+            self.queue_id = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!H", self.port))
+        packed.append(struct.pack("!6B", *self.pad))
+        packed.append(struct.pack("!L", self.queue_id))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = enqueue()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_ENQUEUE)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("enqueue length is %d, should be 16" % _length)
+        obj.port = struct.unpack_from('!H', buf, 4)[0]
+        obj.pad = list(struct.unpack_from('!6B', buf, 6))
+        obj.queue_id = struct.unpack_from('!L', buf, 12)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.port != other.port: return False
+        if self.pad != other.pad: return False
+        if self.queue_id != other.queue_id: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("enqueue {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("port = ");
+                q.text(util.pretty_port(self.port))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("queue_id = ");
+                q.text("%#x" % self.queue_id)
+            q.breakable()
+        q.text('}')
+
+class nicira_dec_ttl(Action):
+    type = const.OFPAT_VENDOR
+    experimenter = 0x2320
+    subtype = 18
+
+    def __init__(self, pad=None, pad2=None):
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = 0
+        if pad2 != None:
+            self.pad2 = pad2
+        else:
+            self.pad2 = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!H", self.subtype))
+        packed.append(struct.pack("!H", self.pad))
+        packed.append(struct.pack("!L", self.pad2))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = nicira_dec_ttl()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("nicira_dec_ttl length is %d, should be 16" % _length)
+        experimenter = struct.unpack_from('!L', buf, 4)[0]
+        assert(experimenter == 0x2320)
+        subtype = struct.unpack_from('!H', buf, 8)[0]
+        assert(subtype == 18)
+        obj.pad = struct.unpack_from('!H', buf, 10)[0]
+        obj.pad2 = struct.unpack_from('!L', buf, 12)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.pad != other.pad: return False
+        if self.pad2 != other.pad2: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("nicira_dec_ttl {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("pad = ");
+                q.text("%#x" % self.pad)
+                q.text(","); q.breakable()
+                q.text("pad2 = ");
+                q.text("%#x" % self.pad2)
+            q.breakable()
+        q.text('}')
+
+class output(Action):
+    type = const.OFPAT_OUTPUT
+
+    def __init__(self, port=None, max_len=None):
+        if port != None:
+            self.port = port
+        else:
+            self.port = 0
+        if max_len != None:
+            self.max_len = max_len
+        else:
+            self.max_len = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!H", self.port))
+        packed.append(struct.pack("!H", self.max_len))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = output()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_OUTPUT)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("output length is %d, should be 8" % _length)
+        obj.port = struct.unpack_from('!H', buf, 4)[0]
+        obj.max_len = struct.unpack_from('!H', buf, 6)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.port != other.port: return False
+        if self.max_len != other.max_len: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("output {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("port = ");
+                q.text(util.pretty_port(self.port))
+                q.text(","); q.breakable()
+                q.text("max_len = ");
+                q.text("%#x" % self.max_len)
+            q.breakable()
+        q.text('}')
+
+class set_dl_dst(Action):
+    type = const.OFPAT_SET_DL_DST
+
+    def __init__(self, dl_addr=None, pad=None):
+        if dl_addr != None:
+            self.dl_addr = dl_addr
+        else:
+            self.dl_addr = [0,0,0,0,0,0]
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!6B", *self.dl_addr))
+        packed.append(struct.pack("!6B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_dl_dst()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_DL_DST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("set_dl_dst length is %d, should be 16" % _length)
+        obj.dl_addr = list(struct.unpack_from('!6B', buf, 4))
+        obj.pad = list(struct.unpack_from('!6B', buf, 10))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.dl_addr != other.dl_addr: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_dl_dst {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("dl_addr = ");
+                q.text(util.pretty_mac(self.dl_addr))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class set_dl_src(Action):
+    type = const.OFPAT_SET_DL_SRC
+
+    def __init__(self, dl_addr=None, pad=None):
+        if dl_addr != None:
+            self.dl_addr = dl_addr
+        else:
+            self.dl_addr = [0,0,0,0,0,0]
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!6B", *self.dl_addr))
+        packed.append(struct.pack("!6B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_dl_src()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_DL_SRC)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("set_dl_src length is %d, should be 16" % _length)
+        obj.dl_addr = list(struct.unpack_from('!6B', buf, 4))
+        obj.pad = list(struct.unpack_from('!6B', buf, 10))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.dl_addr != other.dl_addr: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_dl_src {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("dl_addr = ");
+                q.text(util.pretty_mac(self.dl_addr))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class set_nw_dst(Action):
+    type = const.OFPAT_SET_NW_DST
+
+    def __init__(self, nw_addr=None):
+        if nw_addr != None:
+            self.nw_addr = nw_addr
+        else:
+            self.nw_addr = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!L", self.nw_addr))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_nw_dst()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_NW_DST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("set_nw_dst length is %d, should be 8" % _length)
+        obj.nw_addr = struct.unpack_from('!L', buf, 4)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.nw_addr != other.nw_addr: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_nw_dst {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("nw_addr = ");
+                q.text("%#x" % self.nw_addr)
+            q.breakable()
+        q.text('}')
+
+class set_nw_src(Action):
+    type = const.OFPAT_SET_NW_SRC
+
+    def __init__(self, nw_addr=None):
+        if nw_addr != None:
+            self.nw_addr = nw_addr
+        else:
+            self.nw_addr = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!L", self.nw_addr))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_nw_src()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_NW_SRC)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("set_nw_src length is %d, should be 8" % _length)
+        obj.nw_addr = struct.unpack_from('!L', buf, 4)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.nw_addr != other.nw_addr: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_nw_src {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("nw_addr = ");
+                q.text("%#x" % self.nw_addr)
+            q.breakable()
+        q.text('}')
+
+class set_nw_tos(Action):
+    type = const.OFPAT_SET_NW_TOS
+
+    def __init__(self, nw_tos=None, pad=None):
+        if nw_tos != None:
+            self.nw_tos = nw_tos
+        else:
+            self.nw_tos = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!B", self.nw_tos))
+        packed.append(struct.pack("!3B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_nw_tos()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_NW_TOS)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("set_nw_tos length is %d, should be 8" % _length)
+        obj.nw_tos = struct.unpack_from('!B', buf, 4)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 5))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.nw_tos != other.nw_tos: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_nw_tos {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("nw_tos = ");
+                q.text("%#x" % self.nw_tos)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class set_tp_dst(Action):
+    type = const.OFPAT_SET_TP_DST
+
+    def __init__(self, tp_port=None, pad=None):
+        if tp_port != None:
+            self.tp_port = tp_port
+        else:
+            self.tp_port = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!H", self.tp_port))
+        packed.append(struct.pack("!2B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_tp_dst()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_TP_DST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("set_tp_dst length is %d, should be 8" % _length)
+        obj.tp_port = struct.unpack_from('!H', buf, 4)[0]
+        obj.pad = list(struct.unpack_from('!2B', buf, 6))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.tp_port != other.tp_port: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_tp_dst {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("tp_port = ");
+                q.text("%#x" % self.tp_port)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class set_tp_src(Action):
+    type = const.OFPAT_SET_TP_SRC
+
+    def __init__(self, tp_port=None, pad=None):
+        if tp_port != None:
+            self.tp_port = tp_port
+        else:
+            self.tp_port = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!H", self.tp_port))
+        packed.append(struct.pack("!2B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_tp_src()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_TP_SRC)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("set_tp_src length is %d, should be 8" % _length)
+        obj.tp_port = struct.unpack_from('!H', buf, 4)[0]
+        obj.pad = list(struct.unpack_from('!2B', buf, 6))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.tp_port != other.tp_port: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_tp_src {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("tp_port = ");
+                q.text("%#x" % self.tp_port)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class set_vlan_pcp(Action):
+    type = const.OFPAT_SET_VLAN_PCP
+
+    def __init__(self, vlan_pcp=None, pad=None):
+        if vlan_pcp != None:
+            self.vlan_pcp = vlan_pcp
+        else:
+            self.vlan_pcp = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!B", self.vlan_pcp))
+        packed.append(struct.pack("!3B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_vlan_pcp()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_VLAN_PCP)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("set_vlan_pcp length is %d, should be 8" % _length)
+        obj.vlan_pcp = struct.unpack_from('!B', buf, 4)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 5))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.vlan_pcp != other.vlan_pcp: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_vlan_pcp {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("vlan_pcp = ");
+                q.text("%#x" % self.vlan_pcp)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class set_vlan_vid(Action):
+    type = const.OFPAT_SET_VLAN_VID
+
+    def __init__(self, vlan_vid=None, pad=None):
+        if vlan_vid != None:
+            self.vlan_vid = vlan_vid
+        else:
+            self.vlan_vid = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!H", self.vlan_vid))
+        packed.append(struct.pack("!2B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = set_vlan_vid()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_SET_VLAN_VID)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("set_vlan_vid length is %d, should be 8" % _length)
+        obj.vlan_vid = struct.unpack_from('!H', buf, 4)[0]
+        obj.pad = list(struct.unpack_from('!2B', buf, 6))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.vlan_vid != other.vlan_vid: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_vlan_vid {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("vlan_vid = ");
+                q.text("%#x" % self.vlan_vid)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class strip_vlan(Action):
+    type = const.OFPAT_STRIP_VLAN
+
+    def __init__(self, pad=None):
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!4B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        obj = strip_vlan()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPAT_STRIP_VLAN)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("strip_vlan length is %d, should be 8" % _length)
+        obj.pad = list(struct.unpack_from('!4B', buf, 4))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.type != other.type: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("strip_vlan {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+
+def parse_vendor(buf):
+    if len(buf) < 16:
+        raise loxi.ProtocolError("experimenter action too short")
+
+    experimenter, = struct.unpack_from("!L", buf, 4)
+    if experimenter == 0x005c16c7: # Big Switch Networks
+        subtype, = struct.unpack_from("!L", buf, 8)
+    elif experimenter == 0x00002320: # Nicira
+        subtype, = struct.unpack_from("!H", buf, 8)
+    else:
+        raise loxi.ProtocolError("unexpected experimenter id %#x" % experimenter)
+
+    if subtype in experimenter_parsers[experimenter]:
+        return experimenter_parsers[experimenter][subtype](buf)
+    else:
+        raise loxi.ProtocolError("unexpected BSN experimenter subtype %#x" % subtype)
+
+parsers = {
+    const.OFPAT_ENQUEUE : enqueue.unpack,
+    const.OFPAT_OUTPUT : output.unpack,
+    const.OFPAT_SET_DL_DST : set_dl_dst.unpack,
+    const.OFPAT_SET_DL_SRC : set_dl_src.unpack,
+    const.OFPAT_SET_NW_DST : set_nw_dst.unpack,
+    const.OFPAT_SET_NW_SRC : set_nw_src.unpack,
+    const.OFPAT_SET_NW_TOS : set_nw_tos.unpack,
+    const.OFPAT_SET_TP_DST : set_tp_dst.unpack,
+    const.OFPAT_SET_TP_SRC : set_tp_src.unpack,
+    const.OFPAT_SET_VLAN_PCP : set_vlan_pcp.unpack,
+    const.OFPAT_SET_VLAN_VID : set_vlan_vid.unpack,
+    const.OFPAT_STRIP_VLAN : strip_vlan.unpack,
+    const.OFPAT_VENDOR : parse_vendor,
+}
+
+experimenter_parsers = {
+    0x2320 : {
+        18: nicira_dec_ttl.unpack,
+    },
+    0x5c16c7 : {
+        1: bsn_mirror.unpack,
+        2: bsn_set_tunnel_dst.unpack,
+    },
+}
diff --git a/src/python/loxi/of10/common.py b/src/python/loxi/of10/common.py
new file mode 100644
index 0000000..07c41d0
--- /dev/null
+++ b/src/python/loxi/of10/common.py
@@ -0,0 +1,1136 @@
+#
+# Copyright 2012, 2013, Big Switch Networks, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Automatically generated by LOXI from template common.py
+# Do not modify
+
+import sys
+import struct
+import action
+import const
+import util
+
+# HACK make this module visible as 'common' to simplify code generation
+common = sys.modules[__name__]
+
+def unpack_list_flow_stats_entry(buf):
+    entries = []
+    offset = 0
+    while offset < len(buf):
+        length, = struct.unpack_from("!H", buf, offset)
+        if length == 0: raise loxi.ProtocolError("entry length is 0")
+        if offset + length > len(buf): raise loxi.ProtocolError("entry length overruns list length")
+        entries.append(flow_stats_entry.unpack(buffer(buf, offset, length)))
+        offset += length
+    return entries
+
+def unpack_list_queue_prop(buf):
+    entries = []
+    offset = 0
+    while offset < len(buf):
+        type, length, = struct.unpack_from("!HH", buf, offset)
+        if length == 0: raise loxi.ProtocolError("entry length is 0")
+        if offset + length > len(buf): raise loxi.ProtocolError("entry length overruns list length")
+        if type == const.OFPQT_MIN_RATE:
+            entry = queue_prop_min_rate.unpack(buffer(buf, offset, length))
+        else:
+            raise loxi.ProtocolError("unknown queue prop %d" % type)
+        entries.append(entry)
+        offset += length
+    return entries
+
+def unpack_list_packet_queue(buf):
+    entries = []
+    offset = 0
+    while offset < len(buf):
+        _, length, = struct.unpack_from("!LH", buf, offset)
+        if length == 0: raise loxi.ProtocolError("entry length is 0")
+        if offset + length > len(buf): raise loxi.ProtocolError("entry length overruns list length")
+        entries.append(packet_queue.unpack(buffer(buf, offset, length)))
+        offset += length
+    return entries
+
+class bsn_interface(object):
+
+    def __init__(self, hw_addr=None, pad=None, name=None, ipv4_addr=None, ipv4_netmask=None):
+        if hw_addr != None:
+            self.hw_addr = hw_addr
+        else:
+            self.hw_addr = [0,0,0,0,0,0]
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = 0
+        if name != None:
+            self.name = name
+        else:
+            self.name = ""
+        if ipv4_addr != None:
+            self.ipv4_addr = ipv4_addr
+        else:
+            self.ipv4_addr = 0
+        if ipv4_netmask != None:
+            self.ipv4_netmask = ipv4_netmask
+        else:
+            self.ipv4_netmask = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!6B", *self.hw_addr))
+        packed.append(struct.pack("!H", self.pad))
+        packed.append(struct.pack("!16s", self.name))
+        packed.append(struct.pack("!L", self.ipv4_addr))
+        packed.append(struct.pack("!L", self.ipv4_netmask))
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 32) # Should be verified by caller
+        obj = bsn_interface()
+        obj.hw_addr = list(struct.unpack_from('!6B', buf, 0))
+        obj.pad = struct.unpack_from('!H', buf, 6)[0]
+        obj.name = str(buffer(buf, 8, 16)).rstrip("\x00")
+        obj.ipv4_addr = struct.unpack_from('!L', buf, 24)[0]
+        obj.ipv4_netmask = struct.unpack_from('!L', buf, 28)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.hw_addr != other.hw_addr: return False
+        if self.pad != other.pad: return False
+        if self.name != other.name: return False
+        if self.ipv4_addr != other.ipv4_addr: return False
+        if self.ipv4_netmask != other.ipv4_netmask: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_interface {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("hw_addr = ");
+                q.text(util.pretty_mac(self.hw_addr))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.text("%#x" % self.pad)
+                q.text(","); q.breakable()
+                q.text("name = ");
+                q.pp(self.name)
+                q.text(","); q.breakable()
+                q.text("ipv4_addr = ");
+                q.text(util.pretty_ipv4(self.ipv4_addr))
+                q.text(","); q.breakable()
+                q.text("ipv4_netmask = ");
+                q.text(util.pretty_ipv4(self.ipv4_netmask))
+            q.breakable()
+        q.text('}')
+
+class flow_stats_entry(object):
+
+    def __init__(self, table_id=None, pad=None, match=None, duration_sec=None, duration_nsec=None, priority=None, idle_timeout=None, hard_timeout=None, pad2=None, cookie=None, packet_count=None, byte_count=None, actions=None):
+        if table_id != None:
+            self.table_id = table_id
+        else:
+            self.table_id = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = 0
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if duration_sec != None:
+            self.duration_sec = duration_sec
+        else:
+            self.duration_sec = 0
+        if duration_nsec != None:
+            self.duration_nsec = duration_nsec
+        else:
+            self.duration_nsec = 0
+        if priority != None:
+            self.priority = priority
+        else:
+            self.priority = 0
+        if idle_timeout != None:
+            self.idle_timeout = idle_timeout
+        else:
+            self.idle_timeout = 0
+        if hard_timeout != None:
+            self.hard_timeout = hard_timeout
+        else:
+            self.hard_timeout = 0
+        if pad2 != None:
+            self.pad2 = pad2
+        else:
+            self.pad2 = [0,0,0,0,0,0]
+        if cookie != None:
+            self.cookie = cookie
+        else:
+            self.cookie = 0
+        if packet_count != None:
+            self.packet_count = packet_count
+        else:
+            self.packet_count = 0
+        if byte_count != None:
+            self.byte_count = byte_count
+        else:
+            self.byte_count = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 0
+        packed.append(struct.pack("!B", self.table_id))
+        packed.append(struct.pack("!B", self.pad))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!L", self.duration_sec))
+        packed.append(struct.pack("!L", self.duration_nsec))
+        packed.append(struct.pack("!H", self.priority))
+        packed.append(struct.pack("!H", self.idle_timeout))
+        packed.append(struct.pack("!H", self.hard_timeout))
+        packed.append(struct.pack("!6B", *self.pad2))
+        packed.append(struct.pack("!Q", self.cookie))
+        packed.append(struct.pack("!Q", self.packet_count))
+        packed.append(struct.pack("!Q", self.byte_count))
+        packed.append("".join([x.pack() for x in self.actions]))
+        length = sum([len(x) for x in packed])
+        packed[0] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 88) # Should be verified by caller
+        obj = flow_stats_entry()
+        _length = struct.unpack_from('!H', buf, 0)[0]
+        assert(_length == len(buf))
+        if _length < 88: raise loxi.ProtocolError("flow_stats_entry length is %d, should be at least 88" % _length)
+        obj.table_id = struct.unpack_from('!B', buf, 2)[0]
+        obj.pad = struct.unpack_from('!B', buf, 3)[0]
+        obj.match = common.match.unpack(buffer(buf, 4))
+        obj.duration_sec = struct.unpack_from('!L', buf, 44)[0]
+        obj.duration_nsec = struct.unpack_from('!L', buf, 48)[0]
+        obj.priority = struct.unpack_from('!H', buf, 52)[0]
+        obj.idle_timeout = struct.unpack_from('!H', buf, 54)[0]
+        obj.hard_timeout = struct.unpack_from('!H', buf, 56)[0]
+        obj.pad2 = list(struct.unpack_from('!6B', buf, 58))
+        obj.cookie = struct.unpack_from('!Q', buf, 64)[0]
+        obj.packet_count = struct.unpack_from('!Q', buf, 72)[0]
+        obj.byte_count = struct.unpack_from('!Q', buf, 80)[0]
+        obj.actions = action.unpack_list(buffer(buf, 88))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.table_id != other.table_id: return False
+        if self.pad != other.pad: return False
+        if self.match != other.match: return False
+        if self.duration_sec != other.duration_sec: return False
+        if self.duration_nsec != other.duration_nsec: return False
+        if self.priority != other.priority: return False
+        if self.idle_timeout != other.idle_timeout: return False
+        if self.hard_timeout != other.hard_timeout: return False
+        if self.pad2 != other.pad2: return False
+        if self.cookie != other.cookie: return False
+        if self.packet_count != other.packet_count: return False
+        if self.byte_count != other.byte_count: return False
+        if self.actions != other.actions: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_stats_entry {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("table_id = ");
+                q.text("%#x" % self.table_id)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.text("%#x" % self.pad)
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("duration_sec = ");
+                q.text("%#x" % self.duration_sec)
+                q.text(","); q.breakable()
+                q.text("duration_nsec = ");
+                q.text("%#x" % self.duration_nsec)
+                q.text(","); q.breakable()
+                q.text("priority = ");
+                q.text("%#x" % self.priority)
+                q.text(","); q.breakable()
+                q.text("idle_timeout = ");
+                q.text("%#x" % self.idle_timeout)
+                q.text(","); q.breakable()
+                q.text("hard_timeout = ");
+                q.text("%#x" % self.hard_timeout)
+                q.text(","); q.breakable()
+                q.text("pad2 = ");
+                q.pp(self.pad2)
+                q.text(","); q.breakable()
+                q.text("cookie = ");
+                q.text("%#x" % self.cookie)
+                q.text(","); q.breakable()
+                q.text("packet_count = ");
+                q.text("%#x" % self.packet_count)
+                q.text(","); q.breakable()
+                q.text("byte_count = ");
+                q.text("%#x" % self.byte_count)
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.pp(self.actions)
+            q.breakable()
+        q.text('}')
+
+class match_v1(object):
+
+    def __init__(self, wildcards=None, in_port=None, eth_src=None, eth_dst=None, vlan_vid=None, vlan_pcp=None, pad1=None, eth_type=None, ip_dscp=None, ip_proto=None, pad2=None, ipv4_src=None, ipv4_dst=None, tcp_src=None, tcp_dst=None):
+        if wildcards != None:
+            self.wildcards = wildcards
+        else:
+            self.wildcards = const.OFPFW_ALL
+        if in_port != None:
+            self.in_port = in_port
+        else:
+            self.in_port = 0
+        if eth_src != None:
+            self.eth_src = eth_src
+        else:
+            self.eth_src = [0,0,0,0,0,0]
+        if eth_dst != None:
+            self.eth_dst = eth_dst
+        else:
+            self.eth_dst = [0,0,0,0,0,0]
+        if vlan_vid != None:
+            self.vlan_vid = vlan_vid
+        else:
+            self.vlan_vid = 0
+        if vlan_pcp != None:
+            self.vlan_pcp = vlan_pcp
+        else:
+            self.vlan_pcp = 0
+        if pad1 != None:
+            self.pad1 = pad1
+        else:
+            self.pad1 = 0
+        if eth_type != None:
+            self.eth_type = eth_type
+        else:
+            self.eth_type = 0
+        if ip_dscp != None:
+            self.ip_dscp = ip_dscp
+        else:
+            self.ip_dscp = 0
+        if ip_proto != None:
+            self.ip_proto = ip_proto
+        else:
+            self.ip_proto = 0
+        if pad2 != None:
+            self.pad2 = pad2
+        else:
+            self.pad2 = [0,0]
+        if ipv4_src != None:
+            self.ipv4_src = ipv4_src
+        else:
+            self.ipv4_src = 0
+        if ipv4_dst != None:
+            self.ipv4_dst = ipv4_dst
+        else:
+            self.ipv4_dst = 0
+        if tcp_src != None:
+            self.tcp_src = tcp_src
+        else:
+            self.tcp_src = 0
+        if tcp_dst != None:
+            self.tcp_dst = tcp_dst
+        else:
+            self.tcp_dst = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!L", self.wildcards))
+        packed.append(struct.pack("!H", self.in_port))
+        packed.append(struct.pack("!6B", *self.eth_src))
+        packed.append(struct.pack("!6B", *self.eth_dst))
+        packed.append(struct.pack("!H", self.vlan_vid))
+        packed.append(struct.pack("!B", self.vlan_pcp))
+        packed.append(struct.pack("!B", self.pad1))
+        packed.append(struct.pack("!H", self.eth_type))
+        packed.append(struct.pack("!B", self.ip_dscp))
+        packed.append(struct.pack("!B", self.ip_proto))
+        packed.append(struct.pack("!2B", *self.pad2))
+        packed.append(struct.pack("!L", self.ipv4_src))
+        packed.append(struct.pack("!L", self.ipv4_dst))
+        packed.append(struct.pack("!H", self.tcp_src))
+        packed.append(struct.pack("!H", self.tcp_dst))
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 40) # Should be verified by caller
+        obj = match_v1()
+        obj.wildcards = struct.unpack_from('!L', buf, 0)[0]
+        obj.in_port = struct.unpack_from('!H', buf, 4)[0]
+        obj.eth_src = list(struct.unpack_from('!6B', buf, 6))
+        obj.eth_dst = list(struct.unpack_from('!6B', buf, 12))
+        obj.vlan_vid = struct.unpack_from('!H', buf, 18)[0]
+        obj.vlan_pcp = struct.unpack_from('!B', buf, 20)[0]
+        obj.pad1 = struct.unpack_from('!B', buf, 21)[0]
+        obj.eth_type = struct.unpack_from('!H', buf, 22)[0]
+        obj.ip_dscp = struct.unpack_from('!B', buf, 24)[0]
+        obj.ip_proto = struct.unpack_from('!B', buf, 25)[0]
+        obj.pad2 = list(struct.unpack_from('!2B', buf, 26))
+        obj.ipv4_src = struct.unpack_from('!L', buf, 28)[0]
+        obj.ipv4_dst = struct.unpack_from('!L', buf, 32)[0]
+        obj.tcp_src = struct.unpack_from('!H', buf, 36)[0]
+        obj.tcp_dst = struct.unpack_from('!H', buf, 38)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.wildcards != other.wildcards: return False
+        if self.in_port != other.in_port: return False
+        if self.eth_src != other.eth_src: return False
+        if self.eth_dst != other.eth_dst: return False
+        if self.vlan_vid != other.vlan_vid: return False
+        if self.vlan_pcp != other.vlan_pcp: return False
+        if self.pad1 != other.pad1: return False
+        if self.eth_type != other.eth_type: return False
+        if self.ip_dscp != other.ip_dscp: return False
+        if self.ip_proto != other.ip_proto: return False
+        if self.pad2 != other.pad2: return False
+        if self.ipv4_src != other.ipv4_src: return False
+        if self.ipv4_dst != other.ipv4_dst: return False
+        if self.tcp_src != other.tcp_src: return False
+        if self.tcp_dst != other.tcp_dst: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("match_v1 {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("wildcards = ");
+                q.text(util.pretty_wildcards(self.wildcards))
+                q.text(","); q.breakable()
+                q.text("in_port = ");
+                q.text(util.pretty_port(self.in_port))
+                q.text(","); q.breakable()
+                q.text("eth_src = ");
+                q.text(util.pretty_mac(self.eth_src))
+                q.text(","); q.breakable()
+                q.text("eth_dst = ");
+                q.text(util.pretty_mac(self.eth_dst))
+                q.text(","); q.breakable()
+                q.text("vlan_vid = ");
+                q.text("%#x" % self.vlan_vid)
+                q.text(","); q.breakable()
+                q.text("vlan_pcp = ");
+                q.text("%#x" % self.vlan_pcp)
+                q.text(","); q.breakable()
+                q.text("pad1 = ");
+                q.text("%#x" % self.pad1)
+                q.text(","); q.breakable()
+                q.text("eth_type = ");
+                q.text("%#x" % self.eth_type)
+                q.text(","); q.breakable()
+                q.text("ip_dscp = ");
+                q.text("%#x" % self.ip_dscp)
+                q.text(","); q.breakable()
+                q.text("ip_proto = ");
+                q.text("%#x" % self.ip_proto)
+                q.text(","); q.breakable()
+                q.text("pad2 = ");
+                q.pp(self.pad2)
+                q.text(","); q.breakable()
+                q.text("ipv4_src = ");
+                q.text(util.pretty_ipv4(self.ipv4_src))
+                q.text(","); q.breakable()
+                q.text("ipv4_dst = ");
+                q.text(util.pretty_ipv4(self.ipv4_dst))
+                q.text(","); q.breakable()
+                q.text("tcp_src = ");
+                q.text("%#x" % self.tcp_src)
+                q.text(","); q.breakable()
+                q.text("tcp_dst = ");
+                q.text("%#x" % self.tcp_dst)
+            q.breakable()
+        q.text('}')
+
+match = match_v1
+
+class packet_queue(object):
+
+    def __init__(self, queue_id=None, pad=None, properties=None):
+        if queue_id != None:
+            self.queue_id = queue_id
+        else:
+            self.queue_id = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0]
+        if properties != None:
+            self.properties = properties
+        else:
+            self.properties = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!L", self.queue_id))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!2B", *self.pad))
+        packed.append("".join([x.pack() for x in self.properties]))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 8) # Should be verified by caller
+        obj = packet_queue()
+        obj.queue_id = struct.unpack_from('!L', buf, 0)[0]
+        _length = struct.unpack_from('!H', buf, 4)[0]
+        assert(_length == len(buf))
+        if _length < 8: raise loxi.ProtocolError("packet_queue length is %d, should be at least 8" % _length)
+        obj.pad = list(struct.unpack_from('!2B', buf, 6))
+        obj.properties = common.unpack_list_queue_prop(buffer(buf, 8))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.queue_id != other.queue_id: return False
+        if self.pad != other.pad: return False
+        if self.properties != other.properties: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("packet_queue {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("queue_id = ");
+                q.text("%#x" % self.queue_id)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("properties = ");
+                q.pp(self.properties)
+            q.breakable()
+        q.text('}')
+
+class port_desc(object):
+
+    def __init__(self, port_no=None, hw_addr=None, name=None, config=None, state=None, curr=None, advertised=None, supported=None, peer=None):
+        if port_no != None:
+            self.port_no = port_no
+        else:
+            self.port_no = 0
+        if hw_addr != None:
+            self.hw_addr = hw_addr
+        else:
+            self.hw_addr = [0,0,0,0,0,0]
+        if name != None:
+            self.name = name
+        else:
+            self.name = ""
+        if config != None:
+            self.config = config
+        else:
+            self.config = 0
+        if state != None:
+            self.state = state
+        else:
+            self.state = 0
+        if curr != None:
+            self.curr = curr
+        else:
+            self.curr = 0
+        if advertised != None:
+            self.advertised = advertised
+        else:
+            self.advertised = 0
+        if supported != None:
+            self.supported = supported
+        else:
+            self.supported = 0
+        if peer != None:
+            self.peer = peer
+        else:
+            self.peer = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.port_no))
+        packed.append(struct.pack("!6B", *self.hw_addr))
+        packed.append(struct.pack("!16s", self.name))
+        packed.append(struct.pack("!L", self.config))
+        packed.append(struct.pack("!L", self.state))
+        packed.append(struct.pack("!L", self.curr))
+        packed.append(struct.pack("!L", self.advertised))
+        packed.append(struct.pack("!L", self.supported))
+        packed.append(struct.pack("!L", self.peer))
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 48) # Should be verified by caller
+        obj = port_desc()
+        obj.port_no = struct.unpack_from('!H', buf, 0)[0]
+        obj.hw_addr = list(struct.unpack_from('!6B', buf, 2))
+        obj.name = str(buffer(buf, 8, 16)).rstrip("\x00")
+        obj.config = struct.unpack_from('!L', buf, 24)[0]
+        obj.state = struct.unpack_from('!L', buf, 28)[0]
+        obj.curr = struct.unpack_from('!L', buf, 32)[0]
+        obj.advertised = struct.unpack_from('!L', buf, 36)[0]
+        obj.supported = struct.unpack_from('!L', buf, 40)[0]
+        obj.peer = struct.unpack_from('!L', buf, 44)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.port_no != other.port_no: return False
+        if self.hw_addr != other.hw_addr: return False
+        if self.name != other.name: return False
+        if self.config != other.config: return False
+        if self.state != other.state: return False
+        if self.curr != other.curr: return False
+        if self.advertised != other.advertised: return False
+        if self.supported != other.supported: return False
+        if self.peer != other.peer: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("port_desc {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("port_no = ");
+                q.text(util.pretty_port(self.port_no))
+                q.text(","); q.breakable()
+                q.text("hw_addr = ");
+                q.text(util.pretty_mac(self.hw_addr))
+                q.text(","); q.breakable()
+                q.text("name = ");
+                q.pp(self.name)
+                q.text(","); q.breakable()
+                q.text("config = ");
+                q.text("%#x" % self.config)
+                q.text(","); q.breakable()
+                q.text("state = ");
+                q.text("%#x" % self.state)
+                q.text(","); q.breakable()
+                q.text("curr = ");
+                q.text("%#x" % self.curr)
+                q.text(","); q.breakable()
+                q.text("advertised = ");
+                q.text("%#x" % self.advertised)
+                q.text(","); q.breakable()
+                q.text("supported = ");
+                q.text("%#x" % self.supported)
+                q.text(","); q.breakable()
+                q.text("peer = ");
+                q.text("%#x" % self.peer)
+            q.breakable()
+        q.text('}')
+
+class port_stats_entry(object):
+
+    def __init__(self, port_no=None, pad=None, rx_packets=None, tx_packets=None, rx_bytes=None, tx_bytes=None, rx_dropped=None, tx_dropped=None, rx_errors=None, tx_errors=None, rx_frame_err=None, rx_over_err=None, rx_crc_err=None, collisions=None):
+        if port_no != None:
+            self.port_no = port_no
+        else:
+            self.port_no = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0]
+        if rx_packets != None:
+            self.rx_packets = rx_packets
+        else:
+            self.rx_packets = 0
+        if tx_packets != None:
+            self.tx_packets = tx_packets
+        else:
+            self.tx_packets = 0
+        if rx_bytes != None:
+            self.rx_bytes = rx_bytes
+        else:
+            self.rx_bytes = 0
+        if tx_bytes != None:
+            self.tx_bytes = tx_bytes
+        else:
+            self.tx_bytes = 0
+        if rx_dropped != None:
+            self.rx_dropped = rx_dropped
+        else:
+            self.rx_dropped = 0
+        if tx_dropped != None:
+            self.tx_dropped = tx_dropped
+        else:
+            self.tx_dropped = 0
+        if rx_errors != None:
+            self.rx_errors = rx_errors
+        else:
+            self.rx_errors = 0
+        if tx_errors != None:
+            self.tx_errors = tx_errors
+        else:
+            self.tx_errors = 0
+        if rx_frame_err != None:
+            self.rx_frame_err = rx_frame_err
+        else:
+            self.rx_frame_err = 0
+        if rx_over_err != None:
+            self.rx_over_err = rx_over_err
+        else:
+            self.rx_over_err = 0
+        if rx_crc_err != None:
+            self.rx_crc_err = rx_crc_err
+        else:
+            self.rx_crc_err = 0
+        if collisions != None:
+            self.collisions = collisions
+        else:
+            self.collisions = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.port_no))
+        packed.append(struct.pack("!6B", *self.pad))
+        packed.append(struct.pack("!Q", self.rx_packets))
+        packed.append(struct.pack("!Q", self.tx_packets))
+        packed.append(struct.pack("!Q", self.rx_bytes))
+        packed.append(struct.pack("!Q", self.tx_bytes))
+        packed.append(struct.pack("!Q", self.rx_dropped))
+        packed.append(struct.pack("!Q", self.tx_dropped))
+        packed.append(struct.pack("!Q", self.rx_errors))
+        packed.append(struct.pack("!Q", self.tx_errors))
+        packed.append(struct.pack("!Q", self.rx_frame_err))
+        packed.append(struct.pack("!Q", self.rx_over_err))
+        packed.append(struct.pack("!Q", self.rx_crc_err))
+        packed.append(struct.pack("!Q", self.collisions))
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 104) # Should be verified by caller
+        obj = port_stats_entry()
+        obj.port_no = struct.unpack_from('!H', buf, 0)[0]
+        obj.pad = list(struct.unpack_from('!6B', buf, 2))
+        obj.rx_packets = struct.unpack_from('!Q', buf, 8)[0]
+        obj.tx_packets = struct.unpack_from('!Q', buf, 16)[0]
+        obj.rx_bytes = struct.unpack_from('!Q', buf, 24)[0]
+        obj.tx_bytes = struct.unpack_from('!Q', buf, 32)[0]
+        obj.rx_dropped = struct.unpack_from('!Q', buf, 40)[0]
+        obj.tx_dropped = struct.unpack_from('!Q', buf, 48)[0]
+        obj.rx_errors = struct.unpack_from('!Q', buf, 56)[0]
+        obj.tx_errors = struct.unpack_from('!Q', buf, 64)[0]
+        obj.rx_frame_err = struct.unpack_from('!Q', buf, 72)[0]
+        obj.rx_over_err = struct.unpack_from('!Q', buf, 80)[0]
+        obj.rx_crc_err = struct.unpack_from('!Q', buf, 88)[0]
+        obj.collisions = struct.unpack_from('!Q', buf, 96)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.port_no != other.port_no: return False
+        if self.pad != other.pad: return False
+        if self.rx_packets != other.rx_packets: return False
+        if self.tx_packets != other.tx_packets: return False
+        if self.rx_bytes != other.rx_bytes: return False
+        if self.tx_bytes != other.tx_bytes: return False
+        if self.rx_dropped != other.rx_dropped: return False
+        if self.tx_dropped != other.tx_dropped: return False
+        if self.rx_errors != other.rx_errors: return False
+        if self.tx_errors != other.tx_errors: return False
+        if self.rx_frame_err != other.rx_frame_err: return False
+        if self.rx_over_err != other.rx_over_err: return False
+        if self.rx_crc_err != other.rx_crc_err: return False
+        if self.collisions != other.collisions: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("port_stats_entry {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("port_no = ");
+                q.text(util.pretty_port(self.port_no))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("rx_packets = ");
+                q.text("%#x" % self.rx_packets)
+                q.text(","); q.breakable()
+                q.text("tx_packets = ");
+                q.text("%#x" % self.tx_packets)
+                q.text(","); q.breakable()
+                q.text("rx_bytes = ");
+                q.text("%#x" % self.rx_bytes)
+                q.text(","); q.breakable()
+                q.text("tx_bytes = ");
+                q.text("%#x" % self.tx_bytes)
+                q.text(","); q.breakable()
+                q.text("rx_dropped = ");
+                q.text("%#x" % self.rx_dropped)
+                q.text(","); q.breakable()
+                q.text("tx_dropped = ");
+                q.text("%#x" % self.tx_dropped)
+                q.text(","); q.breakable()
+                q.text("rx_errors = ");
+                q.text("%#x" % self.rx_errors)
+                q.text(","); q.breakable()
+                q.text("tx_errors = ");
+                q.text("%#x" % self.tx_errors)
+                q.text(","); q.breakable()
+                q.text("rx_frame_err = ");
+                q.text("%#x" % self.rx_frame_err)
+                q.text(","); q.breakable()
+                q.text("rx_over_err = ");
+                q.text("%#x" % self.rx_over_err)
+                q.text(","); q.breakable()
+                q.text("rx_crc_err = ");
+                q.text("%#x" % self.rx_crc_err)
+                q.text(","); q.breakable()
+                q.text("collisions = ");
+                q.text("%#x" % self.collisions)
+            q.breakable()
+        q.text('}')
+
+class queue_prop_min_rate(object):
+    type = const.OFPQT_MIN_RATE
+
+    def __init__(self, pad=None, rate=None, pad2=None):
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0]
+        if rate != None:
+            self.rate = rate
+        else:
+            self.rate = 0
+        if pad2 != None:
+            self.pad2 = pad2
+        else:
+            self.pad2 = [0,0,0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for len at index 1
+        packed.append(struct.pack("!4B", *self.pad))
+        packed.append(struct.pack("!H", self.rate))
+        packed.append(struct.pack("!6B", *self.pad2))
+        length = sum([len(x) for x in packed])
+        packed[1] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 16) # Should be verified by caller
+        obj = queue_prop_min_rate()
+        type = struct.unpack_from('!H', buf, 0)[0]
+        assert(type == const.OFPQT_MIN_RATE)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("queue_prop_min_rate length is %d, should be 16" % _length)
+        obj.pad = list(struct.unpack_from('!4B', buf, 4))
+        obj.rate = struct.unpack_from('!H', buf, 8)[0]
+        obj.pad2 = list(struct.unpack_from('!6B', buf, 10))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.pad != other.pad: return False
+        if self.rate != other.rate: return False
+        if self.pad2 != other.pad2: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("queue_prop_min_rate {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("rate = ");
+                q.text("%#x" % self.rate)
+                q.text(","); q.breakable()
+                q.text("pad2 = ");
+                q.pp(self.pad2)
+            q.breakable()
+        q.text('}')
+
+class queue_stats_entry(object):
+
+    def __init__(self, port_no=None, pad=None, queue_id=None, tx_bytes=None, tx_packets=None, tx_errors=None):
+        if port_no != None:
+            self.port_no = port_no
+        else:
+            self.port_no = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0]
+        if queue_id != None:
+            self.queue_id = queue_id
+        else:
+            self.queue_id = 0
+        if tx_bytes != None:
+            self.tx_bytes = tx_bytes
+        else:
+            self.tx_bytes = 0
+        if tx_packets != None:
+            self.tx_packets = tx_packets
+        else:
+            self.tx_packets = 0
+        if tx_errors != None:
+            self.tx_errors = tx_errors
+        else:
+            self.tx_errors = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!H", self.port_no))
+        packed.append(struct.pack("!2B", *self.pad))
+        packed.append(struct.pack("!L", self.queue_id))
+        packed.append(struct.pack("!Q", self.tx_bytes))
+        packed.append(struct.pack("!Q", self.tx_packets))
+        packed.append(struct.pack("!Q", self.tx_errors))
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 32) # Should be verified by caller
+        obj = queue_stats_entry()
+        obj.port_no = struct.unpack_from('!H', buf, 0)[0]
+        obj.pad = list(struct.unpack_from('!2B', buf, 2))
+        obj.queue_id = struct.unpack_from('!L', buf, 4)[0]
+        obj.tx_bytes = struct.unpack_from('!Q', buf, 8)[0]
+        obj.tx_packets = struct.unpack_from('!Q', buf, 16)[0]
+        obj.tx_errors = struct.unpack_from('!Q', buf, 24)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.port_no != other.port_no: return False
+        if self.pad != other.pad: return False
+        if self.queue_id != other.queue_id: return False
+        if self.tx_bytes != other.tx_bytes: return False
+        if self.tx_packets != other.tx_packets: return False
+        if self.tx_errors != other.tx_errors: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("queue_stats_entry {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("port_no = ");
+                q.text(util.pretty_port(self.port_no))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("queue_id = ");
+                q.text("%#x" % self.queue_id)
+                q.text(","); q.breakable()
+                q.text("tx_bytes = ");
+                q.text("%#x" % self.tx_bytes)
+                q.text(","); q.breakable()
+                q.text("tx_packets = ");
+                q.text("%#x" % self.tx_packets)
+                q.text(","); q.breakable()
+                q.text("tx_errors = ");
+                q.text("%#x" % self.tx_errors)
+            q.breakable()
+        q.text('}')
+
+class table_stats_entry(object):
+
+    def __init__(self, table_id=None, pad=None, name=None, wildcards=None, max_entries=None, active_count=None, lookup_count=None, matched_count=None):
+        if table_id != None:
+            self.table_id = table_id
+        else:
+            self.table_id = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+        if name != None:
+            self.name = name
+        else:
+            self.name = ""
+        if wildcards != None:
+            self.wildcards = wildcards
+        else:
+            self.wildcards = const.OFPFW_ALL
+        if max_entries != None:
+            self.max_entries = max_entries
+        else:
+            self.max_entries = 0
+        if active_count != None:
+            self.active_count = active_count
+        else:
+            self.active_count = 0
+        if lookup_count != None:
+            self.lookup_count = lookup_count
+        else:
+            self.lookup_count = 0
+        if matched_count != None:
+            self.matched_count = matched_count
+        else:
+            self.matched_count = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.table_id))
+        packed.append(struct.pack("!3B", *self.pad))
+        packed.append(struct.pack("!32s", self.name))
+        packed.append(struct.pack("!L", self.wildcards))
+        packed.append(struct.pack("!L", self.max_entries))
+        packed.append(struct.pack("!L", self.active_count))
+        packed.append(struct.pack("!Q", self.lookup_count))
+        packed.append(struct.pack("!Q", self.matched_count))
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        assert(len(buf) >= 64) # Should be verified by caller
+        obj = table_stats_entry()
+        obj.table_id = struct.unpack_from('!B', buf, 0)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 1))
+        obj.name = str(buffer(buf, 4, 32)).rstrip("\x00")
+        obj.wildcards = struct.unpack_from('!L', buf, 36)[0]
+        obj.max_entries = struct.unpack_from('!L', buf, 40)[0]
+        obj.active_count = struct.unpack_from('!L', buf, 44)[0]
+        obj.lookup_count = struct.unpack_from('!Q', buf, 48)[0]
+        obj.matched_count = struct.unpack_from('!Q', buf, 56)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.table_id != other.table_id: return False
+        if self.pad != other.pad: return False
+        if self.name != other.name: return False
+        if self.wildcards != other.wildcards: return False
+        if self.max_entries != other.max_entries: return False
+        if self.active_count != other.active_count: return False
+        if self.lookup_count != other.lookup_count: return False
+        if self.matched_count != other.matched_count: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("table_stats_entry {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("table_id = ");
+                q.text("%#x" % self.table_id)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("name = ");
+                q.pp(self.name)
+                q.text(","); q.breakable()
+                q.text("wildcards = ");
+                q.text(util.pretty_wildcards(self.wildcards))
+                q.text(","); q.breakable()
+                q.text("max_entries = ");
+                q.text("%#x" % self.max_entries)
+                q.text(","); q.breakable()
+                q.text("active_count = ");
+                q.text("%#x" % self.active_count)
+                q.text(","); q.breakable()
+                q.text("lookup_count = ");
+                q.text("%#x" % self.lookup_count)
+                q.text(","); q.breakable()
+                q.text("matched_count = ");
+                q.text("%#x" % self.matched_count)
+            q.breakable()
+        q.text('}')
+
diff --git a/src/python/loxi/of10/const.py b/src/python/loxi/of10/const.py
new file mode 100644
index 0000000..e269071
--- /dev/null
+++ b/src/python/loxi/of10/const.py
@@ -0,0 +1,476 @@
+#
+# Copyright 2012, 2013, Big Switch Networks, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Automatically generated by LOXI from template const.py
+# Do not modify
+
+OFP_VERSION = 1
+
+# Identifiers from group macro_definitions
+OFP_FLOW_PERMANENT = 0
+OFP_ETH_ALEN = 6
+OFP_MAX_PORT_NAME_LEN = 16
+OFP_MAX_TABLE_NAME_LEN = 32
+SERIAL_NUM_LEN = 32
+OFPFW_ICMP_TYPE = (1 << 6)
+OFPFW_ICMP_CODE = (1 << 7)
+OFP_DEFAULT_MISS_SEND_LEN = 128
+DESC_STR_LEN = 256
+OFP_DL_TYPE_NOT_ETH_TYPE = 0x05ff
+OFP_DL_TYPE_ETH2_CUTOFF = 0x0600
+OFP_TCP_PORT = 6633
+OFP_SSL_PORT = 6633
+OFP_DEFAULT_PRIORITY = 0x8000
+OFPQ_MIN_RATE_UNCFG = 0xffff
+OFP_VLAN_NONE = 0xffff
+OFPQ_ALL = 0xffffffff
+
+# Identifiers from group ofp_action_type
+OFPAT_OUTPUT = 0
+OFPAT_SET_VLAN_VID = 1
+OFPAT_SET_VLAN_PCP = 2
+OFPAT_STRIP_VLAN = 3
+OFPAT_SET_DL_SRC = 4
+OFPAT_SET_DL_DST = 5
+OFPAT_SET_NW_SRC = 6
+OFPAT_SET_NW_DST = 7
+OFPAT_SET_NW_TOS = 8
+OFPAT_SET_TP_SRC = 9
+OFPAT_SET_TP_DST = 10
+OFPAT_ENQUEUE = 11
+OFPAT_VENDOR = 0xffff
+
+ofp_action_type_map = {
+    0: 'OFPAT_OUTPUT',
+    1: 'OFPAT_SET_VLAN_VID',
+    2: 'OFPAT_SET_VLAN_PCP',
+    3: 'OFPAT_STRIP_VLAN',
+    4: 'OFPAT_SET_DL_SRC',
+    5: 'OFPAT_SET_DL_DST',
+    6: 'OFPAT_SET_NW_SRC',
+    7: 'OFPAT_SET_NW_DST',
+    8: 'OFPAT_SET_NW_TOS',
+    9: 'OFPAT_SET_TP_SRC',
+    10: 'OFPAT_SET_TP_DST',
+    11: 'OFPAT_ENQUEUE',
+    0xffff: 'OFPAT_VENDOR',
+}
+
+# Identifiers from group ofp_bad_action_code
+OFPBAC_BAD_TYPE = 0
+OFPBAC_BAD_LEN = 1
+OFPBAC_BAD_VENDOR = 2
+OFPBAC_BAD_VENDOR_TYPE = 3
+OFPBAC_BAD_OUT_PORT = 4
+OFPBAC_BAD_ARGUMENT = 5
+OFPBAC_EPERM = 6
+OFPBAC_TOO_MANY = 7
+OFPBAC_BAD_QUEUE = 8
+
+ofp_bad_action_code_map = {
+    0: 'OFPBAC_BAD_TYPE',
+    1: 'OFPBAC_BAD_LEN',
+    2: 'OFPBAC_BAD_VENDOR',
+    3: 'OFPBAC_BAD_VENDOR_TYPE',
+    4: 'OFPBAC_BAD_OUT_PORT',
+    5: 'OFPBAC_BAD_ARGUMENT',
+    6: 'OFPBAC_EPERM',
+    7: 'OFPBAC_TOO_MANY',
+    8: 'OFPBAC_BAD_QUEUE',
+}
+
+# Identifiers from group ofp_bad_request_code
+OFPBRC_BAD_VERSION = 0
+OFPBRC_BAD_TYPE = 1
+OFPBRC_BAD_STAT = 2
+OFPBRC_BAD_VENDOR = 3
+OFPBRC_BAD_SUBTYPE = 4
+OFPBRC_EPERM = 5
+OFPBRC_BAD_LEN = 6
+OFPBRC_BUFFER_EMPTY = 7
+OFPBRC_BUFFER_UNKNOWN = 8
+
+ofp_bad_request_code_map = {
+    0: 'OFPBRC_BAD_VERSION',
+    1: 'OFPBRC_BAD_TYPE',
+    2: 'OFPBRC_BAD_STAT',
+    3: 'OFPBRC_BAD_VENDOR',
+    4: 'OFPBRC_BAD_SUBTYPE',
+    5: 'OFPBRC_EPERM',
+    6: 'OFPBRC_BAD_LEN',
+    7: 'OFPBRC_BUFFER_EMPTY',
+    8: 'OFPBRC_BUFFER_UNKNOWN',
+}
+
+# Identifiers from group ofp_capabilities
+OFPC_FLOW_STATS = 1 << 0
+OFPC_TABLE_STATS = 1 << 1
+OFPC_PORT_STATS = 1 << 2
+OFPC_STP = 1 << 3
+OFPC_RESERVED = 1 << 4
+OFPC_IP_REASM = 1 << 5
+OFPC_QUEUE_STATS = 1 << 6
+OFPC_ARP_MATCH_IP = 1 << 7
+
+ofp_capabilities_map = {
+    1 << 0: 'OFPC_FLOW_STATS',
+    1 << 1: 'OFPC_TABLE_STATS',
+    1 << 2: 'OFPC_PORT_STATS',
+    1 << 3: 'OFPC_STP',
+    1 << 4: 'OFPC_RESERVED',
+    1 << 5: 'OFPC_IP_REASM',
+    1 << 6: 'OFPC_QUEUE_STATS',
+    1 << 7: 'OFPC_ARP_MATCH_IP',
+}
+
+# Identifiers from group ofp_config_flags
+OFPC_FRAG_NORMAL = 0
+OFPC_FRAG_DROP = 1
+OFPC_FRAG_REASM = 2
+OFPC_FRAG_MASK = 3
+
+ofp_config_flags_map = {
+    0: 'OFPC_FRAG_NORMAL',
+    1: 'OFPC_FRAG_DROP',
+    2: 'OFPC_FRAG_REASM',
+    3: 'OFPC_FRAG_MASK',
+}
+
+# Identifiers from group ofp_error_type
+OFPET_HELLO_FAILED = 0
+OFPET_BAD_REQUEST = 1
+OFPET_BAD_ACTION = 2
+OFPET_FLOW_MOD_FAILED = 3
+OFPET_PORT_MOD_FAILED = 4
+OFPET_QUEUE_OP_FAILED = 5
+
+ofp_error_type_map = {
+    0: 'OFPET_HELLO_FAILED',
+    1: 'OFPET_BAD_REQUEST',
+    2: 'OFPET_BAD_ACTION',
+    3: 'OFPET_FLOW_MOD_FAILED',
+    4: 'OFPET_PORT_MOD_FAILED',
+    5: 'OFPET_QUEUE_OP_FAILED',
+}
+
+# Identifiers from group ofp_flow_mod_command
+OFPFC_ADD = 0
+OFPFC_MODIFY = 1
+OFPFC_MODIFY_STRICT = 2
+OFPFC_DELETE = 3
+OFPFC_DELETE_STRICT = 4
+
+ofp_flow_mod_command_map = {
+    0: 'OFPFC_ADD',
+    1: 'OFPFC_MODIFY',
+    2: 'OFPFC_MODIFY_STRICT',
+    3: 'OFPFC_DELETE',
+    4: 'OFPFC_DELETE_STRICT',
+}
+
+# Identifiers from group ofp_flow_mod_failed_code
+OFPFMFC_ALL_TABLES_FULL = 0
+OFPFMFC_OVERLAP = 1
+OFPFMFC_EPERM = 2
+OFPFMFC_BAD_EMERG_TIMEOUT = 3
+OFPFMFC_BAD_COMMAND = 4
+OFPFMFC_UNSUPPORTED = 5
+
+ofp_flow_mod_failed_code_map = {
+    0: 'OFPFMFC_ALL_TABLES_FULL',
+    1: 'OFPFMFC_OVERLAP',
+    2: 'OFPFMFC_EPERM',
+    3: 'OFPFMFC_BAD_EMERG_TIMEOUT',
+    4: 'OFPFMFC_BAD_COMMAND',
+    5: 'OFPFMFC_UNSUPPORTED',
+}
+
+# Identifiers from group ofp_flow_mod_flags
+OFPFF_SEND_FLOW_REM = 1 << 0
+OFPFF_CHECK_OVERLAP = 1 << 1
+OFPFF_EMERG = 1 << 2
+
+ofp_flow_mod_flags_map = {
+    1 << 0: 'OFPFF_SEND_FLOW_REM',
+    1 << 1: 'OFPFF_CHECK_OVERLAP',
+    1 << 2: 'OFPFF_EMERG',
+}
+
+# Identifiers from group ofp_flow_removed_reason
+OFPRR_IDLE_TIMEOUT = 0
+OFPRR_HARD_TIMEOUT = 1
+OFPRR_DELETE = 2
+
+ofp_flow_removed_reason_map = {
+    0: 'OFPRR_IDLE_TIMEOUT',
+    1: 'OFPRR_HARD_TIMEOUT',
+    2: 'OFPRR_DELETE',
+}
+
+# Identifiers from group ofp_flow_wildcards
+OFPFW_IN_PORT = 1 << 0
+OFPFW_DL_VLAN = 1 << 1
+OFPFW_DL_SRC = 1 << 2
+OFPFW_NW_DST_BITS = 6
+OFPFW_NW_SRC_BITS = 6
+OFPFW_NW_SRC_SHIFT = 8
+OFPFW_DL_DST = 1 << 3
+OFPFW_NW_DST_SHIFT = 14
+OFPFW_DL_TYPE = 1 << 4
+OFPFW_NW_PROTO = 1 << 5
+OFPFW_TP_SRC = 1 << 6
+OFPFW_TP_DST = 1 << 7
+OFPFW_NW_SRC_ALL = 32 << (8)
+OFPFW_NW_SRC_MASK = ((1 << (6)) - 1) << (8)
+OFPFW_NW_DST_ALL = 32 << (14)
+OFPFW_NW_DST_MASK = ((1 << (6)) - 1) << (14)
+OFPFW_DL_VLAN_PCP = 1 << 20
+OFPFW_NW_TOS = 1 << 21
+OFPFW_ALL = ((1 << 22) - 1)
+
+ofp_flow_wildcards_map = {
+    1 << 0: 'OFPFW_IN_PORT',
+    1 << 1: 'OFPFW_DL_VLAN',
+    1 << 2: 'OFPFW_DL_SRC',
+    1 << 3: 'OFPFW_DL_DST',
+    1 << 4: 'OFPFW_DL_TYPE',
+    1 << 5: 'OFPFW_NW_PROTO',
+    1 << 6: 'OFPFW_TP_SRC',
+    1 << 7: 'OFPFW_TP_DST',
+    1 << 20: 'OFPFW_DL_VLAN_PCP',
+    1 << 21: 'OFPFW_NW_TOS',
+}
+
+# Identifiers from group ofp_hello_failed_code
+OFPHFC_INCOMPATIBLE = 0
+OFPHFC_EPERM = 1
+
+ofp_hello_failed_code_map = {
+    0: 'OFPHFC_INCOMPATIBLE',
+    1: 'OFPHFC_EPERM',
+}
+
+# Identifiers from group ofp_packet_in_reason
+OFPR_NO_MATCH = 0
+OFPR_ACTION = 1
+
+ofp_packet_in_reason_map = {
+    0: 'OFPR_NO_MATCH',
+    1: 'OFPR_ACTION',
+}
+
+# Identifiers from group ofp_port
+OFPP_MAX = 0xff00
+OFPP_IN_PORT = 0xfff8
+OFPP_TABLE = 0xfff9
+OFPP_NORMAL = 0xfffa
+OFPP_FLOOD = 0xfffb
+OFPP_ALL = 0xfffc
+OFPP_CONTROLLER = 0xfffd
+OFPP_LOCAL = 0xfffe
+OFPP_NONE = 0xffff
+
+ofp_port_map = {
+    0xff00: 'OFPP_MAX',
+    0xfff8: 'OFPP_IN_PORT',
+    0xfff9: 'OFPP_TABLE',
+    0xfffa: 'OFPP_NORMAL',
+    0xfffb: 'OFPP_FLOOD',
+    0xfffc: 'OFPP_ALL',
+    0xfffd: 'OFPP_CONTROLLER',
+    0xfffe: 'OFPP_LOCAL',
+    0xffff: 'OFPP_NONE',
+}
+
+# Identifiers from group ofp_port_config
+OFPPC_PORT_DOWN = 1 << 0
+OFPPC_NO_STP = 1 << 1
+OFPPC_NO_RECV = 1 << 2
+OFPPC_NO_RECV_STP = 1 << 3
+OFPPC_NO_FLOOD = 1 << 4
+OFPPC_NO_FWD = 1 << 5
+OFPPC_NO_PACKET_IN = 1 << 6
+
+ofp_port_config_map = {
+    1 << 0: 'OFPPC_PORT_DOWN',
+    1 << 1: 'OFPPC_NO_STP',
+    1 << 2: 'OFPPC_NO_RECV',
+    1 << 3: 'OFPPC_NO_RECV_STP',
+    1 << 4: 'OFPPC_NO_FLOOD',
+    1 << 5: 'OFPPC_NO_FWD',
+    1 << 6: 'OFPPC_NO_PACKET_IN',
+}
+
+# Identifiers from group ofp_port_features
+OFPPF_10MB_HD = 1 << 0
+OFPPF_10MB_FD = 1 << 1
+OFPPF_100MB_HD = 1 << 2
+OFPPF_100MB_FD = 1 << 3
+OFPPF_1GB_HD = 1 << 4
+OFPPF_1GB_FD = 1 << 5
+OFPPF_10GB_FD = 1 << 6
+OFPPF_COPPER = 1 << 7
+OFPPF_FIBER = 1 << 8
+OFPPF_AUTONEG = 1 << 9
+OFPPF_PAUSE = 1 << 10
+OFPPF_PAUSE_ASYM = 1 << 11
+
+ofp_port_features_map = {
+    1 << 0: 'OFPPF_10MB_HD',
+    1 << 1: 'OFPPF_10MB_FD',
+    1 << 2: 'OFPPF_100MB_HD',
+    1 << 3: 'OFPPF_100MB_FD',
+    1 << 4: 'OFPPF_1GB_HD',
+    1 << 5: 'OFPPF_1GB_FD',
+    1 << 6: 'OFPPF_10GB_FD',
+    1 << 7: 'OFPPF_COPPER',
+    1 << 8: 'OFPPF_FIBER',
+    1 << 9: 'OFPPF_AUTONEG',
+    1 << 10: 'OFPPF_PAUSE',
+    1 << 11: 'OFPPF_PAUSE_ASYM',
+}
+
+# Identifiers from group ofp_port_mod_failed_code
+OFPPMFC_BAD_PORT = 0
+OFPPMFC_BAD_HW_ADDR = 1
+
+ofp_port_mod_failed_code_map = {
+    0: 'OFPPMFC_BAD_PORT',
+    1: 'OFPPMFC_BAD_HW_ADDR',
+}
+
+# Identifiers from group ofp_port_reason
+OFPPR_ADD = 0
+OFPPR_DELETE = 1
+OFPPR_MODIFY = 2
+
+ofp_port_reason_map = {
+    0: 'OFPPR_ADD',
+    1: 'OFPPR_DELETE',
+    2: 'OFPPR_MODIFY',
+}
+
+# Identifiers from group ofp_port_state
+OFPPS_STP_LISTEN = 0 << 8
+OFPPS_LINK_DOWN = 1 << 0
+OFPPS_STP_LEARN = 1 << 8
+OFPPS_STP_FORWARD = 2 << 8
+OFPPS_STP_BLOCK = 3 << 8
+OFPPS_STP_MASK = 3 << 8
+
+ofp_port_state_map = {
+    0 << 8: 'OFPPS_STP_LISTEN',
+    1 << 0: 'OFPPS_LINK_DOWN',
+    1 << 8: 'OFPPS_STP_LEARN',
+    2 << 8: 'OFPPS_STP_FORWARD',
+    3 << 8: 'OFPPS_STP_BLOCK',
+    3 << 8: 'OFPPS_STP_MASK',
+}
+
+# Identifiers from group ofp_queue_op_failed_code
+OFPQOFC_BAD_PORT = 0
+OFPQOFC_BAD_QUEUE = 1
+OFPQOFC_EPERM = 2
+
+ofp_queue_op_failed_code_map = {
+    0: 'OFPQOFC_BAD_PORT',
+    1: 'OFPQOFC_BAD_QUEUE',
+    2: 'OFPQOFC_EPERM',
+}
+
+# Identifiers from group ofp_queue_properties
+OFPQT_NONE = 0
+OFPQT_MIN_RATE = 1
+
+ofp_queue_properties_map = {
+    0: 'OFPQT_NONE',
+    1: 'OFPQT_MIN_RATE',
+}
+
+# Identifiers from group ofp_stats_reply_flags
+OFPSF_REPLY_MORE = 1 << 0
+
+ofp_stats_reply_flags_map = {
+    1 << 0: 'OFPSF_REPLY_MORE',
+}
+
+# Identifiers from group ofp_stats_types
+OFPST_DESC = 0
+OFPST_FLOW = 1
+OFPST_AGGREGATE = 2
+OFPST_TABLE = 3
+OFPST_PORT = 4
+OFPST_QUEUE = 5
+OFPST_VENDOR = 0xffff
+
+ofp_stats_types_map = {
+    0: 'OFPST_DESC',
+    1: 'OFPST_FLOW',
+    2: 'OFPST_AGGREGATE',
+    3: 'OFPST_TABLE',
+    4: 'OFPST_PORT',
+    5: 'OFPST_QUEUE',
+    0xffff: 'OFPST_VENDOR',
+}
+
+# Identifiers from group ofp_type
+OFPT_HELLO = 0
+OFPT_ERROR = 1
+OFPT_ECHO_REQUEST = 2
+OFPT_ECHO_REPLY = 3
+OFPT_VENDOR = 4
+OFPT_FEATURES_REQUEST = 5
+OFPT_FEATURES_REPLY = 6
+OFPT_GET_CONFIG_REQUEST = 7
+OFPT_GET_CONFIG_REPLY = 8
+OFPT_SET_CONFIG = 9
+OFPT_PACKET_IN = 10
+OFPT_FLOW_REMOVED = 11
+OFPT_PORT_STATUS = 12
+OFPT_PACKET_OUT = 13
+OFPT_FLOW_MOD = 14
+OFPT_PORT_MOD = 15
+OFPT_STATS_REQUEST = 16
+OFPT_STATS_REPLY = 17
+OFPT_BARRIER_REQUEST = 18
+OFPT_BARRIER_REPLY = 19
+OFPT_QUEUE_GET_CONFIG_REQUEST = 20
+OFPT_QUEUE_GET_CONFIG_REPLY = 21
+
+ofp_type_map = {
+    0: 'OFPT_HELLO',
+    1: 'OFPT_ERROR',
+    2: 'OFPT_ECHO_REQUEST',
+    3: 'OFPT_ECHO_REPLY',
+    4: 'OFPT_VENDOR',
+    5: 'OFPT_FEATURES_REQUEST',
+    6: 'OFPT_FEATURES_REPLY',
+    7: 'OFPT_GET_CONFIG_REQUEST',
+    8: 'OFPT_GET_CONFIG_REPLY',
+    9: 'OFPT_SET_CONFIG',
+    10: 'OFPT_PACKET_IN',
+    11: 'OFPT_FLOW_REMOVED',
+    12: 'OFPT_PORT_STATUS',
+    13: 'OFPT_PACKET_OUT',
+    14: 'OFPT_FLOW_MOD',
+    15: 'OFPT_PORT_MOD',
+    16: 'OFPT_STATS_REQUEST',
+    17: 'OFPT_STATS_REPLY',
+    18: 'OFPT_BARRIER_REQUEST',
+    19: 'OFPT_BARRIER_REPLY',
+    20: 'OFPT_QUEUE_GET_CONFIG_REQUEST',
+    21: 'OFPT_QUEUE_GET_CONFIG_REPLY',
+}
+
diff --git a/src/python/loxi/of10/message.py b/src/python/loxi/of10/message.py
new file mode 100644
index 0000000..d80dac3
--- /dev/null
+++ b/src/python/loxi/of10/message.py
@@ -0,0 +1,5098 @@
+#
+# Copyright 2012, 2013, Big Switch Networks, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Automatically generated by LOXI from template message.py
+# Do not modify
+
+import struct
+import loxi
+import const
+import common
+import action # for unpack_list
+import util
+
+class Message(object):
+    version = const.OFP_VERSION
+    type = None # override in subclass
+    xid = None
+
+class aggregate_stats_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REPLY
+    stats_type = const.OFPST_AGGREGATE
+
+    def __init__(self, xid=None, flags=None, packet_count=None, byte_count=None, flow_count=None, pad=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if packet_count != None:
+            self.packet_count = packet_count
+        else:
+            self.packet_count = 0
+        if byte_count != None:
+            self.byte_count = byte_count
+        else:
+            self.byte_count = 0
+        if flow_count != None:
+            self.flow_count = flow_count
+        else:
+            self.flow_count = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!Q", self.packet_count))
+        packed.append(struct.pack("!Q", self.byte_count))
+        packed.append(struct.pack("!L", self.flow_count))
+        packed.append(struct.pack("!4B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = aggregate_stats_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 36: raise loxi.ProtocolError("aggregate_stats_reply length is %d, should be 36" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_AGGREGATE)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.packet_count = struct.unpack_from('!Q', buf, 12)[0]
+        obj.byte_count = struct.unpack_from('!Q', buf, 20)[0]
+        obj.flow_count = struct.unpack_from('!L', buf, 28)[0]
+        obj.pad = list(struct.unpack_from('!4B', buf, 32))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.packet_count != other.packet_count: return False
+        if self.byte_count != other.byte_count: return False
+        if self.flow_count != other.flow_count: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("aggregate_stats_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("packet_count = ");
+                q.text("%#x" % self.packet_count)
+                q.text(","); q.breakable()
+                q.text("byte_count = ");
+                q.text("%#x" % self.byte_count)
+                q.text(","); q.breakable()
+                q.text("flow_count = ");
+                q.text("%#x" % self.flow_count)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class aggregate_stats_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REQUEST
+    stats_type = const.OFPST_AGGREGATE
+
+    def __init__(self, xid=None, flags=None, match=None, table_id=None, pad=None, out_port=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if table_id != None:
+            self.table_id = table_id
+        else:
+            self.table_id = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = 0
+        if out_port != None:
+            self.out_port = out_port
+        else:
+            self.out_port = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!B", self.table_id))
+        packed.append(struct.pack("!B", self.pad))
+        packed.append(struct.pack("!H", self.out_port))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = aggregate_stats_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 56: raise loxi.ProtocolError("aggregate_stats_request length is %d, should be 56" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_AGGREGATE)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.match = common.match.unpack(buffer(buf, 12))
+        obj.table_id = struct.unpack_from('!B', buf, 52)[0]
+        obj.pad = struct.unpack_from('!B', buf, 53)[0]
+        obj.out_port = struct.unpack_from('!H', buf, 54)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.match != other.match: return False
+        if self.table_id != other.table_id: return False
+        if self.pad != other.pad: return False
+        if self.out_port != other.out_port: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("aggregate_stats_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("table_id = ");
+                q.text("%#x" % self.table_id)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.text("%#x" % self.pad)
+                q.text(","); q.breakable()
+                q.text("out_port = ");
+                q.text(util.pretty_port(self.out_port))
+            q.breakable()
+        q.text('}')
+
+class barrier_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_BARRIER_REPLY
+
+    def __init__(self, xid=None):
+        self.xid = xid
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = barrier_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_BARRIER_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("barrier_reply length is %d, should be 8" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("barrier_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+            q.breakable()
+        q.text('}')
+
+class barrier_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_BARRIER_REQUEST
+
+    def __init__(self, xid=None):
+        self.xid = xid
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = barrier_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_BARRIER_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("barrier_request length is %d, should be 8" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("barrier_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+            q.breakable()
+        q.text('}')
+
+class bsn_get_interfaces_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 10
+
+    def __init__(self, xid=None, interfaces=None):
+        self.xid = xid
+        if interfaces != None:
+            self.interfaces = interfaces
+        else:
+            self.interfaces = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append("".join([x.pack() for x in self.interfaces]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_get_interfaces_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 16: raise loxi.ProtocolError("bsn_get_interfaces_reply length is %d, should be at least 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 10)
+        obj.interfaces = util.unpack_array(common.bsn_interface.unpack, 32, buffer(buf, 16))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.interfaces != other.interfaces: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_get_interfaces_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("interfaces = ");
+                q.pp(self.interfaces)
+            q.breakable()
+        q.text('}')
+
+class bsn_get_interfaces_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 9
+
+    def __init__(self, xid=None):
+        self.xid = xid
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_get_interfaces_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("bsn_get_interfaces_request length is %d, should be 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 9)
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_get_interfaces_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+            q.breakable()
+        q.text('}')
+
+class bsn_get_ip_mask_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 2
+
+    def __init__(self, xid=None, index=None, pad=None, mask=None):
+        self.xid = xid
+        if index != None:
+            self.index = index
+        else:
+            self.index = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+        if mask != None:
+            self.mask = mask
+        else:
+            self.mask = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!B", self.index))
+        packed.append(struct.pack("!3B", *self.pad))
+        packed.append(struct.pack("!L", self.mask))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_get_ip_mask_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 24: raise loxi.ProtocolError("bsn_get_ip_mask_reply length is %d, should be 24" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 2)
+        obj.index = struct.unpack_from('!B', buf, 16)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 17))
+        obj.mask = struct.unpack_from('!L', buf, 20)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.index != other.index: return False
+        if self.pad != other.pad: return False
+        if self.mask != other.mask: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_get_ip_mask_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("index = ");
+                q.text("%#x" % self.index)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("mask = ");
+                q.text("%#x" % self.mask)
+            q.breakable()
+        q.text('}')
+
+class bsn_get_ip_mask_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 1
+
+    def __init__(self, xid=None, index=None, pad=None):
+        self.xid = xid
+        if index != None:
+            self.index = index
+        else:
+            self.index = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!B", self.index))
+        packed.append(struct.pack("!7B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_get_ip_mask_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 24: raise loxi.ProtocolError("bsn_get_ip_mask_request length is %d, should be 24" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 1)
+        obj.index = struct.unpack_from('!B', buf, 16)[0]
+        obj.pad = list(struct.unpack_from('!7B', buf, 17))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.index != other.index: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_get_ip_mask_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("index = ");
+                q.text("%#x" % self.index)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class bsn_get_mirroring_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 5
+
+    def __init__(self, xid=None, report_mirror_ports=None, pad=None):
+        self.xid = xid
+        if report_mirror_ports != None:
+            self.report_mirror_ports = report_mirror_ports
+        else:
+            self.report_mirror_ports = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!B", self.report_mirror_ports))
+        packed.append(struct.pack("!3B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_get_mirroring_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("bsn_get_mirroring_reply length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 5)
+        obj.report_mirror_ports = struct.unpack_from('!B', buf, 16)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 17))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.report_mirror_ports != other.report_mirror_ports: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_get_mirroring_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("report_mirror_ports = ");
+                q.text("%#x" % self.report_mirror_ports)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class bsn_get_mirroring_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 4
+
+    def __init__(self, xid=None, report_mirror_ports=None, pad=None):
+        self.xid = xid
+        if report_mirror_ports != None:
+            self.report_mirror_ports = report_mirror_ports
+        else:
+            self.report_mirror_ports = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!B", self.report_mirror_ports))
+        packed.append(struct.pack("!3B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_get_mirroring_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("bsn_get_mirroring_request length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 4)
+        obj.report_mirror_ports = struct.unpack_from('!B', buf, 16)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 17))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.report_mirror_ports != other.report_mirror_ports: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_get_mirroring_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("report_mirror_ports = ");
+                q.text("%#x" % self.report_mirror_ports)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class bsn_set_ip_mask(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 0
+
+    def __init__(self, xid=None, index=None, pad=None, mask=None):
+        self.xid = xid
+        if index != None:
+            self.index = index
+        else:
+            self.index = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+        if mask != None:
+            self.mask = mask
+        else:
+            self.mask = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!B", self.index))
+        packed.append(struct.pack("!3B", *self.pad))
+        packed.append(struct.pack("!L", self.mask))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_set_ip_mask()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 24: raise loxi.ProtocolError("bsn_set_ip_mask length is %d, should be 24" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 0)
+        obj.index = struct.unpack_from('!B', buf, 16)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 17))
+        obj.mask = struct.unpack_from('!L', buf, 20)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.index != other.index: return False
+        if self.pad != other.pad: return False
+        if self.mask != other.mask: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_set_ip_mask {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("index = ");
+                q.text("%#x" % self.index)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("mask = ");
+                q.text("%#x" % self.mask)
+            q.breakable()
+        q.text('}')
+
+class bsn_set_mirroring(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 3
+
+    def __init__(self, xid=None, report_mirror_ports=None, pad=None):
+        self.xid = xid
+        if report_mirror_ports != None:
+            self.report_mirror_ports = report_mirror_ports
+        else:
+            self.report_mirror_ports = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!B", self.report_mirror_ports))
+        packed.append(struct.pack("!3B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_set_mirroring()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("bsn_set_mirroring length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 3)
+        obj.report_mirror_ports = struct.unpack_from('!B', buf, 16)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 17))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.report_mirror_ports != other.report_mirror_ports: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_set_mirroring {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("report_mirror_ports = ");
+                q.text("%#x" % self.report_mirror_ports)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class bsn_shell_command(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 6
+
+    def __init__(self, xid=None, service=None, data=None):
+        self.xid = xid
+        if service != None:
+            self.service = service
+        else:
+            self.service = 0
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!L", self.service))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_shell_command()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 20: raise loxi.ProtocolError("bsn_shell_command length is %d, should be at least 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 6)
+        obj.service = struct.unpack_from('!L', buf, 16)[0]
+        obj.data = buf[20:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.service != other.service: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_shell_command {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("service = ");
+                q.text("%#x" % self.service)
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class bsn_shell_output(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 7
+
+    def __init__(self, xid=None, data=None):
+        self.xid = xid
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_shell_output()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 16: raise loxi.ProtocolError("bsn_shell_output length is %d, should be at least 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 7)
+        obj.data = buf[16:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_shell_output {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class bsn_shell_status(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x5c16c7
+    subtype = 8
+
+    def __init__(self, xid=None, status=None):
+        self.xid = xid
+        if status != None:
+            self.status = status
+        else:
+            self.status = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!L", self.status))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = bsn_shell_status()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("bsn_shell_status length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x5c16c7)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 8)
+        obj.status = struct.unpack_from('!L', buf, 16)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.status != other.status: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("bsn_shell_status {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("status = ");
+                q.text("%#x" % self.status)
+            q.breakable()
+        q.text('}')
+
+class desc_stats_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REPLY
+    stats_type = const.OFPST_DESC
+
+    def __init__(self, xid=None, flags=None, mfr_desc=None, hw_desc=None, sw_desc=None, serial_num=None, dp_desc=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if mfr_desc != None:
+            self.mfr_desc = mfr_desc
+        else:
+            self.mfr_desc = ""
+        if hw_desc != None:
+            self.hw_desc = hw_desc
+        else:
+            self.hw_desc = ""
+        if sw_desc != None:
+            self.sw_desc = sw_desc
+        else:
+            self.sw_desc = ""
+        if serial_num != None:
+            self.serial_num = serial_num
+        else:
+            self.serial_num = ""
+        if dp_desc != None:
+            self.dp_desc = dp_desc
+        else:
+            self.dp_desc = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!256s", self.mfr_desc))
+        packed.append(struct.pack("!256s", self.hw_desc))
+        packed.append(struct.pack("!256s", self.sw_desc))
+        packed.append(struct.pack("!32s", self.serial_num))
+        packed.append(struct.pack("!256s", self.dp_desc))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = desc_stats_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 1068: raise loxi.ProtocolError("desc_stats_reply length is %d, should be 1068" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_DESC)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.mfr_desc = str(buffer(buf, 12, 256)).rstrip("\x00")
+        obj.hw_desc = str(buffer(buf, 268, 256)).rstrip("\x00")
+        obj.sw_desc = str(buffer(buf, 524, 256)).rstrip("\x00")
+        obj.serial_num = str(buffer(buf, 780, 32)).rstrip("\x00")
+        obj.dp_desc = str(buffer(buf, 812, 256)).rstrip("\x00")
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.mfr_desc != other.mfr_desc: return False
+        if self.hw_desc != other.hw_desc: return False
+        if self.sw_desc != other.sw_desc: return False
+        if self.serial_num != other.serial_num: return False
+        if self.dp_desc != other.dp_desc: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("desc_stats_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("mfr_desc = ");
+                q.pp(self.mfr_desc)
+                q.text(","); q.breakable()
+                q.text("hw_desc = ");
+                q.pp(self.hw_desc)
+                q.text(","); q.breakable()
+                q.text("sw_desc = ");
+                q.pp(self.sw_desc)
+                q.text(","); q.breakable()
+                q.text("serial_num = ");
+                q.pp(self.serial_num)
+                q.text(","); q.breakable()
+                q.text("dp_desc = ");
+                q.pp(self.dp_desc)
+            q.breakable()
+        q.text('}')
+
+class desc_stats_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REQUEST
+    stats_type = const.OFPST_DESC
+
+    def __init__(self, xid=None, flags=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = desc_stats_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 12: raise loxi.ProtocolError("desc_stats_request length is %d, should be 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_DESC)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("desc_stats_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+            q.breakable()
+        q.text('}')
+
+class echo_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_ECHO_REPLY
+
+    def __init__(self, xid=None, data=None):
+        self.xid = xid
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = echo_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_ECHO_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 8: raise loxi.ProtocolError("echo_reply length is %d, should be at least 8" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.data = buf[8:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("echo_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class echo_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_ECHO_REQUEST
+
+    def __init__(self, xid=None, data=None):
+        self.xid = xid
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = echo_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_ECHO_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 8: raise loxi.ProtocolError("echo_request length is %d, should be at least 8" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.data = buf[8:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("echo_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class error_msg(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_ERROR
+
+    def __init__(self, xid=None, err_type=None, code=None, data=None):
+        self.xid = xid
+        if err_type != None:
+            self.err_type = err_type
+        else:
+            self.err_type = 0
+        if code != None:
+            self.code = code
+        else:
+            self.code = 0
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.err_type))
+        packed.append(struct.pack("!H", self.code))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = error_msg()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_ERROR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 12: raise loxi.ProtocolError("error_msg length is %d, should be at least 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.err_type = struct.unpack_from('!H', buf, 8)[0]
+        obj.code = struct.unpack_from('!H', buf, 10)[0]
+        obj.data = buf[12:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.err_type != other.err_type: return False
+        if self.code != other.code: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("error_msg {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("err_type = ");
+                q.text("%#x" % self.err_type)
+                q.text(","); q.breakable()
+                q.text("code = ");
+                q.text("%#x" % self.code)
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class experimenter_stats_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REPLY
+    stats_type = const.OFPST_VENDOR
+
+    def __init__(self, xid=None, flags=None, experimenter=None, data=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if experimenter != None:
+            self.experimenter = experimenter
+        else:
+            self.experimenter = 0
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = experimenter_stats_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 16: raise loxi.ProtocolError("experimenter_stats_reply length is %d, should be at least 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_VENDOR)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.experimenter = struct.unpack_from('!L', buf, 12)[0]
+        obj.data = buf[16:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.experimenter != other.experimenter: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("experimenter_stats_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("experimenter = ");
+                q.text("%#x" % self.experimenter)
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class experimenter_stats_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REQUEST
+    stats_type = const.OFPST_VENDOR
+
+    def __init__(self, xid=None, flags=None, experimenter=None, data=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if experimenter != None:
+            self.experimenter = experimenter
+        else:
+            self.experimenter = 0
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = experimenter_stats_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 16: raise loxi.ProtocolError("experimenter_stats_request length is %d, should be at least 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_VENDOR)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.experimenter = struct.unpack_from('!L', buf, 12)[0]
+        obj.data = buf[16:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.experimenter != other.experimenter: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("experimenter_stats_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("experimenter = ");
+                q.text("%#x" % self.experimenter)
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class features_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FEATURES_REPLY
+
+    def __init__(self, xid=None, datapath_id=None, n_buffers=None, n_tables=None, pad=None, capabilities=None, actions=None, ports=None):
+        self.xid = xid
+        if datapath_id != None:
+            self.datapath_id = datapath_id
+        else:
+            self.datapath_id = 0
+        if n_buffers != None:
+            self.n_buffers = n_buffers
+        else:
+            self.n_buffers = 0
+        if n_tables != None:
+            self.n_tables = n_tables
+        else:
+            self.n_tables = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+        if capabilities != None:
+            self.capabilities = capabilities
+        else:
+            self.capabilities = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = 0
+        if ports != None:
+            self.ports = ports
+        else:
+            self.ports = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!Q", self.datapath_id))
+        packed.append(struct.pack("!L", self.n_buffers))
+        packed.append(struct.pack("!B", self.n_tables))
+        packed.append(struct.pack("!3B", *self.pad))
+        packed.append(struct.pack("!L", self.capabilities))
+        packed.append(struct.pack("!L", self.actions))
+        packed.append("".join([x.pack() for x in self.ports]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = features_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FEATURES_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 32: raise loxi.ProtocolError("features_reply length is %d, should be at least 32" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.datapath_id = struct.unpack_from('!Q', buf, 8)[0]
+        obj.n_buffers = struct.unpack_from('!L', buf, 16)[0]
+        obj.n_tables = struct.unpack_from('!B', buf, 20)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 21))
+        obj.capabilities = struct.unpack_from('!L', buf, 24)[0]
+        obj.actions = struct.unpack_from('!L', buf, 28)[0]
+        obj.ports = util.unpack_array(common.port_desc.unpack, 48, buffer(buf, 32))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.datapath_id != other.datapath_id: return False
+        if self.n_buffers != other.n_buffers: return False
+        if self.n_tables != other.n_tables: return False
+        if self.pad != other.pad: return False
+        if self.capabilities != other.capabilities: return False
+        if self.actions != other.actions: return False
+        if self.ports != other.ports: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("features_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("datapath_id = ");
+                q.text("%#x" % self.datapath_id)
+                q.text(","); q.breakable()
+                q.text("n_buffers = ");
+                q.text("%#x" % self.n_buffers)
+                q.text(","); q.breakable()
+                q.text("n_tables = ");
+                q.text("%#x" % self.n_tables)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("capabilities = ");
+                q.text("%#x" % self.capabilities)
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.text("%#x" % self.actions)
+                q.text(","); q.breakable()
+                q.text("ports = ");
+                q.pp(self.ports)
+            q.breakable()
+        q.text('}')
+
+class features_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FEATURES_REQUEST
+
+    def __init__(self, xid=None):
+        self.xid = xid
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = features_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FEATURES_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("features_request length is %d, should be 8" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("features_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+            q.breakable()
+        q.text('}')
+
+class flow_add(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FLOW_MOD
+    _command = const.OFPFC_ADD
+
+    def __init__(self, xid=None, match=None, cookie=None, idle_timeout=None, hard_timeout=None, priority=None, buffer_id=None, out_port=None, flags=None, actions=None):
+        self.xid = xid
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if cookie != None:
+            self.cookie = cookie
+        else:
+            self.cookie = 0
+        if idle_timeout != None:
+            self.idle_timeout = idle_timeout
+        else:
+            self.idle_timeout = 0
+        if hard_timeout != None:
+            self.hard_timeout = hard_timeout
+        else:
+            self.hard_timeout = 0
+        if priority != None:
+            self.priority = priority
+        else:
+            self.priority = 0
+        if buffer_id != None:
+            self.buffer_id = buffer_id
+        else:
+            self.buffer_id = 0
+        if out_port != None:
+            self.out_port = out_port
+        else:
+            self.out_port = 0
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!Q", self.cookie))
+        packed.append(struct.pack("!H", self._command))
+        packed.append(struct.pack("!H", self.idle_timeout))
+        packed.append(struct.pack("!H", self.hard_timeout))
+        packed.append(struct.pack("!H", self.priority))
+        packed.append(struct.pack("!L", self.buffer_id))
+        packed.append(struct.pack("!H", self.out_port))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.actions]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_add()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FLOW_MOD)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 72: raise loxi.ProtocolError("flow_add length is %d, should be at least 72" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.match = common.match.unpack(buffer(buf, 8))
+        obj.cookie = struct.unpack_from('!Q', buf, 48)[0]
+        _command = struct.unpack_from('!H', buf, 56)[0]
+        assert(_command == const.OFPFC_ADD)
+        obj.idle_timeout = struct.unpack_from('!H', buf, 58)[0]
+        obj.hard_timeout = struct.unpack_from('!H', buf, 60)[0]
+        obj.priority = struct.unpack_from('!H', buf, 62)[0]
+        obj.buffer_id = struct.unpack_from('!L', buf, 64)[0]
+        obj.out_port = struct.unpack_from('!H', buf, 68)[0]
+        obj.flags = struct.unpack_from('!H', buf, 70)[0]
+        obj.actions = action.unpack_list(buffer(buf, 72))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.match != other.match: return False
+        if self.cookie != other.cookie: return False
+        if self.idle_timeout != other.idle_timeout: return False
+        if self.hard_timeout != other.hard_timeout: return False
+        if self.priority != other.priority: return False
+        if self.buffer_id != other.buffer_id: return False
+        if self.out_port != other.out_port: return False
+        if self.flags != other.flags: return False
+        if self.actions != other.actions: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_add {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("cookie = ");
+                q.text("%#x" % self.cookie)
+                q.text(","); q.breakable()
+                q.text("idle_timeout = ");
+                q.text("%#x" % self.idle_timeout)
+                q.text(","); q.breakable()
+                q.text("hard_timeout = ");
+                q.text("%#x" % self.hard_timeout)
+                q.text(","); q.breakable()
+                q.text("priority = ");
+                q.text("%#x" % self.priority)
+                q.text(","); q.breakable()
+                q.text("buffer_id = ");
+                q.text("%#x" % self.buffer_id)
+                q.text(","); q.breakable()
+                q.text("out_port = ");
+                q.text(util.pretty_port(self.out_port))
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.pp(self.actions)
+            q.breakable()
+        q.text('}')
+
+class flow_delete(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FLOW_MOD
+    _command = const.OFPFC_DELETE
+
+    def __init__(self, xid=None, match=None, cookie=None, idle_timeout=None, hard_timeout=None, priority=None, buffer_id=None, out_port=None, flags=None, actions=None):
+        self.xid = xid
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if cookie != None:
+            self.cookie = cookie
+        else:
+            self.cookie = 0
+        if idle_timeout != None:
+            self.idle_timeout = idle_timeout
+        else:
+            self.idle_timeout = 0
+        if hard_timeout != None:
+            self.hard_timeout = hard_timeout
+        else:
+            self.hard_timeout = 0
+        if priority != None:
+            self.priority = priority
+        else:
+            self.priority = 0
+        if buffer_id != None:
+            self.buffer_id = buffer_id
+        else:
+            self.buffer_id = 0
+        if out_port != None:
+            self.out_port = out_port
+        else:
+            self.out_port = 0
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!Q", self.cookie))
+        packed.append(struct.pack("!H", self._command))
+        packed.append(struct.pack("!H", self.idle_timeout))
+        packed.append(struct.pack("!H", self.hard_timeout))
+        packed.append(struct.pack("!H", self.priority))
+        packed.append(struct.pack("!L", self.buffer_id))
+        packed.append(struct.pack("!H", self.out_port))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.actions]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_delete()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FLOW_MOD)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 72: raise loxi.ProtocolError("flow_delete length is %d, should be at least 72" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.match = common.match.unpack(buffer(buf, 8))
+        obj.cookie = struct.unpack_from('!Q', buf, 48)[0]
+        _command = struct.unpack_from('!H', buf, 56)[0]
+        assert(_command == const.OFPFC_DELETE)
+        obj.idle_timeout = struct.unpack_from('!H', buf, 58)[0]
+        obj.hard_timeout = struct.unpack_from('!H', buf, 60)[0]
+        obj.priority = struct.unpack_from('!H', buf, 62)[0]
+        obj.buffer_id = struct.unpack_from('!L', buf, 64)[0]
+        obj.out_port = struct.unpack_from('!H', buf, 68)[0]
+        obj.flags = struct.unpack_from('!H', buf, 70)[0]
+        obj.actions = action.unpack_list(buffer(buf, 72))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.match != other.match: return False
+        if self.cookie != other.cookie: return False
+        if self.idle_timeout != other.idle_timeout: return False
+        if self.hard_timeout != other.hard_timeout: return False
+        if self.priority != other.priority: return False
+        if self.buffer_id != other.buffer_id: return False
+        if self.out_port != other.out_port: return False
+        if self.flags != other.flags: return False
+        if self.actions != other.actions: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_delete {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("cookie = ");
+                q.text("%#x" % self.cookie)
+                q.text(","); q.breakable()
+                q.text("idle_timeout = ");
+                q.text("%#x" % self.idle_timeout)
+                q.text(","); q.breakable()
+                q.text("hard_timeout = ");
+                q.text("%#x" % self.hard_timeout)
+                q.text(","); q.breakable()
+                q.text("priority = ");
+                q.text("%#x" % self.priority)
+                q.text(","); q.breakable()
+                q.text("buffer_id = ");
+                q.text("%#x" % self.buffer_id)
+                q.text(","); q.breakable()
+                q.text("out_port = ");
+                q.text(util.pretty_port(self.out_port))
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.pp(self.actions)
+            q.breakable()
+        q.text('}')
+
+class flow_delete_strict(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FLOW_MOD
+    _command = const.OFPFC_DELETE_STRICT
+
+    def __init__(self, xid=None, match=None, cookie=None, idle_timeout=None, hard_timeout=None, priority=None, buffer_id=None, out_port=None, flags=None, actions=None):
+        self.xid = xid
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if cookie != None:
+            self.cookie = cookie
+        else:
+            self.cookie = 0
+        if idle_timeout != None:
+            self.idle_timeout = idle_timeout
+        else:
+            self.idle_timeout = 0
+        if hard_timeout != None:
+            self.hard_timeout = hard_timeout
+        else:
+            self.hard_timeout = 0
+        if priority != None:
+            self.priority = priority
+        else:
+            self.priority = 0
+        if buffer_id != None:
+            self.buffer_id = buffer_id
+        else:
+            self.buffer_id = 0
+        if out_port != None:
+            self.out_port = out_port
+        else:
+            self.out_port = 0
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!Q", self.cookie))
+        packed.append(struct.pack("!H", self._command))
+        packed.append(struct.pack("!H", self.idle_timeout))
+        packed.append(struct.pack("!H", self.hard_timeout))
+        packed.append(struct.pack("!H", self.priority))
+        packed.append(struct.pack("!L", self.buffer_id))
+        packed.append(struct.pack("!H", self.out_port))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.actions]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_delete_strict()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FLOW_MOD)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 72: raise loxi.ProtocolError("flow_delete_strict length is %d, should be at least 72" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.match = common.match.unpack(buffer(buf, 8))
+        obj.cookie = struct.unpack_from('!Q', buf, 48)[0]
+        _command = struct.unpack_from('!H', buf, 56)[0]
+        assert(_command == const.OFPFC_DELETE_STRICT)
+        obj.idle_timeout = struct.unpack_from('!H', buf, 58)[0]
+        obj.hard_timeout = struct.unpack_from('!H', buf, 60)[0]
+        obj.priority = struct.unpack_from('!H', buf, 62)[0]
+        obj.buffer_id = struct.unpack_from('!L', buf, 64)[0]
+        obj.out_port = struct.unpack_from('!H', buf, 68)[0]
+        obj.flags = struct.unpack_from('!H', buf, 70)[0]
+        obj.actions = action.unpack_list(buffer(buf, 72))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.match != other.match: return False
+        if self.cookie != other.cookie: return False
+        if self.idle_timeout != other.idle_timeout: return False
+        if self.hard_timeout != other.hard_timeout: return False
+        if self.priority != other.priority: return False
+        if self.buffer_id != other.buffer_id: return False
+        if self.out_port != other.out_port: return False
+        if self.flags != other.flags: return False
+        if self.actions != other.actions: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_delete_strict {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("cookie = ");
+                q.text("%#x" % self.cookie)
+                q.text(","); q.breakable()
+                q.text("idle_timeout = ");
+                q.text("%#x" % self.idle_timeout)
+                q.text(","); q.breakable()
+                q.text("hard_timeout = ");
+                q.text("%#x" % self.hard_timeout)
+                q.text(","); q.breakable()
+                q.text("priority = ");
+                q.text("%#x" % self.priority)
+                q.text(","); q.breakable()
+                q.text("buffer_id = ");
+                q.text("%#x" % self.buffer_id)
+                q.text(","); q.breakable()
+                q.text("out_port = ");
+                q.text(util.pretty_port(self.out_port))
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.pp(self.actions)
+            q.breakable()
+        q.text('}')
+
+class flow_modify(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FLOW_MOD
+    _command = const.OFPFC_MODIFY
+
+    def __init__(self, xid=None, match=None, cookie=None, idle_timeout=None, hard_timeout=None, priority=None, buffer_id=None, out_port=None, flags=None, actions=None):
+        self.xid = xid
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if cookie != None:
+            self.cookie = cookie
+        else:
+            self.cookie = 0
+        if idle_timeout != None:
+            self.idle_timeout = idle_timeout
+        else:
+            self.idle_timeout = 0
+        if hard_timeout != None:
+            self.hard_timeout = hard_timeout
+        else:
+            self.hard_timeout = 0
+        if priority != None:
+            self.priority = priority
+        else:
+            self.priority = 0
+        if buffer_id != None:
+            self.buffer_id = buffer_id
+        else:
+            self.buffer_id = 0
+        if out_port != None:
+            self.out_port = out_port
+        else:
+            self.out_port = 0
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!Q", self.cookie))
+        packed.append(struct.pack("!H", self._command))
+        packed.append(struct.pack("!H", self.idle_timeout))
+        packed.append(struct.pack("!H", self.hard_timeout))
+        packed.append(struct.pack("!H", self.priority))
+        packed.append(struct.pack("!L", self.buffer_id))
+        packed.append(struct.pack("!H", self.out_port))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.actions]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_modify()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FLOW_MOD)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 72: raise loxi.ProtocolError("flow_modify length is %d, should be at least 72" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.match = common.match.unpack(buffer(buf, 8))
+        obj.cookie = struct.unpack_from('!Q', buf, 48)[0]
+        _command = struct.unpack_from('!H', buf, 56)[0]
+        assert(_command == const.OFPFC_MODIFY)
+        obj.idle_timeout = struct.unpack_from('!H', buf, 58)[0]
+        obj.hard_timeout = struct.unpack_from('!H', buf, 60)[0]
+        obj.priority = struct.unpack_from('!H', buf, 62)[0]
+        obj.buffer_id = struct.unpack_from('!L', buf, 64)[0]
+        obj.out_port = struct.unpack_from('!H', buf, 68)[0]
+        obj.flags = struct.unpack_from('!H', buf, 70)[0]
+        obj.actions = action.unpack_list(buffer(buf, 72))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.match != other.match: return False
+        if self.cookie != other.cookie: return False
+        if self.idle_timeout != other.idle_timeout: return False
+        if self.hard_timeout != other.hard_timeout: return False
+        if self.priority != other.priority: return False
+        if self.buffer_id != other.buffer_id: return False
+        if self.out_port != other.out_port: return False
+        if self.flags != other.flags: return False
+        if self.actions != other.actions: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_modify {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("cookie = ");
+                q.text("%#x" % self.cookie)
+                q.text(","); q.breakable()
+                q.text("idle_timeout = ");
+                q.text("%#x" % self.idle_timeout)
+                q.text(","); q.breakable()
+                q.text("hard_timeout = ");
+                q.text("%#x" % self.hard_timeout)
+                q.text(","); q.breakable()
+                q.text("priority = ");
+                q.text("%#x" % self.priority)
+                q.text(","); q.breakable()
+                q.text("buffer_id = ");
+                q.text("%#x" % self.buffer_id)
+                q.text(","); q.breakable()
+                q.text("out_port = ");
+                q.text(util.pretty_port(self.out_port))
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.pp(self.actions)
+            q.breakable()
+        q.text('}')
+
+class flow_modify_strict(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FLOW_MOD
+    _command = const.OFPFC_MODIFY_STRICT
+
+    def __init__(self, xid=None, match=None, cookie=None, idle_timeout=None, hard_timeout=None, priority=None, buffer_id=None, out_port=None, flags=None, actions=None):
+        self.xid = xid
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if cookie != None:
+            self.cookie = cookie
+        else:
+            self.cookie = 0
+        if idle_timeout != None:
+            self.idle_timeout = idle_timeout
+        else:
+            self.idle_timeout = 0
+        if hard_timeout != None:
+            self.hard_timeout = hard_timeout
+        else:
+            self.hard_timeout = 0
+        if priority != None:
+            self.priority = priority
+        else:
+            self.priority = 0
+        if buffer_id != None:
+            self.buffer_id = buffer_id
+        else:
+            self.buffer_id = 0
+        if out_port != None:
+            self.out_port = out_port
+        else:
+            self.out_port = 0
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!Q", self.cookie))
+        packed.append(struct.pack("!H", self._command))
+        packed.append(struct.pack("!H", self.idle_timeout))
+        packed.append(struct.pack("!H", self.hard_timeout))
+        packed.append(struct.pack("!H", self.priority))
+        packed.append(struct.pack("!L", self.buffer_id))
+        packed.append(struct.pack("!H", self.out_port))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.actions]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_modify_strict()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FLOW_MOD)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 72: raise loxi.ProtocolError("flow_modify_strict length is %d, should be at least 72" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.match = common.match.unpack(buffer(buf, 8))
+        obj.cookie = struct.unpack_from('!Q', buf, 48)[0]
+        _command = struct.unpack_from('!H', buf, 56)[0]
+        assert(_command == const.OFPFC_MODIFY_STRICT)
+        obj.idle_timeout = struct.unpack_from('!H', buf, 58)[0]
+        obj.hard_timeout = struct.unpack_from('!H', buf, 60)[0]
+        obj.priority = struct.unpack_from('!H', buf, 62)[0]
+        obj.buffer_id = struct.unpack_from('!L', buf, 64)[0]
+        obj.out_port = struct.unpack_from('!H', buf, 68)[0]
+        obj.flags = struct.unpack_from('!H', buf, 70)[0]
+        obj.actions = action.unpack_list(buffer(buf, 72))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.match != other.match: return False
+        if self.cookie != other.cookie: return False
+        if self.idle_timeout != other.idle_timeout: return False
+        if self.hard_timeout != other.hard_timeout: return False
+        if self.priority != other.priority: return False
+        if self.buffer_id != other.buffer_id: return False
+        if self.out_port != other.out_port: return False
+        if self.flags != other.flags: return False
+        if self.actions != other.actions: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_modify_strict {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("cookie = ");
+                q.text("%#x" % self.cookie)
+                q.text(","); q.breakable()
+                q.text("idle_timeout = ");
+                q.text("%#x" % self.idle_timeout)
+                q.text(","); q.breakable()
+                q.text("hard_timeout = ");
+                q.text("%#x" % self.hard_timeout)
+                q.text(","); q.breakable()
+                q.text("priority = ");
+                q.text("%#x" % self.priority)
+                q.text(","); q.breakable()
+                q.text("buffer_id = ");
+                q.text("%#x" % self.buffer_id)
+                q.text(","); q.breakable()
+                q.text("out_port = ");
+                q.text(util.pretty_port(self.out_port))
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.pp(self.actions)
+            q.breakable()
+        q.text('}')
+
+class flow_removed(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_FLOW_REMOVED
+
+    def __init__(self, xid=None, match=None, cookie=None, priority=None, reason=None, pad=None, duration_sec=None, duration_nsec=None, idle_timeout=None, pad2=None, packet_count=None, byte_count=None):
+        self.xid = xid
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if cookie != None:
+            self.cookie = cookie
+        else:
+            self.cookie = 0
+        if priority != None:
+            self.priority = priority
+        else:
+            self.priority = 0
+        if reason != None:
+            self.reason = reason
+        else:
+            self.reason = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = 0
+        if duration_sec != None:
+            self.duration_sec = duration_sec
+        else:
+            self.duration_sec = 0
+        if duration_nsec != None:
+            self.duration_nsec = duration_nsec
+        else:
+            self.duration_nsec = 0
+        if idle_timeout != None:
+            self.idle_timeout = idle_timeout
+        else:
+            self.idle_timeout = 0
+        if pad2 != None:
+            self.pad2 = pad2
+        else:
+            self.pad2 = [0,0]
+        if packet_count != None:
+            self.packet_count = packet_count
+        else:
+            self.packet_count = 0
+        if byte_count != None:
+            self.byte_count = byte_count
+        else:
+            self.byte_count = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!Q", self.cookie))
+        packed.append(struct.pack("!H", self.priority))
+        packed.append(struct.pack("!B", self.reason))
+        packed.append(struct.pack("!B", self.pad))
+        packed.append(struct.pack("!L", self.duration_sec))
+        packed.append(struct.pack("!L", self.duration_nsec))
+        packed.append(struct.pack("!H", self.idle_timeout))
+        packed.append(struct.pack("!2B", *self.pad2))
+        packed.append(struct.pack("!Q", self.packet_count))
+        packed.append(struct.pack("!Q", self.byte_count))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_removed()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_FLOW_REMOVED)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 88: raise loxi.ProtocolError("flow_removed length is %d, should be 88" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.match = common.match.unpack(buffer(buf, 8))
+        obj.cookie = struct.unpack_from('!Q', buf, 48)[0]
+        obj.priority = struct.unpack_from('!H', buf, 56)[0]
+        obj.reason = struct.unpack_from('!B', buf, 58)[0]
+        obj.pad = struct.unpack_from('!B', buf, 59)[0]
+        obj.duration_sec = struct.unpack_from('!L', buf, 60)[0]
+        obj.duration_nsec = struct.unpack_from('!L', buf, 64)[0]
+        obj.idle_timeout = struct.unpack_from('!H', buf, 68)[0]
+        obj.pad2 = list(struct.unpack_from('!2B', buf, 70))
+        obj.packet_count = struct.unpack_from('!Q', buf, 72)[0]
+        obj.byte_count = struct.unpack_from('!Q', buf, 80)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.match != other.match: return False
+        if self.cookie != other.cookie: return False
+        if self.priority != other.priority: return False
+        if self.reason != other.reason: return False
+        if self.pad != other.pad: return False
+        if self.duration_sec != other.duration_sec: return False
+        if self.duration_nsec != other.duration_nsec: return False
+        if self.idle_timeout != other.idle_timeout: return False
+        if self.pad2 != other.pad2: return False
+        if self.packet_count != other.packet_count: return False
+        if self.byte_count != other.byte_count: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_removed {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("cookie = ");
+                q.text("%#x" % self.cookie)
+                q.text(","); q.breakable()
+                q.text("priority = ");
+                q.text("%#x" % self.priority)
+                q.text(","); q.breakable()
+                q.text("reason = ");
+                q.text("%#x" % self.reason)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.text("%#x" % self.pad)
+                q.text(","); q.breakable()
+                q.text("duration_sec = ");
+                q.text("%#x" % self.duration_sec)
+                q.text(","); q.breakable()
+                q.text("duration_nsec = ");
+                q.text("%#x" % self.duration_nsec)
+                q.text(","); q.breakable()
+                q.text("idle_timeout = ");
+                q.text("%#x" % self.idle_timeout)
+                q.text(","); q.breakable()
+                q.text("pad2 = ");
+                q.pp(self.pad2)
+                q.text(","); q.breakable()
+                q.text("packet_count = ");
+                q.text("%#x" % self.packet_count)
+                q.text(","); q.breakable()
+                q.text("byte_count = ");
+                q.text("%#x" % self.byte_count)
+            q.breakable()
+        q.text('}')
+
+class flow_stats_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REPLY
+    stats_type = const.OFPST_FLOW
+
+    def __init__(self, xid=None, flags=None, entries=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if entries != None:
+            self.entries = entries
+        else:
+            self.entries = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.entries]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_stats_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 12: raise loxi.ProtocolError("flow_stats_reply length is %d, should be at least 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_FLOW)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.entries = common.unpack_list_flow_stats_entry(buffer(buf, 12))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.entries != other.entries: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_stats_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("entries = ");
+                q.pp(self.entries)
+            q.breakable()
+        q.text('}')
+
+class flow_stats_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REQUEST
+    stats_type = const.OFPST_FLOW
+
+    def __init__(self, xid=None, flags=None, match=None, table_id=None, pad=None, out_port=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if match != None:
+            self.match = match
+        else:
+            self.match = common.match()
+        if table_id != None:
+            self.table_id = table_id
+        else:
+            self.table_id = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = 0
+        if out_port != None:
+            self.out_port = out_port
+        else:
+            self.out_port = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(self.match.pack())
+        packed.append(struct.pack("!B", self.table_id))
+        packed.append(struct.pack("!B", self.pad))
+        packed.append(struct.pack("!H", self.out_port))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = flow_stats_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 56: raise loxi.ProtocolError("flow_stats_request length is %d, should be 56" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_FLOW)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.match = common.match.unpack(buffer(buf, 12))
+        obj.table_id = struct.unpack_from('!B', buf, 52)[0]
+        obj.pad = struct.unpack_from('!B', buf, 53)[0]
+        obj.out_port = struct.unpack_from('!H', buf, 54)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.match != other.match: return False
+        if self.table_id != other.table_id: return False
+        if self.pad != other.pad: return False
+        if self.out_port != other.out_port: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("flow_stats_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("match = ");
+                q.pp(self.match)
+                q.text(","); q.breakable()
+                q.text("table_id = ");
+                q.text("%#x" % self.table_id)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.text("%#x" % self.pad)
+                q.text(","); q.breakable()
+                q.text("out_port = ");
+                q.text(util.pretty_port(self.out_port))
+            q.breakable()
+        q.text('}')
+
+class get_config_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_GET_CONFIG_REPLY
+
+    def __init__(self, xid=None, flags=None, miss_send_len=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if miss_send_len != None:
+            self.miss_send_len = miss_send_len
+        else:
+            self.miss_send_len = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!H", self.miss_send_len))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = get_config_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_GET_CONFIG_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 12: raise loxi.ProtocolError("get_config_reply length is %d, should be 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.flags = struct.unpack_from('!H', buf, 8)[0]
+        obj.miss_send_len = struct.unpack_from('!H', buf, 10)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.miss_send_len != other.miss_send_len: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("get_config_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("miss_send_len = ");
+                q.text("%#x" % self.miss_send_len)
+            q.breakable()
+        q.text('}')
+
+class get_config_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_GET_CONFIG_REQUEST
+
+    def __init__(self, xid=None):
+        self.xid = xid
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = get_config_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_GET_CONFIG_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("get_config_request length is %d, should be 8" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("get_config_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+            q.breakable()
+        q.text('}')
+
+class hello(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_HELLO
+
+    def __init__(self, xid=None):
+        self.xid = xid
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = hello()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_HELLO)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 8: raise loxi.ProtocolError("hello length is %d, should be 8" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("hello {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+            q.breakable()
+        q.text('}')
+
+class nicira_controller_role_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x2320
+    subtype = 11
+
+    def __init__(self, xid=None, role=None):
+        self.xid = xid
+        if role != None:
+            self.role = role
+        else:
+            self.role = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!L", self.role))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = nicira_controller_role_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("nicira_controller_role_reply length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x2320)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 11)
+        obj.role = struct.unpack_from('!L', buf, 16)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.role != other.role: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("nicira_controller_role_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("role = ");
+                q.text("%#x" % self.role)
+            q.breakable()
+        q.text('}')
+
+class nicira_controller_role_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_VENDOR
+    experimenter = 0x2320
+    subtype = 10
+
+    def __init__(self, xid=None, role=None):
+        self.xid = xid
+        if role != None:
+            self.role = role
+        else:
+            self.role = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.experimenter))
+        packed.append(struct.pack("!L", self.subtype))
+        packed.append(struct.pack("!L", self.role))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = nicira_controller_role_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_VENDOR)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("nicira_controller_role_request length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        experimenter = struct.unpack_from('!L', buf, 8)[0]
+        assert(experimenter == 0x2320)
+        subtype = struct.unpack_from('!L', buf, 12)[0]
+        assert(subtype == 10)
+        obj.role = struct.unpack_from('!L', buf, 16)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.role != other.role: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("nicira_controller_role_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("role = ");
+                q.text("%#x" % self.role)
+            q.breakable()
+        q.text('}')
+
+class packet_in(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_PACKET_IN
+
+    def __init__(self, xid=None, buffer_id=None, total_len=None, in_port=None, reason=None, pad=None, data=None):
+        self.xid = xid
+        if buffer_id != None:
+            self.buffer_id = buffer_id
+        else:
+            self.buffer_id = 0
+        if total_len != None:
+            self.total_len = total_len
+        else:
+            self.total_len = 0
+        if in_port != None:
+            self.in_port = in_port
+        else:
+            self.in_port = 0
+        if reason != None:
+            self.reason = reason
+        else:
+            self.reason = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = 0
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.buffer_id))
+        packed.append(struct.pack("!H", self.total_len))
+        packed.append(struct.pack("!H", self.in_port))
+        packed.append(struct.pack("!B", self.reason))
+        packed.append(struct.pack("!B", self.pad))
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = packet_in()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_PACKET_IN)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 18: raise loxi.ProtocolError("packet_in length is %d, should be at least 18" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.buffer_id = struct.unpack_from('!L', buf, 8)[0]
+        obj.total_len = struct.unpack_from('!H', buf, 12)[0]
+        obj.in_port = struct.unpack_from('!H', buf, 14)[0]
+        obj.reason = struct.unpack_from('!B', buf, 16)[0]
+        obj.pad = struct.unpack_from('!B', buf, 17)[0]
+        obj.data = buf[18:]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.buffer_id != other.buffer_id: return False
+        if self.total_len != other.total_len: return False
+        if self.in_port != other.in_port: return False
+        if self.reason != other.reason: return False
+        if self.pad != other.pad: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("packet_in {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("buffer_id = ");
+                q.text("%#x" % self.buffer_id)
+                q.text(","); q.breakable()
+                q.text("total_len = ");
+                q.text("%#x" % self.total_len)
+                q.text(","); q.breakable()
+                q.text("in_port = ");
+                q.text(util.pretty_port(self.in_port))
+                q.text(","); q.breakable()
+                q.text("reason = ");
+                q.text("%#x" % self.reason)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.text("%#x" % self.pad)
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class packet_out(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_PACKET_OUT
+
+    def __init__(self, xid=None, buffer_id=None, in_port=None, actions=None, data=None):
+        self.xid = xid
+        if buffer_id != None:
+            self.buffer_id = buffer_id
+        else:
+            self.buffer_id = 0
+        if in_port != None:
+            self.in_port = in_port
+        else:
+            self.in_port = 0
+        if actions != None:
+            self.actions = actions
+        else:
+            self.actions = []
+        if data != None:
+            self.data = data
+        else:
+            self.data = ""
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 3
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!L", self.buffer_id))
+        packed.append(struct.pack("!H", self.in_port))
+        packed_actions = "".join([x.pack() for x in self.actions])
+        packed.append(struct.pack("!H", len(packed_actions)))
+        packed.append(packed_actions)
+        packed.append(self.data)
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = packet_out()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_PACKET_OUT)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 16: raise loxi.ProtocolError("packet_out length is %d, should be at least 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.buffer_id = struct.unpack_from('!L', buf, 8)[0]
+        obj.in_port = struct.unpack_from('!H', buf, 12)[0]
+        actions_len = struct.unpack_from('!H', buf, 14)[0]
+        obj.actions = action.unpack_list(buffer(buf, 16, actions_len))
+        obj.data = str(buffer(buf, 16+actions_len))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.buffer_id != other.buffer_id: return False
+        if self.in_port != other.in_port: return False
+        if self.actions != other.actions: return False
+        if self.data != other.data: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("packet_out {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("buffer_id = ");
+                q.text("%#x" % self.buffer_id)
+                q.text(","); q.breakable()
+                q.text("in_port = ");
+                q.text(util.pretty_port(self.in_port))
+                q.text(","); q.breakable()
+                q.text("actions = ");
+                q.pp(self.actions)
+                q.text(","); q.breakable()
+                q.text("data = ");
+                q.pp(self.data)
+            q.breakable()
+        q.text('}')
+
+class port_mod(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_PORT_MOD
+
+    def __init__(self, xid=None, port_no=None, hw_addr=None, config=None, mask=None, advertise=None, pad=None):
+        self.xid = xid
+        if port_no != None:
+            self.port_no = port_no
+        else:
+            self.port_no = 0
+        if hw_addr != None:
+            self.hw_addr = hw_addr
+        else:
+            self.hw_addr = [0,0,0,0,0,0]
+        if config != None:
+            self.config = config
+        else:
+            self.config = 0
+        if mask != None:
+            self.mask = mask
+        else:
+            self.mask = 0
+        if advertise != None:
+            self.advertise = advertise
+        else:
+            self.advertise = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.port_no))
+        packed.append(struct.pack("!6B", *self.hw_addr))
+        packed.append(struct.pack("!L", self.config))
+        packed.append(struct.pack("!L", self.mask))
+        packed.append(struct.pack("!L", self.advertise))
+        packed.append(struct.pack("!4B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = port_mod()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_PORT_MOD)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 32: raise loxi.ProtocolError("port_mod length is %d, should be 32" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.port_no = struct.unpack_from('!H', buf, 8)[0]
+        obj.hw_addr = list(struct.unpack_from('!6B', buf, 10))
+        obj.config = struct.unpack_from('!L', buf, 16)[0]
+        obj.mask = struct.unpack_from('!L', buf, 20)[0]
+        obj.advertise = struct.unpack_from('!L', buf, 24)[0]
+        obj.pad = list(struct.unpack_from('!4B', buf, 28))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.port_no != other.port_no: return False
+        if self.hw_addr != other.hw_addr: return False
+        if self.config != other.config: return False
+        if self.mask != other.mask: return False
+        if self.advertise != other.advertise: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("port_mod {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("port_no = ");
+                q.text(util.pretty_port(self.port_no))
+                q.text(","); q.breakable()
+                q.text("hw_addr = ");
+                q.text(util.pretty_mac(self.hw_addr))
+                q.text(","); q.breakable()
+                q.text("config = ");
+                q.text("%#x" % self.config)
+                q.text(","); q.breakable()
+                q.text("mask = ");
+                q.text("%#x" % self.mask)
+                q.text(","); q.breakable()
+                q.text("advertise = ");
+                q.text("%#x" % self.advertise)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class port_stats_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REPLY
+    stats_type = const.OFPST_PORT
+
+    def __init__(self, xid=None, flags=None, entries=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if entries != None:
+            self.entries = entries
+        else:
+            self.entries = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.entries]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = port_stats_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 12: raise loxi.ProtocolError("port_stats_reply length is %d, should be at least 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_PORT)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.entries = util.unpack_array(common.port_stats_entry.unpack, 104, buffer(buf, 12))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.entries != other.entries: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("port_stats_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("entries = ");
+                q.pp(self.entries)
+            q.breakable()
+        q.text('}')
+
+class port_stats_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REQUEST
+    stats_type = const.OFPST_PORT
+
+    def __init__(self, xid=None, flags=None, port_no=None, pad=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if port_no != None:
+            self.port_no = port_no
+        else:
+            self.port_no = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!H", self.port_no))
+        packed.append(struct.pack("!6B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = port_stats_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("port_stats_request length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_PORT)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.port_no = struct.unpack_from('!H', buf, 12)[0]
+        obj.pad = list(struct.unpack_from('!6B', buf, 14))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.port_no != other.port_no: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("port_stats_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("port_no = ");
+                q.text(util.pretty_port(self.port_no))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class port_status(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_PORT_STATUS
+
+    def __init__(self, xid=None, reason=None, pad=None, desc=None):
+        self.xid = xid
+        if reason != None:
+            self.reason = reason
+        else:
+            self.reason = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0,0]
+        if desc != None:
+            self.desc = desc
+        else:
+            self.desc = common.port_desc()
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!B", self.reason))
+        packed.append(struct.pack("!7B", *self.pad))
+        packed.append(self.desc.pack())
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = port_status()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_PORT_STATUS)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 64: raise loxi.ProtocolError("port_status length is %d, should be 64" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.reason = struct.unpack_from('!B', buf, 8)[0]
+        obj.pad = list(struct.unpack_from('!7B', buf, 9))
+        obj.desc = common.port_desc.unpack(buffer(buf, 16))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.reason != other.reason: return False
+        if self.pad != other.pad: return False
+        if self.desc != other.desc: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("port_status {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("reason = ");
+                q.text("%#x" % self.reason)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("desc = ");
+                q.pp(self.desc)
+            q.breakable()
+        q.text('}')
+
+class queue_get_config_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_QUEUE_GET_CONFIG_REPLY
+
+    def __init__(self, xid=None, port=None, pad=None, queues=None):
+        self.xid = xid
+        if port != None:
+            self.port = port
+        else:
+            self.port = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0,0,0,0]
+        if queues != None:
+            self.queues = queues
+        else:
+            self.queues = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.port))
+        packed.append(struct.pack("!6B", *self.pad))
+        packed.append("".join([x.pack() for x in self.queues]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = queue_get_config_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_QUEUE_GET_CONFIG_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 16: raise loxi.ProtocolError("queue_get_config_reply length is %d, should be at least 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.port = struct.unpack_from('!H', buf, 8)[0]
+        obj.pad = list(struct.unpack_from('!6B', buf, 10))
+        obj.queues = common.unpack_list_packet_queue(buffer(buf, 16))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.port != other.port: return False
+        if self.pad != other.pad: return False
+        if self.queues != other.queues: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("queue_get_config_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("port = ");
+                q.text(util.pretty_port(self.port))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("queues = ");
+                q.pp(self.queues)
+            q.breakable()
+        q.text('}')
+
+class queue_get_config_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_QUEUE_GET_CONFIG_REQUEST
+
+    def __init__(self, xid=None, port=None, pad=None):
+        self.xid = xid
+        if port != None:
+            self.port = port
+        else:
+            self.port = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0]
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.port))
+        packed.append(struct.pack("!2B", *self.pad))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = queue_get_config_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_QUEUE_GET_CONFIG_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 12: raise loxi.ProtocolError("queue_get_config_request length is %d, should be 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.port = struct.unpack_from('!H', buf, 8)[0]
+        obj.pad = list(struct.unpack_from('!2B', buf, 10))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.port != other.port: return False
+        if self.pad != other.pad: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("queue_get_config_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("port = ");
+                q.text(util.pretty_port(self.port))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+            q.breakable()
+        q.text('}')
+
+class queue_stats_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REPLY
+    stats_type = const.OFPST_QUEUE
+
+    def __init__(self, xid=None, flags=None, entries=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if entries != None:
+            self.entries = entries
+        else:
+            self.entries = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.entries]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = queue_stats_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 12: raise loxi.ProtocolError("queue_stats_reply length is %d, should be at least 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_QUEUE)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.entries = util.unpack_array(common.queue_stats_entry.unpack, 32, buffer(buf, 12))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.entries != other.entries: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("queue_stats_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("entries = ");
+                q.pp(self.entries)
+            q.breakable()
+        q.text('}')
+
+class queue_stats_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REQUEST
+    stats_type = const.OFPST_QUEUE
+
+    def __init__(self, xid=None, flags=None, port_no=None, pad=None, queue_id=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if port_no != None:
+            self.port_no = port_no
+        else:
+            self.port_no = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0]
+        if queue_id != None:
+            self.queue_id = queue_id
+        else:
+            self.queue_id = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!H", self.port_no))
+        packed.append(struct.pack("!2B", *self.pad))
+        packed.append(struct.pack("!L", self.queue_id))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = queue_stats_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 20: raise loxi.ProtocolError("queue_stats_request length is %d, should be 20" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_QUEUE)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.port_no = struct.unpack_from('!H', buf, 12)[0]
+        obj.pad = list(struct.unpack_from('!2B', buf, 14))
+        obj.queue_id = struct.unpack_from('!L', buf, 16)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.port_no != other.port_no: return False
+        if self.pad != other.pad: return False
+        if self.queue_id != other.queue_id: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("queue_stats_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("port_no = ");
+                q.text(util.pretty_port(self.port_no))
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("queue_id = ");
+                q.text("%#x" % self.queue_id)
+            q.breakable()
+        q.text('}')
+
+class set_config(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_SET_CONFIG
+
+    def __init__(self, xid=None, flags=None, miss_send_len=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if miss_send_len != None:
+            self.miss_send_len = miss_send_len
+        else:
+            self.miss_send_len = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append(struct.pack("!H", self.miss_send_len))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = set_config()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_SET_CONFIG)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 12: raise loxi.ProtocolError("set_config length is %d, should be 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.flags = struct.unpack_from('!H', buf, 8)[0]
+        obj.miss_send_len = struct.unpack_from('!H', buf, 10)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.miss_send_len != other.miss_send_len: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("set_config {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("miss_send_len = ");
+                q.text("%#x" % self.miss_send_len)
+            q.breakable()
+        q.text('}')
+
+class table_mod(Message):
+    version = const.OFP_VERSION
+    type = 22
+
+    def __init__(self, xid=None, table_id=None, pad=None, config=None):
+        self.xid = xid
+        if table_id != None:
+            self.table_id = table_id
+        else:
+            self.table_id = 0
+        if pad != None:
+            self.pad = pad
+        else:
+            self.pad = [0,0,0]
+        if config != None:
+            self.config = config
+        else:
+            self.config = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!B", self.table_id))
+        packed.append(struct.pack("!3B", *self.pad))
+        packed.append(struct.pack("!L", self.config))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = table_mod()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == 22)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 16: raise loxi.ProtocolError("table_mod length is %d, should be 16" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        obj.table_id = struct.unpack_from('!B', buf, 8)[0]
+        obj.pad = list(struct.unpack_from('!3B', buf, 9))
+        obj.config = struct.unpack_from('!L', buf, 12)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.table_id != other.table_id: return False
+        if self.pad != other.pad: return False
+        if self.config != other.config: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("table_mod {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("table_id = ");
+                q.text("%#x" % self.table_id)
+                q.text(","); q.breakable()
+                q.text("pad = ");
+                q.pp(self.pad)
+                q.text(","); q.breakable()
+                q.text("config = ");
+                q.text("%#x" % self.config)
+            q.breakable()
+        q.text('}')
+
+class table_stats_reply(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REPLY
+    stats_type = const.OFPST_TABLE
+
+    def __init__(self, xid=None, flags=None, entries=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+        if entries != None:
+            self.entries = entries
+        else:
+            self.entries = []
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        packed.append("".join([x.pack() for x in self.entries]))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = table_stats_reply()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REPLY)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length < 12: raise loxi.ProtocolError("table_stats_reply length is %d, should be at least 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_TABLE)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        obj.entries = util.unpack_array(common.table_stats_entry.unpack, 64, buffer(buf, 12))
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        if self.entries != other.entries: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("table_stats_reply {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+                q.text(","); q.breakable()
+                q.text("entries = ");
+                q.pp(self.entries)
+            q.breakable()
+        q.text('}')
+
+class table_stats_request(Message):
+    version = const.OFP_VERSION
+    type = const.OFPT_STATS_REQUEST
+    stats_type = const.OFPST_TABLE
+
+    def __init__(self, xid=None, flags=None):
+        self.xid = xid
+        if flags != None:
+            self.flags = flags
+        else:
+            self.flags = 0
+
+    def pack(self):
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        packed.append(struct.pack("!H", self.stats_type))
+        packed.append(struct.pack("!H", self.flags))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
+
+    @staticmethod
+    def unpack(buf):
+        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
+        obj = table_stats_request()
+        version = struct.unpack_from('!B', buf, 0)[0]
+        assert(version == const.OFP_VERSION)
+        type = struct.unpack_from('!B', buf, 1)[0]
+        assert(type == const.OFPT_STATS_REQUEST)
+        _length = struct.unpack_from('!H', buf, 2)[0]
+        assert(_length == len(buf))
+        if _length != 12: raise loxi.ProtocolError("table_stats_request length is %d, should be 12" % _length)
+        obj.xid = struct.unpack_from('!L', buf, 4)[0]
+        stats_type = struct.unpack_from('!H', buf, 8)[0]
+        assert(stats_type == const.OFPST_TABLE)
+        obj.flags = struct.unpack_from('!H', buf, 10)[0]
+        return obj
+
+    def __eq__(self, other):
+        if type(self) != type(other): return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
+        if self.flags != other.flags: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        import loxi.pp
+        return loxi.pp.pp(self)
+
+    def pretty_print(self, q):
+        q.text("table_stats_request {")
+        with q.group():
+            with q.indent(2):
+                q.breakable()
+                q.text("xid = ");
+                if self.xid != None:
+                    q.text("%#x" % self.xid)
+                else:
+                    q.text('None')
+                q.text(","); q.breakable()
+                q.text("flags = ");
+                q.text("%#x" % self.flags)
+            q.breakable()
+        q.text('}')
+
+
+def parse_header(buf):
+    if len(buf) < 8:
+        raise loxi.ProtocolError("too short to be an OpenFlow message")
+    return struct.unpack_from("!BBHL", buf)
+
+def parse_message(buf):
+    msg_ver, msg_type, msg_len, msg_xid = parse_header(buf)
+    if msg_ver != const.OFP_VERSION and msg_type != ofp.OFPT_HELLO:
+        raise loxi.ProtocolError("wrong OpenFlow version")
+    if len(buf) != msg_len:
+        raise loxi.ProtocolError("incorrect message size")
+    if msg_type in parsers:
+        return parsers[msg_type](buf)
+    else:
+        raise loxi.ProtocolError("unexpected message type")
+
+def parse_flow_mod(buf):
+    if len(buf) < 56 + 2:
+        raise loxi.ProtocolError("message too short")
+    cmd, = struct.unpack_from("!H", buf, 56)
+    if cmd in flow_mod_parsers:
+        return flow_mod_parsers[cmd](buf)
+    else:
+        raise loxi.ProtocolError("unexpected flow mod cmd %u" % cmd)
+
+def parse_stats_reply(buf):
+    if len(buf) < 8 + 2:
+        raise loxi.ProtocolError("message too short")
+    stats_type, = struct.unpack_from("!H", buf, 8)
+    if stats_type in stats_reply_parsers:
+        return stats_reply_parsers[stats_type](buf)
+    else:
+        raise loxi.ProtocolError("unexpected stats type %u" % stats_type)
+
+def parse_stats_request(buf):
+    if len(buf) < 8 + 2:
+        raise loxi.ProtocolError("message too short")
+    stats_type, = struct.unpack_from("!H", buf, 8)
+    if stats_type in stats_request_parsers:
+        return stats_request_parsers[stats_type](buf)
+    else:
+        raise loxi.ProtocolError("unexpected stats type %u" % stats_type)
+
+def parse_vendor(buf):
+    if len(buf) < 16:
+        raise loxi.ProtocolError("experimenter message too short")
+
+    experimenter, = struct.unpack_from("!L", buf, 8)
+    if experimenter == 0x005c16c7: # Big Switch Networks
+        subtype, = struct.unpack_from("!L", buf, 12)
+    elif experimenter == 0x00002320: # Nicira
+        subtype, = struct.unpack_from("!L", buf, 12)
+    else:
+        raise loxi.ProtocolError("unexpected experimenter id %#x" % experimenter)
+
+    if subtype in experimenter_parsers[experimenter]:
+        return experimenter_parsers[experimenter][subtype](buf)
+    else:
+        raise loxi.ProtocolError("unexpected experimenter %#x subtype %#x" % (experimenter, subtype))
+
+parsers = {
+    22 : table_mod.unpack,
+    const.OFPT_BARRIER_REPLY : barrier_reply.unpack,
+    const.OFPT_BARRIER_REQUEST : barrier_request.unpack,
+    const.OFPT_ECHO_REPLY : echo_reply.unpack,
+    const.OFPT_ECHO_REQUEST : echo_request.unpack,
+    const.OFPT_ERROR : error_msg.unpack,
+    const.OFPT_FEATURES_REPLY : features_reply.unpack,
+    const.OFPT_FEATURES_REQUEST : features_request.unpack,
+    const.OFPT_FLOW_MOD : parse_flow_mod,
+    const.OFPT_FLOW_REMOVED : flow_removed.unpack,
+    const.OFPT_GET_CONFIG_REPLY : get_config_reply.unpack,
+    const.OFPT_GET_CONFIG_REQUEST : get_config_request.unpack,
+    const.OFPT_HELLO : hello.unpack,
+    const.OFPT_PACKET_IN : packet_in.unpack,
+    const.OFPT_PACKET_OUT : packet_out.unpack,
+    const.OFPT_PORT_MOD : port_mod.unpack,
+    const.OFPT_PORT_STATUS : port_status.unpack,
+    const.OFPT_QUEUE_GET_CONFIG_REPLY : queue_get_config_reply.unpack,
+    const.OFPT_QUEUE_GET_CONFIG_REQUEST : queue_get_config_request.unpack,
+    const.OFPT_SET_CONFIG : set_config.unpack,
+    const.OFPT_STATS_REPLY : parse_stats_reply,
+    const.OFPT_STATS_REQUEST : parse_stats_request,
+    const.OFPT_VENDOR : parse_vendor,
+}
+
+flow_mod_parsers = {
+    const.OFPFC_ADD : flow_add.unpack,
+    const.OFPFC_MODIFY : flow_modify.unpack,
+    const.OFPFC_MODIFY_STRICT : flow_modify_strict.unpack,
+    const.OFPFC_DELETE : flow_delete.unpack,
+    const.OFPFC_DELETE_STRICT : flow_delete_strict.unpack,
+}
+
+stats_reply_parsers = {
+    const.OFPST_DESC : desc_stats_reply.unpack,
+    const.OFPST_FLOW : flow_stats_reply.unpack,
+    const.OFPST_AGGREGATE : aggregate_stats_reply.unpack,
+    const.OFPST_TABLE : table_stats_reply.unpack,
+    const.OFPST_PORT : port_stats_reply.unpack,
+    const.OFPST_QUEUE : queue_stats_reply.unpack,
+    const.OFPST_VENDOR : experimenter_stats_reply.unpack,
+}
+
+stats_request_parsers = {
+    const.OFPST_DESC : desc_stats_request.unpack,
+    const.OFPST_FLOW : flow_stats_request.unpack,
+    const.OFPST_AGGREGATE : aggregate_stats_request.unpack,
+    const.OFPST_TABLE : table_stats_request.unpack,
+    const.OFPST_PORT : port_stats_request.unpack,
+    const.OFPST_QUEUE : queue_stats_request.unpack,
+    const.OFPST_VENDOR : experimenter_stats_request.unpack,
+}
+
+experimenter_parsers = {
+    0x2320 : {
+        11: nicira_controller_role_reply.unpack,
+        10: nicira_controller_role_request.unpack,
+    },
+    0x5c16c7 : {
+        10: bsn_get_interfaces_reply.unpack,
+        9: bsn_get_interfaces_request.unpack,
+        2: bsn_get_ip_mask_reply.unpack,
+        1: bsn_get_ip_mask_request.unpack,
+        5: bsn_get_mirroring_reply.unpack,
+        4: bsn_get_mirroring_request.unpack,
+        0: bsn_set_ip_mask.unpack,
+        3: bsn_set_mirroring.unpack,
+        6: bsn_shell_command.unpack,
+        7: bsn_shell_output.unpack,
+        8: bsn_shell_status.unpack,
+    },
+}
diff --git a/src/python/loxi/of10/util.py b/src/python/loxi/of10/util.py
new file mode 100644
index 0000000..713d5cb
--- /dev/null
+++ b/src/python/loxi/of10/util.py
@@ -0,0 +1,64 @@
+#
+# Copyright 2012, 2013, Big Switch Networks, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Automatically generated by LOXI from template util.py
+# Do not modify
+
+import loxi
+import const
+
+def unpack_array(deserializer, element_size, buf):
+    """
+    Deserialize an array of fixed length elements.
+    The deserializer function should take a buffer and return the new object.
+    """
+    if len(buf) % element_size != 0: raise loxi.ProtocolError("invalid array length")
+    n = len(buf) / element_size
+    return [deserializer(buffer(buf, i*element_size, element_size)) for i in range(n)]
+
+def pretty_mac(mac):
+    return ':'.join(["%02x" % x for x in mac])
+
+def pretty_ipv4(v):
+    return "%d.%d.%d.%d" % ((v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF)
+
+def pretty_flags(v, flag_names):
+    set_flags = []
+    for flag_name in flag_names:
+        flag_value = getattr(const, flag_name)
+        if v & flag_value == flag_value:
+            set_flags.append(flag_name)
+        elif v & flag_value:
+            set_flags.append('%s&%#x' % (flag_name, v & flag_value))
+        v &= ~flag_value
+    if v:
+        set_flags.append("%#x" % v)
+    return '|'.join(set_flags) or '0'
+
+def pretty_wildcards(v):
+    if v == const.OFPFW_ALL:
+        return 'OFPFW_ALL'
+    flag_names = ['OFPFW_IN_PORT', 'OFPFW_DL_VLAN', 'OFPFW_DL_SRC', 'OFPFW_DL_DST',
+                  'OFPFW_DL_TYPE', 'OFPFW_NW_PROTO', 'OFPFW_TP_SRC', 'OFPFW_TP_DST',
+                  'OFPFW_NW_SRC_MASK', 'OFPFW_NW_DST_MASK', 'OFPFW_DL_VLAN_PCP',
+                  'OFPFW_NW_TOS']
+    return pretty_flags(v, flag_names)
+
+def pretty_port(v):
+    named_ports = [(k,v2) for (k,v2) in const.__dict__.iteritems() if k.startswith('OFPP_')]
+    for (k, v2) in named_ports:
+        if v == v2:
+            return k
+    return v
diff --git a/src/python/loxi/pp.py b/src/python/loxi/pp.py
new file mode 100644
index 0000000..852215d
--- /dev/null
+++ b/src/python/loxi/pp.py
@@ -0,0 +1,248 @@
+"""
+pp - port of Ruby's PP library
+Also based on Lindig, C., & GbR, G. D. (2000). Strictly Pretty.
+
+Example usage:
+>>> import pp.pp as pp
+>>> print pp([[1, 2], [3, 4]], maxwidth=15)
+[
+  [ 1, 2 ],
+  [ 3, 4 ]
+]
+"""
+import unittest
+from contextlib import contextmanager
+
+def pp(obj, maxwidth=79):
+    """
+    Pretty-print the given object.
+    """
+    ctx = PrettyPrinter(maxwidth=maxwidth)
+    ctx.pp(obj)
+    return str(ctx)
+
+
+## Pretty-printers for builtin classes
+
+def pretty_print_list(pp, obj):
+    with pp.group():
+        pp.text('[')
+        with pp.indent(2):
+            for v in obj:
+                if not pp.first(): pp.text(',')
+                pp.breakable()
+                pp.pp(v)
+        pp.breakable()
+        pp.text(']')
+
+def pretty_print_dict(pp, obj):
+    with pp.group():
+        pp.text('{')
+        with pp.indent(2):
+            for (k, v) in sorted(obj.items()):
+                if not pp.first(): pp.text(',')
+                pp.breakable()
+                pp.pp(k)
+                pp.text(': ')
+                pp.pp(v)
+        pp.breakable()
+        pp.text('}')
+
+pretty_printers = {
+    list: pretty_print_list,
+    dict: pretty_print_dict,
+}
+
+
+## Implementation
+
+class PrettyPrinter(object):
+    def __init__(self, maxwidth):
+        self.maxwidth = maxwidth
+        self.cur_indent = 0
+        self.root_group = Group()
+        self.group_stack = [self.root_group]
+
+    def current_group(self):
+        return self.group_stack[-1]
+
+    def text(self, s):
+        self.current_group().append(str(s))
+
+    def breakable(self, sep=' '):
+        self.current_group().append(Breakable(sep, self.cur_indent))
+
+    def first(self):
+        return self.current_group().first()
+
+    @contextmanager
+    def indent(self, n):
+        self.cur_indent += n
+        yield
+        self.cur_indent -= n
+
+    @contextmanager
+    def group(self):
+        self.group_stack.append(Group())
+        yield
+        new_group = self.group_stack.pop()
+        self.current_group().append(new_group)
+
+    def pp(self, obj):
+        if hasattr(obj, "pretty_print"):
+            obj.pretty_print(self)
+        elif type(obj) in pretty_printers:
+            pretty_printers[type(obj)](self, obj)
+        else:
+            self.text(repr(obj))
+
+    def __str__(self):
+        return self.root_group.render(0, self.maxwidth)
+
+class Group(object):
+    __slots__ = ["fragments", "length", "_first"]
+
+    def __init__(self):
+        self.fragments = []
+        self.length = 0
+        self._first = True
+
+    def append(self, x):
+        self.fragments.append(x)
+        self.length += len(x)
+
+    def first(self):
+        if self._first:
+            self._first = False
+            return True
+        return False
+
+    def __len__(self):
+        return self.length
+
+    def render(self, curwidth, maxwidth):
+        dobreak = len(self) > (maxwidth - curwidth)
+
+        a = []
+        for x in self.fragments:
+            if isinstance(x, Breakable):
+                if dobreak:
+                    a.append('\n')
+                    a.append(' ' * x.indent)
+                    curwidth = 0
+                else:
+                    a.append(x.sep)
+            elif isinstance(x, Group):
+                a.append(x.render(curwidth, maxwidth))
+            else:
+                a.append(x)
+            curwidth += len(a[-1])
+        return ''.join(a)
+
+class Breakable(object):
+    __slots__ = ["sep", "indent"]
+
+    def __init__(self, sep, indent):
+        self.sep = sep
+        self.indent = indent
+
+    def __len__(self):
+        return len(self.sep)
+
+
+## Tests
+
+class TestPP(unittest.TestCase):
+    def test_scalars(self):
+        self.assertEquals(pp(1), "1")
+        self.assertEquals(pp("foo"), "'foo'")
+
+    def test_hash(self):
+        expected = """{ 1: 'a', 'b': 2 }"""
+        self.assertEquals(pp(eval(expected)), expected)
+        expected = """\
+{
+  1: 'a',
+  'b': 2
+}"""
+        self.assertEquals(pp(eval(expected), maxwidth=0), expected)
+
+    def test_array(self):
+        expected = """[ 1, 'a', 2 ]"""
+        self.assertEquals(pp(eval(expected)), expected)
+        expected = """\
+[
+  1,
+  'a',
+  2
+]"""
+        self.assertEquals(pp(eval(expected), maxwidth=0), expected)
+
+    def test_nested(self):
+        expected = """[ [ 1, 2 ], [ 3, 4 ] ]"""
+        self.assertEquals(pp(eval(expected)), expected)
+        expected = """\
+[
+  [
+    1,
+    2
+  ],
+  [
+    3,
+    4
+  ]
+]"""
+        self.assertEquals(pp(eval(expected), maxwidth=0), expected)
+
+    def test_breaking(self):
+        expected = """\
+[
+  [ 1, 2 ],
+  'abcdefghijklmnopqrstuvwxyz'
+]"""
+        self.assertEquals(pp(eval(expected), maxwidth=24), expected)
+        expected = """\
+[
+  [ 'abcd', 2 ],
+  [ '0123456789' ],
+  [
+    '0123456789',
+    'abcdefghij'
+  ],
+  [ 'abcdefghijklmnop' ],
+  [
+    'abcdefghijklmnopq'
+  ],
+  { 'k': 'v' },
+  {
+    1: [ 2, [ 3, 4 ] ],
+    'foo': 'abcdefghijklmnop'
+  }
+]"""
+        self.assertEquals(pp(eval(expected), maxwidth=24), expected)
+        expected = """\
+[
+  [ 1, 2 ],
+  [ 3, 4 ]
+]"""
+        self.assertEquals(pp(eval(expected), maxwidth=15), expected)
+
+    # This is an edge case where our simpler algorithm breaks down.
+    @unittest.expectedFailure
+    def test_greedy_breaking(self):
+        expected = """\
+abc def
+ghijklmnopqrstuvwxyz\
+"""
+        pp = PrettyPrinter(maxwidth=8)
+        pp.text("abc")
+        with pp.group():
+            pp.breakable()
+        pp.text("def")
+        with pp.group():
+            pp.breakable()
+        pp.text("ghijklmnopqrstuvwxyz")
+        self.assertEquals(str(pp), expected)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/src/python/of10/__init__.py b/src/python/of10/__init__.py
deleted file mode 100644
index 2810be8..0000000
--- a/src/python/of10/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-Python OpenFlow 1.0 library
-
-Most of the files in this package are automatically generated by tools/munger.
-They are checked in to simplify running OFTest.
-"""
-
-__all__ = ["action_list", "action", "cstruct", "error", "message", "parse"]
-
-# Allow accessing constants through the top-level module
-from cstruct import *
-
-# Allow accessing submodules without additional imports
-import action
-import message
-import parse
diff --git a/src/python/of10/action.py b/src/python/of10/action.py
deleted file mode 100644
index c478c62..0000000
--- a/src/python/of10/action.py
+++ /dev/null
@@ -1,372 +0,0 @@
-
-# Python OpenFlow action wrapper classes
-
-from cstruct import *
-
-
-
-class vendor(ofp_action_vendor_header):
-    """
-    Wrapper class for vendor action object
-
-    Data members inherited from ofp_action_vendor_header:
-    @arg type
-    @arg len
-    @arg vendor
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_vendor_header.__init__(self)
-        self.type = OFPAT_VENDOR
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_vendor\n"
-        outstr += ofp_action_vendor_header.show(self, prefix)
-        return outstr
-
-action_vendor = vendor # for backwards compatibility
-
-
-class set_tp_dst(ofp_action_tp_port):
-    """
-    Wrapper class for set_tp_dst action object
-
-    Data members inherited from ofp_action_tp_port:
-    @arg type
-    @arg len
-    @arg tp_port
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_tp_port.__init__(self)
-        self.type = OFPAT_SET_TP_DST
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_tp_dst\n"
-        outstr += ofp_action_tp_port.show(self, prefix)
-        return outstr
-
-action_set_tp_dst = set_tp_dst # for backwards compatibility
-
-
-class set_vlan_pcp(ofp_action_vlan_pcp):
-    """
-    Wrapper class for set_vlan_pcp action object
-
-    Data members inherited from ofp_action_vlan_pcp:
-    @arg type
-    @arg len
-    @arg vlan_pcp
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_vlan_pcp.__init__(self)
-        self.type = OFPAT_SET_VLAN_PCP
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_vlan_pcp\n"
-        outstr += ofp_action_vlan_pcp.show(self, prefix)
-        return outstr
-
-action_set_vlan_pcp = set_vlan_pcp # for backwards compatibility
-
-
-class enqueue(ofp_action_enqueue):
-    """
-    Wrapper class for enqueue action object
-
-    Data members inherited from ofp_action_enqueue:
-    @arg type
-    @arg len
-    @arg port
-    @arg queue_id
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_enqueue.__init__(self)
-        self.type = OFPAT_ENQUEUE
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_enqueue\n"
-        outstr += ofp_action_enqueue.show(self, prefix)
-        return outstr
-
-action_enqueue = enqueue # for backwards compatibility
-
-
-class set_tp_src(ofp_action_tp_port):
-    """
-    Wrapper class for set_tp_src action object
-
-    Data members inherited from ofp_action_tp_port:
-    @arg type
-    @arg len
-    @arg tp_port
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_tp_port.__init__(self)
-        self.type = OFPAT_SET_TP_SRC
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_tp_src\n"
-        outstr += ofp_action_tp_port.show(self, prefix)
-        return outstr
-
-action_set_tp_src = set_tp_src # for backwards compatibility
-
-
-class set_nw_tos(ofp_action_nw_tos):
-    """
-    Wrapper class for set_nw_tos action object
-
-    Data members inherited from ofp_action_nw_tos:
-    @arg type
-    @arg len
-    @arg nw_tos
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_nw_tos.__init__(self)
-        self.type = OFPAT_SET_NW_TOS
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_tos\n"
-        outstr += ofp_action_nw_tos.show(self, prefix)
-        return outstr
-
-action_set_nw_tos = set_nw_tos # for backwards compatibility
-
-
-class set_nw_dst(ofp_action_nw_addr):
-    """
-    Wrapper class for set_nw_dst action object
-
-    Data members inherited from ofp_action_nw_addr:
-    @arg type
-    @arg len
-    @arg nw_addr
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_nw_addr.__init__(self)
-        self.type = OFPAT_SET_NW_DST
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_dst\n"
-        outstr += ofp_action_nw_addr.show(self, prefix)
-        return outstr
-
-action_set_nw_dst = set_nw_dst # for backwards compatibility
-
-
-class strip_vlan(ofp_action_header):
-    """
-    Wrapper class for strip_vlan action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_STRIP_VLAN
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_strip_vlan\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-action_strip_vlan = strip_vlan # for backwards compatibility
-
-
-class set_dl_dst(ofp_action_dl_addr):
-    """
-    Wrapper class for set_dl_dst action object
-
-    Data members inherited from ofp_action_dl_addr:
-    @arg type
-    @arg len
-    @arg dl_addr
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_dl_addr.__init__(self)
-        self.type = OFPAT_SET_DL_DST
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_dl_dst\n"
-        outstr += ofp_action_dl_addr.show(self, prefix)
-        return outstr
-
-action_set_dl_dst = set_dl_dst # for backwards compatibility
-
-
-class set_nw_src(ofp_action_nw_addr):
-    """
-    Wrapper class for set_nw_src action object
-
-    Data members inherited from ofp_action_nw_addr:
-    @arg type
-    @arg len
-    @arg nw_addr
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_nw_addr.__init__(self)
-        self.type = OFPAT_SET_NW_SRC
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_src\n"
-        outstr += ofp_action_nw_addr.show(self, prefix)
-        return outstr
-
-action_set_nw_src = set_nw_src # for backwards compatibility
-
-
-class set_vlan_vid(ofp_action_vlan_vid):
-    """
-    Wrapper class for set_vlan_vid action object
-
-    Data members inherited from ofp_action_vlan_vid:
-    @arg type
-    @arg len
-    @arg vlan_vid
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_vlan_vid.__init__(self)
-        self.type = OFPAT_SET_VLAN_VID
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_vlan_vid\n"
-        outstr += ofp_action_vlan_vid.show(self, prefix)
-        return outstr
-
-action_set_vlan_vid = set_vlan_vid # for backwards compatibility
-
-
-class set_dl_src(ofp_action_dl_addr):
-    """
-    Wrapper class for set_dl_src action object
-
-    Data members inherited from ofp_action_dl_addr:
-    @arg type
-    @arg len
-    @arg dl_addr
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_dl_addr.__init__(self)
-        self.type = OFPAT_SET_DL_SRC
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_dl_src\n"
-        outstr += ofp_action_dl_addr.show(self, prefix)
-        return outstr
-
-action_set_dl_src = set_dl_src # for backwards compatibility
-
-
-class output(ofp_action_output):
-    """
-    Wrapper class for output action object
-
-    Data members inherited from ofp_action_output:
-    @arg type
-    @arg len
-    @arg port
-    @arg max_len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_output.__init__(self)
-        self.type = OFPAT_OUTPUT
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_output\n"
-        outstr += ofp_action_output.show(self, prefix)
-        return outstr
-
-action_output = output # for backwards compatibility
-
-action_class_list = (
-    action_vendor,
-    action_set_tp_dst,
-    action_set_vlan_pcp,
-    action_enqueue,
-    action_set_tp_src,
-    action_set_nw_tos,
-    action_set_nw_dst,
-    action_strip_vlan,
-    action_set_dl_dst,
-    action_set_nw_src,
-    action_set_vlan_vid,
-    action_set_dl_src,
-    action_output)
diff --git a/src/python/of10/action_list.py b/src/python/of10/action_list.py
deleted file mode 100644
index fbbddea..0000000
--- a/src/python/of10/action_list.py
+++ /dev/null
@@ -1,189 +0,0 @@
-"""
-OpenFlow actions list class
-"""
-
-from action import *
-from cstruct import ofp_header
-import copy
-
-# # Map OFP action identifiers to the actual structures used on the wire
-# action_object_map = {
-#     OFPAT_OUTPUT                        : ofp_action_output,
-#     OFPAT_SET_VLAN_VID                  : ofp_action_vlan_vid,
-#     OFPAT_SET_VLAN_PCP                  : ofp_action_vlan_pcp,
-#     OFPAT_STRIP_VLAN                    : ofp_action_header,
-#     OFPAT_SET_DL_SRC                    : ofp_action_dl_addr,
-#     OFPAT_SET_DL_DST                    : ofp_action_dl_addr,
-#     OFPAT_SET_NW_SRC                    : ofp_action_nw_addr,
-#     OFPAT_SET_NW_DST                    : ofp_action_nw_addr,
-#     OFPAT_SET_NW_TOS                    : ofp_action_nw_tos,
-#     OFPAT_SET_TP_SRC                    : ofp_action_tp_port,
-#     OFPAT_SET_TP_DST                    : ofp_action_tp_port,
-#     OFPAT_ENQUEUE                       : ofp_action_enqueue
-# }
-
-action_object_map = {
-    OFPAT_OUTPUT                        : action_output,
-    OFPAT_SET_VLAN_VID                  : action_set_vlan_vid,
-    OFPAT_SET_VLAN_PCP                  : action_set_vlan_pcp,
-    OFPAT_STRIP_VLAN                    : action_strip_vlan,
-    OFPAT_SET_DL_SRC                    : action_set_dl_src,
-    OFPAT_SET_DL_DST                    : action_set_dl_dst,
-    OFPAT_SET_NW_SRC                    : action_set_nw_src,
-    OFPAT_SET_NW_DST                    : action_set_nw_dst,
-    OFPAT_SET_NW_TOS                    : action_set_nw_tos,
-    OFPAT_SET_TP_SRC                    : action_set_tp_src,
-    OFPAT_SET_TP_DST                    : action_set_tp_dst,
-    OFPAT_ENQUEUE                       : action_enqueue,
-    OFPAT_VENDOR                        : action_vendor
-}
-
-class action_list(object):
-    """
-    Maintain a list of actions
-
-    Data members:
-    @arg actions: An array of action objects such as action_output, etc.
-
-    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, actions=None):
-        if actions == None:
-            actions = []
-        self.actions = actions
-
-    def pack(self):
-        """
-        Pack a list of actions
-
-        Returns the packed string
-        """
-
-        packed = ""
-        for act in self.actions:
-            packed += act.pack()
-        return packed
-
-    def unpack(self, binary_string, bytes=None):
-        """
-        Unpack a list of actions
-        
-        Unpack actions 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 action list in bytes.  
-        Ignored if decode is True.  If 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 = ofp_action_header()
-            hdr.unpack(cur_string)
-            if hdr.len < OFP_ACTION_HEADER_BYTES:
-                print "ERROR: Action too short"
-                break
-            if not hdr.type in action_object_map.keys():
-                print "WARNING: Skipping unknown action ", hdr.type, hdr.len
-            else:
-                self.actions.append(action_object_map[hdr.type]())
-                self.actions[count].unpack(cur_string)
-                count += 1
-            cur_string = cur_string[hdr.len:]
-            bytes_done += hdr.len
-        return cur_string
-
-    def add(self, action):
-        """
-        Add an action to an action list
-
-        @param action The action to add
-
-        """
-        if not isinstance(action, action_class_list):
-            raise ValueError("%s is not an action" % type(action))
-        self.actions.append(copy.deepcopy(action))
-        return True # for backwards compatibility
-
-    def remove_type(self, type):
-        """
-        Remove the first action on the list of the given type
-
-        @param type The type of action to search
-
-        @return The object removed, if any; otherwise None
-
-        """
-        for index in xrange(len(self.actions)):
-            if self.actions[index].type == type:
-                return self.actions.pop(index)
-        return None
-
-    def find_type(self, type):
-        """
-        Find the first action on the list of the given type
-
-        @param type The type of action to search
-
-        @return The object with the matching type if any; otherwise None
-
-        """
-        for index in xrange(len(self.actions)):
-            if self.actions[index].type == type:
-                return self.actions[index]
-        return None
-
-    def extend(self, other):
-        """
-        Add the actions in other to this list
-
-        @param other An object of type action_list whose
-        entries are to be merged into this list
-
-        @return True if successful.  If not successful, the list
-        may have been modified.
-
-        @todo Check if this is proper deep copy or not
-
-        """
-        for act in other.actions:
-            self.add(act)
-        return True # for backwards compatibility
-        
-    def __len__(self):
-        length = 0
-        for act in self.actions:
-            length += act.__len__()
-        return length
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        if self.actions != other.actions: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-        
-    def show(self, prefix=''):
-        outstr = prefix + "Action List with " + str(len(self.actions)) + \
-            " actions\n"
-        count = 0
-        for obj in self.actions:
-            count += 1
-            outstr += prefix + "  Action " + str(count) + ": \n"
-            outstr += obj.show(prefix + '    ')
-        return outstr
diff --git a/src/python/of10/class_maps.py b/src/python/of10/class_maps.py
deleted file mode 100644
index 19600e6..0000000
--- a/src/python/of10/class_maps.py
+++ /dev/null
@@ -1,249 +0,0 @@
-
-# Class to array member map
-class_to_members_map = {
-    'ofp_phy_port'                  : [
-                                       'port_no',
-                                       'hw_addr',
-                                       'name',
-                                       'config',
-                                       'state',
-                                       'curr',
-                                       'advertised',
-                                       'supported',
-                                       'peer'
-                                      ],
-    'ofp_aggregate_stats_reply'     : [
-                                       'packet_count',
-                                       'byte_count',
-                                       'flow_count'
-                                      ],
-    'ofp_table_stats'               : [
-                                       'table_id',
-                                       'name',
-                                       'wildcards',
-                                       'max_entries',
-                                       'active_count',
-                                       'lookup_count',
-                                       'matched_count'
-                                      ],
-    'ofp_flow_removed'              : [
-                                       'match',
-                                       'cookie',
-                                       'priority',
-                                       'reason',
-                                       'duration_sec',
-                                       'duration_nsec',
-                                       'idle_timeout',
-                                       'packet_count',
-                                       'byte_count'
-                                      ],
-    'ofp_port_stats'                : [
-                                       'port_no',
-                                       'rx_packets',
-                                       'tx_packets',
-                                       'rx_bytes',
-                                       'tx_bytes',
-                                       'rx_dropped',
-                                       'tx_dropped',
-                                       'rx_errors',
-                                       'tx_errors',
-                                       'rx_frame_err',
-                                       'rx_over_err',
-                                       'rx_crc_err',
-                                       'collisions'
-                                      ],
-    'ofp_queue_stats'               : [
-                                       'port_no',
-                                       'queue_id',
-                                       'tx_bytes',
-                                       'tx_packets',
-                                       'tx_errors'
-                                      ],
-    'ofp_action_tp_port'            : [
-                                       'type',
-                                       'len',
-                                       'tp_port'
-                                      ],
-    'ofp_port_stats_request'        : [
-                                       'port_no'
-                                      ],
-    'ofp_stats_request'             : [
-                                       'type',
-                                       'flags'
-                                      ],
-    'ofp_aggregate_stats_request'   : [
-                                       'match',
-                                       'table_id',
-                                       'out_port'
-                                      ],
-    'ofp_port_status'               : [
-                                       'reason',
-                                       'desc'
-                                      ],
-    'ofp_action_header'             : [
-                                       'type',
-                                       'len'
-                                      ],
-    'ofp_port_mod'                  : [
-                                       'port_no',
-                                       'hw_addr',
-                                       'config',
-                                       'mask',
-                                       'advertise'
-                                      ],
-    'ofp_action_vlan_vid'           : [
-                                       'type',
-                                       'len',
-                                       'vlan_vid'
-                                      ],
-    'ofp_action_output'             : [
-                                       'type',
-                                       'len',
-                                       'port',
-                                       'max_len'
-                                      ],
-    'ofp_switch_config'             : [
-                                       'flags',
-                                       'miss_send_len'
-                                      ],
-    'ofp_action_nw_tos'             : [
-                                       'type',
-                                       'len',
-                                       'nw_tos'
-                                      ],
-    'ofp_queue_get_config_reply'    : [
-                                       'port'
-                                      ],
-    'ofp_packet_in'                 : [
-                                       'buffer_id',
-                                       'total_len',
-                                       'in_port',
-                                       'reason'
-                                      ],
-    'ofp_flow_stats'                : [
-                                       'length',
-                                       'table_id',
-                                       'match',
-                                       'duration_sec',
-                                       'duration_nsec',
-                                       'priority',
-                                       'idle_timeout',
-                                       'hard_timeout',
-                                       'cookie',
-                                       'packet_count',
-                                       'byte_count'
-                                      ],
-    'ofp_flow_stats_request'        : [
-                                       'match',
-                                       'table_id',
-                                       'out_port'
-                                      ],
-    'ofp_action_vendor_header'      : [
-                                       'type',
-                                       'len',
-                                       'vendor'
-                                      ],
-    'ofp_stats_reply'               : [
-                                       'type',
-                                       'flags'
-                                      ],
-    'ofp_queue_stats_request'       : [
-                                       'port_no',
-                                       'queue_id'
-                                      ],
-    'ofp_desc_stats'                : [
-                                       'mfr_desc',
-                                       'hw_desc',
-                                       'sw_desc',
-                                       'serial_num',
-                                       'dp_desc'
-                                      ],
-    'ofp_queue_get_config_request'  : [
-                                       'port'
-                                      ],
-    'ofp_packet_queue'              : [
-                                       'queue_id',
-                                       'len'
-                                      ],
-    'ofp_action_dl_addr'            : [
-                                       'type',
-                                       'len',
-                                       'dl_addr'
-                                      ],
-    'ofp_queue_prop_header'         : [
-                                       'property',
-                                       'len'
-                                      ],
-    'ofp_queue_prop_min_rate'       : [
-                                       'prop_header',
-                                       'rate'
-                                      ],
-    'ofp_action_enqueue'            : [
-                                       'type',
-                                       'len',
-                                       'port',
-                                       'queue_id'
-                                      ],
-    'ofp_switch_features'           : [
-                                       'datapath_id',
-                                       'n_buffers',
-                                       'n_tables',
-                                       'capabilities',
-                                       'actions'
-                                      ],
-    'ofp_match'                     : [
-                                       'wildcards',
-                                       'in_port',
-                                       'dl_src',
-                                       'dl_dst',
-                                       'dl_vlan',
-                                       'dl_vlan_pcp',
-                                       'dl_type',
-                                       'nw_tos',
-                                       'nw_proto',
-                                       'nw_src',
-                                       'nw_dst',
-                                       'tp_src',
-                                       'tp_dst'
-                                      ],
-    'ofp_header'                    : [
-                                       'version',
-                                       'type',
-                                       'length',
-                                       'xid'
-                                      ],
-    'ofp_vendor_header'             : [
-                                       'vendor'
-                                      ],
-    'ofp_packet_out'                : [
-                                       'buffer_id',
-                                       'in_port',
-                                       'actions_len'
-                                      ],
-    'ofp_action_nw_addr'            : [
-                                       'type',
-                                       'len',
-                                       'nw_addr'
-                                      ],
-    'ofp_action_vlan_pcp'           : [
-                                       'type',
-                                       'len',
-                                       'vlan_pcp'
-                                      ],
-    'ofp_flow_mod'                  : [
-                                       'match',
-                                       'cookie',
-                                       'command',
-                                       'idle_timeout',
-                                       'hard_timeout',
-                                       'priority',
-                                       'buffer_id',
-                                       'out_port',
-                                       'flags'
-                                      ],
-    'ofp_error_msg'                 : [
-                                       'type',
-                                       'code'
-                                      ],
-    '_ignore' : []
-}
diff --git a/src/python/of10/cstruct.py b/src/python/of10/cstruct.py
deleted file mode 100644
index a41e115..0000000
--- a/src/python/of10/cstruct.py
+++ /dev/null
@@ -1,4021 +0,0 @@
-import struct
-
-# Structure definitions
-class ofp_phy_port:
-    """Automatically generated Python class for ofp_phy_port
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.hw_addr= [0,0,0,0,0,0]
-        self.name= ""
-        self.config = 0
-        self.state = 0
-        self.curr = 0
-        self.advertised = 0
-        self.supported = 0
-        self.peer = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.hw_addr, list)):
-            return (False, "self.hw_addr is not list as expected.")
-        if(len(self.hw_addr) != 6):
-            return (False, "self.hw_addr is not of size 6 as expected.")
-        if(not isinstance(self.name, str)):
-            return (False, "self.name is not string as expected.")
-        if(len(self.name) > 16):
-            return (False, "self.name is not of size 16 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port_no)
-        packed += struct.pack("!BBBBBB", self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5])
-        packed += self.name.ljust(16,'\0')
-        packed += struct.pack("!LLLLLL", self.config, self.state, self.curr, self.advertised, self.supported, self.peer)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 48):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        self.name = binaryString[8:24].replace("\0","")
-        fmt = '!LLLLLL'
-        start = 24
-        end = start + struct.calcsize(fmt)
-        (self.config, self.state, self.curr, self.advertised, self.supported, self.peer) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[48:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 48
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.hw_addr !=  other.hw_addr: return False
-        if self.name !=  other.name: return False
-        if self.config !=  other.config: return False
-        if self.state !=  other.state: return False
-        if self.curr !=  other.curr: return False
-        if self.advertised !=  other.advertised: return False
-        if self.supported !=  other.supported: return False
-        if self.peer !=  other.peer: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'hw_addr: ' + str(self.hw_addr) + '\n'
-        outstr += prefix + 'name: ' + str(self.name) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'state: ' + str(self.state) + '\n'
-        outstr += prefix + 'curr: ' + str(self.curr) + '\n'
-        outstr += prefix + 'advertised: ' + str(self.advertised) + '\n'
-        outstr += prefix + 'supported: ' + str(self.supported) + '\n'
-        outstr += prefix + 'peer: ' + str(self.peer) + '\n'
-        return outstr
-
-
-class ofp_aggregate_stats_reply:
-    """Automatically generated Python class for ofp_aggregate_stats_reply
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.packet_count = 0
-        self.byte_count = 0
-        self.flow_count = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QQL", self.packet_count, self.byte_count, self.flow_count)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!QQL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count, self.flow_count) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 20
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        if self.flow_count !=  other.flow_count: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        outstr += prefix + 'flow_count: ' + str(self.flow_count) + '\n'
-        return outstr
-
-
-class ofp_table_stats:
-    """Automatically generated Python class for ofp_table_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad= [0,0,0]
-        self.name= ""
-        self.wildcards = 0
-        self.max_entries = 0
-        self.active_count = 0
-        self.lookup_count = 0
-        self.matched_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        if(not isinstance(self.name, str)):
-            return (False, "self.name is not string as expected.")
-        if(len(self.name) > 32):
-            return (False, "self.name is not of size 32 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += self.name.ljust(32,'\0')
-        packed += struct.pack("!LLLQQ", self.wildcards, self.max_entries, self.active_count, self.lookup_count, self.matched_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 64):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        self.name = binaryString[4:36].replace("\0","")
-        fmt = '!LLLQQ'
-        start = 36
-        end = start + struct.calcsize(fmt)
-        (self.wildcards, self.max_entries, self.active_count, self.lookup_count, self.matched_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[64:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 64
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.name !=  other.name: return False
-        if self.wildcards !=  other.wildcards: return False
-        if self.max_entries !=  other.max_entries: return False
-        if self.active_count !=  other.active_count: return False
-        if self.lookup_count !=  other.lookup_count: return False
-        if self.matched_count !=  other.matched_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'name: ' + str(self.name) + '\n'
-        outstr += prefix + 'wildcards: ' + str(self.wildcards) + '\n'
-        outstr += prefix + 'max_entries: ' + str(self.max_entries) + '\n'
-        outstr += prefix + 'active_count: ' + str(self.active_count) + '\n'
-        outstr += prefix + 'lookup_count: ' + str(self.lookup_count) + '\n'
-        outstr += prefix + 'matched_count: ' + str(self.matched_count) + '\n'
-        return outstr
-
-
-class ofp_flow_removed:
-    """Automatically generated Python class for ofp_flow_removed
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.match = ofp_match()
-        self.cookie = 0
-        self.priority = 0
-        self.reason = 0
-        self.pad = 0
-        self.duration_sec = 0
-        self.duration_nsec = 0
-        self.idle_timeout = 0
-        self.pad2= [0,0]
-        self.packet_count = 0
-        self.byte_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 2):
-            return (False, "self.pad2 is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.match.pack()
-        packed += struct.pack("!QHBBLLH", self.cookie, self.priority, self.reason, self.pad, self.duration_sec, self.duration_nsec, self.idle_timeout)
-        packed += struct.pack("!BB", self.pad2[0], self.pad2[1])
-        packed += struct.pack("!QQ", self.packet_count, self.byte_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 80):
-            return binaryString
-        self.match.unpack(binaryString[0:])
-        fmt = '!QHBBLLH'
-        start = 40
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.priority, self.reason, self.pad, self.duration_sec, self.duration_nsec, self.idle_timeout) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 62
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 64
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[80:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 80
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.match !=  other.match: return False
-        if self.cookie !=  other.cookie: return False
-        if self.priority !=  other.priority: return False
-        if self.reason !=  other.reason: return False
-        if self.pad !=  other.pad: return False
-        if self.duration_sec !=  other.duration_sec: return False
-        if self.duration_nsec !=  other.duration_nsec: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'duration_sec: ' + str(self.duration_sec) + '\n'
-        outstr += prefix + 'duration_nsec: ' + str(self.duration_nsec) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        return outstr
-
-
-class ofp_port_stats:
-    """Automatically generated Python class for ofp_port_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0,0,0]
-        self.rx_packets = 0
-        self.tx_packets = 0
-        self.rx_bytes = 0
-        self.tx_bytes = 0
-        self.rx_dropped = 0
-        self.tx_dropped = 0
-        self.rx_errors = 0
-        self.tx_errors = 0
-        self.rx_frame_err = 0
-        self.rx_over_err = 0
-        self.rx_crc_err = 0
-        self.collisions = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port_no)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        packed += struct.pack("!QQQQQQQQQQQQ", self.rx_packets, self.tx_packets, self.rx_bytes, self.tx_bytes, self.rx_dropped, self.tx_dropped, self.rx_errors, self.tx_errors, self.rx_frame_err, self.rx_over_err, self.rx_crc_err, self.collisions)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 104):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQQQQQQQQQQQ'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.rx_packets, self.tx_packets, self.rx_bytes, self.tx_bytes, self.rx_dropped, self.tx_dropped, self.rx_errors, self.tx_errors, self.rx_frame_err, self.rx_over_err, self.rx_crc_err, self.collisions) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[104:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 104
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.rx_packets !=  other.rx_packets: return False
-        if self.tx_packets !=  other.tx_packets: return False
-        if self.rx_bytes !=  other.rx_bytes: return False
-        if self.tx_bytes !=  other.tx_bytes: return False
-        if self.rx_dropped !=  other.rx_dropped: return False
-        if self.tx_dropped !=  other.tx_dropped: return False
-        if self.rx_errors !=  other.rx_errors: return False
-        if self.tx_errors !=  other.tx_errors: return False
-        if self.rx_frame_err !=  other.rx_frame_err: return False
-        if self.rx_over_err !=  other.rx_over_err: return False
-        if self.rx_crc_err !=  other.rx_crc_err: return False
-        if self.collisions !=  other.collisions: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'rx_packets: ' + str(self.rx_packets) + '\n'
-        outstr += prefix + 'tx_packets: ' + str(self.tx_packets) + '\n'
-        outstr += prefix + 'rx_bytes: ' + str(self.rx_bytes) + '\n'
-        outstr += prefix + 'tx_bytes: ' + str(self.tx_bytes) + '\n'
-        outstr += prefix + 'rx_dropped: ' + str(self.rx_dropped) + '\n'
-        outstr += prefix + 'tx_dropped: ' + str(self.tx_dropped) + '\n'
-        outstr += prefix + 'rx_errors: ' + str(self.rx_errors) + '\n'
-        outstr += prefix + 'tx_errors: ' + str(self.tx_errors) + '\n'
-        outstr += prefix + 'rx_frame_err: ' + str(self.rx_frame_err) + '\n'
-        outstr += prefix + 'rx_over_err: ' + str(self.rx_over_err) + '\n'
-        outstr += prefix + 'rx_crc_err: ' + str(self.rx_crc_err) + '\n'
-        outstr += prefix + 'collisions: ' + str(self.collisions) + '\n'
-        return outstr
-
-
-class ofp_queue_stats:
-    """Automatically generated Python class for ofp_queue_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0]
-        self.queue_id = 0
-        self.tx_bytes = 0
-        self.tx_packets = 0
-        self.tx_errors = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port_no)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        packed += struct.pack("!LQQQ", self.queue_id, self.tx_bytes, self.tx_packets, self.tx_errors)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 32):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LQQQ'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.queue_id, self.tx_bytes, self.tx_packets, self.tx_errors) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[32:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 32
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.queue_id !=  other.queue_id: return False
-        if self.tx_bytes !=  other.tx_bytes: return False
-        if self.tx_packets !=  other.tx_packets: return False
-        if self.tx_errors !=  other.tx_errors: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        outstr += prefix + 'tx_bytes: ' + str(self.tx_bytes) + '\n'
-        outstr += prefix + 'tx_packets: ' + str(self.tx_packets) + '\n'
-        outstr += prefix + 'tx_errors: ' + str(self.tx_errors) + '\n'
-        return outstr
-
-
-class ofp_action_tp_port:
-    """Automatically generated Python class for ofp_action_tp_port
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.tp_port = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.tp_port)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.tp_port) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.tp_port !=  other.tp_port: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'tp_port: ' + str(self.tp_port) + '\n'
-        return outstr
-
-
-class ofp_port_stats_request:
-    """Automatically generated Python class for ofp_port_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port_no)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        return outstr
-
-
-class ofp_stats_request:
-    """Automatically generated Python class for ofp_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.flags = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.flags)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.flags !=  other.flags: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        return outstr
-
-
-class ofp_hello:
-    """Automatically generated Python class for ofp_hello
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 0):
-            return binaryString
-        return binaryString[0:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 0
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        return outstr
-
-
-class ofp_aggregate_stats_request:
-    """Automatically generated Python class for ofp_aggregate_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.match = ofp_match()
-        self.table_id = 0
-        self.pad = 0
-        self.out_port = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.match.pack()
-        packed += struct.pack("!BBH", self.table_id, self.pad, self.out_port)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 44):
-            return binaryString
-        self.match.unpack(binaryString[0:])
-        fmt = '!BBH'
-        start = 40
-        end = start + struct.calcsize(fmt)
-        (self.table_id, self.pad, self.out_port) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[44:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 44
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.match !=  other.match: return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.out_port !=  other.out_port: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        return outstr
-
-
-class ofp_port_status:
-    """Automatically generated Python class for ofp_port_status
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.reason = 0
-        self.pad= [0,0,0,0,0,0,0]
-        self.desc = ofp_phy_port()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 7):
-            return (False, "self.pad is not of size 7 as expected.")
-        if(not isinstance(self.desc, ofp_phy_port)):
-            return (False, "self.desc is not class ofp_phy_port as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.reason)
-        packed += struct.pack("!BBBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6])
-        packed += self.desc.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 56):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.reason,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6]) = struct.unpack(fmt, binaryString[start:end])
-        self.desc.unpack(binaryString[8:])
-        return binaryString[56:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 56
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.reason !=  other.reason: return False
-        if self.pad !=  other.pad: return False
-        if self.desc !=  other.desc: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'desc: \n' 
-        outstr += self.desc.show(prefix + '  ')
-        return outstr
-
-
-class ofp_action_header:
-    """Automatically generated Python class for ofp_action_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_port_mod:
-    """Automatically generated Python class for ofp_port_mod
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.hw_addr= [0,0,0,0,0,0]
-        self.config = 0
-        self.mask = 0
-        self.advertise = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.hw_addr, list)):
-            return (False, "self.hw_addr is not list as expected.")
-        if(len(self.hw_addr) != 6):
-            return (False, "self.hw_addr is not of size 6 as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port_no)
-        packed += struct.pack("!BBBBBB", self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5])
-        packed += struct.pack("!LLL", self.config, self.mask, self.advertise)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LLL'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.config, self.mask, self.advertise) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 20
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.hw_addr !=  other.hw_addr: return False
-        if self.config !=  other.config: return False
-        if self.mask !=  other.mask: return False
-        if self.advertise !=  other.advertise: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'hw_addr: ' + str(self.hw_addr) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'mask: ' + str(self.mask) + '\n'
-        outstr += prefix + 'advertise: ' + str(self.advertise) + '\n'
-        return outstr
-
-
-class ofp_action_vlan_vid:
-    """Automatically generated Python class for ofp_action_vlan_vid
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.vlan_vid = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.vlan_vid)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.vlan_vid) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.vlan_vid !=  other.vlan_vid: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'vlan_vid: ' + str(self.vlan_vid) + '\n'
-        return outstr
-
-
-class ofp_action_output:
-    """Automatically generated Python class for ofp_action_output
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.port = 0
-        self.max_len = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHHH", self.type, self.len, self.port, self.max_len)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.port, self.max_len) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.port !=  other.port: return False
-        if self.max_len !=  other.max_len: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        outstr += prefix + 'max_len: ' + str(self.max_len) + '\n'
-        return outstr
-
-
-class ofp_switch_config:
-    """Automatically generated Python class for ofp_switch_config
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.flags = 0
-        self.miss_send_len = 128
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.flags, self.miss_send_len)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.flags, self.miss_send_len) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.flags !=  other.flags: return False
-        if self.miss_send_len !=  other.miss_send_len: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        outstr += prefix + 'miss_send_len: ' + str(self.miss_send_len) + '\n'
-        return outstr
-
-
-class ofp_action_nw_tos:
-    """Automatically generated Python class for ofp_action_nw_tos
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.nw_tos = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.nw_tos)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.nw_tos) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.nw_tos !=  other.nw_tos: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'nw_tos: ' + str(self.nw_tos) + '\n'
-        return outstr
-
-
-class ofp_queue_get_config_reply:
-    """Automatically generated Python class for ofp_queue_get_config_reply
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port !=  other.port: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        return outstr
-
-
-class ofp_packet_in:
-    """Automatically generated Python class for ofp_packet_in
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.buffer_id = 0
-        self.total_len = 0
-        self.in_port = 0
-        self.reason = 0
-        self.pad = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LHHBB", self.buffer_id, self.total_len, self.in_port, self.reason, self.pad)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 10):
-            return binaryString
-        fmt = '!LHHBB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.buffer_id, self.total_len, self.in_port, self.reason, self.pad) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[10:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 10
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.total_len !=  other.total_len: return False
-        if self.in_port !=  other.in_port: return False
-        if self.reason !=  other.reason: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'total_len: ' + str(self.total_len) + '\n'
-        outstr += prefix + 'in_port: ' + str(self.in_port) + '\n'
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        return outstr
-
-
-class ofp_flow_stats:
-    """Automatically generated Python class for ofp_flow_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.length = 0
-        self.table_id = 0
-        self.pad = 0
-        self.match = ofp_match()
-        self.duration_sec = 0
-        self.duration_nsec = 0
-        self.priority = 0x8000
-        self.idle_timeout = 0
-        self.hard_timeout = 0
-        self.pad2= [0,0,0,0,0,0]
-        self.cookie = 0
-        self.packet_count = 0
-        self.byte_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 6):
-            return (False, "self.pad2 is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HBB", self.length, self.table_id, self.pad)
-        packed += self.match.pack()
-        packed += struct.pack("!LLHHH", self.duration_sec, self.duration_nsec, self.priority, self.idle_timeout, self.hard_timeout)
-        packed += struct.pack("!BBBBBB", self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3], self.pad2[4], self.pad2[5])
-        packed += struct.pack("!QQQ", self.cookie, self.packet_count, self.byte_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 88):
-            return binaryString
-        fmt = '!HBB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.length, self.table_id, self.pad) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[4:])
-        fmt = '!LLHHH'
-        start = 44
-        end = start + struct.calcsize(fmt)
-        (self.duration_sec, self.duration_nsec, self.priority, self.idle_timeout, self.hard_timeout) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 58
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3], self.pad2[4], self.pad2[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQQ'
-        start = 64
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[88:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 88
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.length !=  other.length: return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.match !=  other.match: return False
-        if self.duration_sec !=  other.duration_sec: return False
-        if self.duration_nsec !=  other.duration_nsec: return False
-        if self.priority !=  other.priority: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.hard_timeout !=  other.hard_timeout: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.cookie !=  other.cookie: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        outstr += prefix + 'duration_sec: ' + str(self.duration_sec) + '\n'
-        outstr += prefix + 'duration_nsec: ' + str(self.duration_nsec) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'hard_timeout: ' + str(self.hard_timeout) + '\n'
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        return outstr
-
-
-class ofp_flow_stats_request:
-    """Automatically generated Python class for ofp_flow_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.match = ofp_match()
-        self.table_id = 0
-        self.pad = 0
-        self.out_port = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.match.pack()
-        packed += struct.pack("!BBH", self.table_id, self.pad, self.out_port)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 44):
-            return binaryString
-        self.match.unpack(binaryString[0:])
-        fmt = '!BBH'
-        start = 40
-        end = start + struct.calcsize(fmt)
-        (self.table_id, self.pad, self.out_port) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[44:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 44
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.match !=  other.match: return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.out_port !=  other.out_port: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        return outstr
-
-
-class ofp_action_vendor_header:
-    """Automatically generated Python class for ofp_action_vendor_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.vendor = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.vendor)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.vendor) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.vendor !=  other.vendor: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'vendor: ' + str(self.vendor) + '\n'
-        return outstr
-
-
-class ofp_stats_reply:
-    """Automatically generated Python class for ofp_stats_reply
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.flags = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.flags)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.flags !=  other.flags: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        return outstr
-
-
-class ofp_queue_stats_request:
-    """Automatically generated Python class for ofp_queue_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0]
-        self.queue_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port_no)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        packed += struct.pack("!L", self.queue_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!L'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.queue_id,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.queue_id !=  other.queue_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        return outstr
-
-
-class ofp_desc_stats:
-    """Automatically generated Python class for ofp_desc_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.mfr_desc= ""
-        self.hw_desc= ""
-        self.sw_desc= ""
-        self.serial_num= ""
-        self.dp_desc= ""
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.mfr_desc, str)):
-            return (False, "self.mfr_desc is not string as expected.")
-        if(len(self.mfr_desc) > 256):
-            return (False, "self.mfr_desc is not of size 256 as expected.")
-        if(not isinstance(self.hw_desc, str)):
-            return (False, "self.hw_desc is not string as expected.")
-        if(len(self.hw_desc) > 256):
-            return (False, "self.hw_desc is not of size 256 as expected.")
-        if(not isinstance(self.sw_desc, str)):
-            return (False, "self.sw_desc is not string as expected.")
-        if(len(self.sw_desc) > 256):
-            return (False, "self.sw_desc is not of size 256 as expected.")
-        if(not isinstance(self.serial_num, str)):
-            return (False, "self.serial_num is not string as expected.")
-        if(len(self.serial_num) > 32):
-            return (False, "self.serial_num is not of size 32 as expected.")
-        if(not isinstance(self.dp_desc, str)):
-            return (False, "self.dp_desc is not string as expected.")
-        if(len(self.dp_desc) > 256):
-            return (False, "self.dp_desc is not of size 256 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.mfr_desc.ljust(256,'\0')
-        packed += self.hw_desc.ljust(256,'\0')
-        packed += self.sw_desc.ljust(256,'\0')
-        packed += self.serial_num.ljust(32,'\0')
-        packed += self.dp_desc.ljust(256,'\0')
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 1056):
-            return binaryString
-        self.mfr_desc = binaryString[0:256].replace("\0","")
-        self.hw_desc = binaryString[256:512].replace("\0","")
-        self.sw_desc = binaryString[512:768].replace("\0","")
-        self.serial_num = binaryString[768:800].replace("\0","")
-        self.dp_desc = binaryString[800:1056].replace("\0","")
-        return binaryString[1056:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 1056
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.mfr_desc !=  other.mfr_desc: return False
-        if self.hw_desc !=  other.hw_desc: return False
-        if self.sw_desc !=  other.sw_desc: return False
-        if self.serial_num !=  other.serial_num: return False
-        if self.dp_desc !=  other.dp_desc: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'mfr_desc: ' + str(self.mfr_desc) + '\n'
-        outstr += prefix + 'hw_desc: ' + str(self.hw_desc) + '\n'
-        outstr += prefix + 'sw_desc: ' + str(self.sw_desc) + '\n'
-        outstr += prefix + 'serial_num: ' + str(self.serial_num) + '\n'
-        outstr += prefix + 'dp_desc: ' + str(self.dp_desc) + '\n'
-        return outstr
-
-
-class ofp_queue_get_config_request:
-    """Automatically generated Python class for ofp_queue_get_config_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.port)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port !=  other.port: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        return outstr
-
-
-class ofp_packet_queue:
-    """Automatically generated Python class for ofp_packet_queue
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.queue_id = 0
-        self.len = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LH", self.queue_id, self.len)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.queue_id, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.queue_id !=  other.queue_id: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_action_dl_addr:
-    """Automatically generated Python class for ofp_action_dl_addr
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.dl_addr= [0,0,0,0,0,0]
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.dl_addr, list)):
-            return (False, "self.dl_addr is not list as expected.")
-        if(len(self.dl_addr) != 6):
-            return (False, "self.dl_addr is not of size 6 as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBBBB", self.dl_addr[0], self.dl_addr[1], self.dl_addr[2], self.dl_addr[3], self.dl_addr[4], self.dl_addr[5])
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.dl_addr[0], self.dl_addr[1], self.dl_addr[2], self.dl_addr[3], self.dl_addr[4], self.dl_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.dl_addr !=  other.dl_addr: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'dl_addr: ' + str(self.dl_addr) + '\n'
-        return outstr
-
-
-class ofp_queue_prop_header:
-    """Automatically generated Python class for ofp_queue_prop_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.property = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.property, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.property, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.property !=  other.property: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'property: ' + str(self.property) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_queue_prop_min_rate:
-    """Automatically generated Python class for ofp_queue_prop_min_rate
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.prop_header = ofp_queue_prop_header()
-        self.rate = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.prop_header, ofp_queue_prop_header)):
-            return (False, "self.prop_header is not class ofp_queue_prop_header as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.prop_header.pack()
-        packed += struct.pack("!H", self.rate)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        self.prop_header.unpack(binaryString[0:])
-        fmt = '!H'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.rate,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.prop_header !=  other.prop_header: return False
-        if self.rate !=  other.rate: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'prop_header: \n' 
-        outstr += self.prop_header.show(prefix + '  ')
-        outstr += prefix + 'rate: ' + str(self.rate) + '\n'
-        return outstr
-
-
-class ofp_action_enqueue:
-    """Automatically generated Python class for ofp_action_enqueue
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.port = 0
-        self.pad= [0,0,0,0,0,0]
-        self.queue_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.port)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        packed += struct.pack("!L", self.queue_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.port) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!L'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.queue_id,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.port !=  other.port: return False
-        if self.pad !=  other.pad: return False
-        if self.queue_id !=  other.queue_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        return outstr
-
-
-class ofp_switch_features:
-    """Automatically generated Python class for ofp_switch_features
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.datapath_id = 0
-        self.n_buffers = 0
-        self.n_tables = 0
-        self.pad= [0,0,0]
-        self.capabilities = 0
-        self.actions = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QLB", self.datapath_id, self.n_buffers, self.n_tables)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += struct.pack("!LL", self.capabilities, self.actions)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!QLB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.datapath_id, self.n_buffers, self.n_tables) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 13
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.capabilities, self.actions) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.datapath_id !=  other.datapath_id: return False
-        if self.n_buffers !=  other.n_buffers: return False
-        if self.n_tables !=  other.n_tables: return False
-        if self.pad !=  other.pad: return False
-        if self.capabilities !=  other.capabilities: return False
-        if self.actions !=  other.actions: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'datapath_id: ' + str(self.datapath_id) + '\n'
-        outstr += prefix + 'n_buffers: ' + str(self.n_buffers) + '\n'
-        outstr += prefix + 'n_tables: ' + str(self.n_tables) + '\n'
-        outstr += prefix + 'capabilities: ' + str(self.capabilities) + '\n'
-        outstr += prefix + 'actions: ' + str(self.actions) + '\n'
-        return outstr
-
-
-class ofp_match:
-    """Automatically generated Python class for ofp_match
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.wildcards = 0
-        self.in_port = 0
-        self.dl_src= [0,0,0,0,0,0]
-        self.dl_dst= [0,0,0,0,0,0]
-        self.dl_vlan = 0
-        self.dl_vlan_pcp = 0
-        self.pad1 = 0
-        self.dl_type = 0
-        self.nw_tos = 0
-        self.nw_proto = 0
-        self.pad2= [0,0]
-        self.nw_src = 0
-        self.nw_dst = 0
-        self.tp_src = 0
-        self.tp_dst = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.dl_src, list)):
-            return (False, "self.dl_src is not list as expected.")
-        if(len(self.dl_src) != 6):
-            return (False, "self.dl_src is not of size 6 as expected.")
-        if(not isinstance(self.dl_dst, list)):
-            return (False, "self.dl_dst is not list as expected.")
-        if(len(self.dl_dst) != 6):
-            return (False, "self.dl_dst is not of size 6 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 2):
-            return (False, "self.pad2 is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LH", self.wildcards, self.in_port)
-        packed += struct.pack("!BBBBBB", self.dl_src[0], self.dl_src[1], self.dl_src[2], self.dl_src[3], self.dl_src[4], self.dl_src[5])
-        packed += struct.pack("!BBBBBB", self.dl_dst[0], self.dl_dst[1], self.dl_dst[2], self.dl_dst[3], self.dl_dst[4], self.dl_dst[5])
-        packed += struct.pack("!HBBHBB", self.dl_vlan, self.dl_vlan_pcp, self.pad1, self.dl_type, self.nw_tos, self.nw_proto)
-        packed += struct.pack("!BB", self.pad2[0], self.pad2[1])
-        packed += struct.pack("!LLHH", self.nw_src, self.nw_dst, self.tp_src, self.tp_dst)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 40):
-            return binaryString
-        fmt = '!LH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.wildcards, self.in_port) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.dl_src[0], self.dl_src[1], self.dl_src[2], self.dl_src[3], self.dl_src[4], self.dl_src[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.dl_dst[0], self.dl_dst[1], self.dl_dst[2], self.dl_dst[3], self.dl_dst[4], self.dl_dst[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!HBBHBB'
-        start = 18
-        end = start + struct.calcsize(fmt)
-        (self.dl_vlan, self.dl_vlan_pcp, self.pad1, self.dl_type, self.nw_tos, self.nw_proto) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 26
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LLHH'
-        start = 28
-        end = start + struct.calcsize(fmt)
-        (self.nw_src, self.nw_dst, self.tp_src, self.tp_dst) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[40:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 40
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.wildcards !=  other.wildcards: return False
-        if self.in_port !=  other.in_port: return False
-        if self.dl_src !=  other.dl_src: return False
-        if self.dl_dst !=  other.dl_dst: return False
-        if self.dl_vlan !=  other.dl_vlan: return False
-        if self.dl_vlan_pcp !=  other.dl_vlan_pcp: return False
-        if self.pad1 !=  other.pad1: return False
-        if self.dl_type !=  other.dl_type: return False
-        if self.nw_tos !=  other.nw_tos: return False
-        if self.nw_proto !=  other.nw_proto: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.nw_src !=  other.nw_src: return False
-        if self.nw_dst !=  other.nw_dst: return False
-        if self.tp_src !=  other.tp_src: return False
-        if self.tp_dst !=  other.tp_dst: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'wildcards: ' + str(self.wildcards) + '\n'
-        outstr += prefix + 'in_port: ' + str(self.in_port) + '\n'
-        outstr += prefix + 'dl_src: ' + str(self.dl_src) + '\n'
-        outstr += prefix + 'dl_dst: ' + str(self.dl_dst) + '\n'
-        outstr += prefix + 'dl_vlan: ' + str(self.dl_vlan) + '\n'
-        outstr += prefix + 'dl_vlan_pcp: ' + str(self.dl_vlan_pcp) + '\n'
-        outstr += prefix + 'dl_type: ' + str(self.dl_type) + '\n'
-        outstr += prefix + 'nw_tos: ' + str(self.nw_tos) + '\n'
-        outstr += prefix + 'nw_proto: ' + str(self.nw_proto) + '\n'
-        outstr += prefix + 'nw_src: ' + str(self.nw_src) + '\n'
-        outstr += prefix + 'nw_dst: ' + str(self.nw_dst) + '\n'
-        outstr += prefix + 'tp_src: ' + str(self.tp_src) + '\n'
-        outstr += prefix + 'tp_dst: ' + str(self.tp_dst) + '\n'
-        return outstr
-
-
-class ofp_header:
-    """Automatically generated Python class for ofp_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.version = 0x01
-        self.type = 0
-        self.length = 0
-        self.xid = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if (not (self.type in ofp_type_map.keys())):
-            return (False, "type must have values from ofp_type_map.keys()")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!BBHL", self.version, self.type, self.length, self.xid)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!BBHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.version, self.type, self.length, self.xid) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.version !=  other.version: return False
-        if self.type !=  other.type: return False
-        if self.length !=  other.length: return False
-        if self.xid !=  other.xid: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'version: ' + str(self.version) + '\n'
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'xid: ' + str(self.xid) + '\n'
-        return outstr
-
-
-class ofp_vendor_header:
-    """Automatically generated Python class for ofp_vendor_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.vendor = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.vendor)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.vendor,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.vendor !=  other.vendor: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'vendor: ' + str(self.vendor) + '\n'
-        return outstr
-
-
-class ofp_packet_out:
-    """Automatically generated Python class for ofp_packet_out
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.buffer_id = 4294967295
-        self.in_port = 0
-        self.actions_len = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LHH", self.buffer_id, self.in_port, self.actions_len)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.buffer_id, self.in_port, self.actions_len) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.in_port !=  other.in_port: return False
-        if self.actions_len !=  other.actions_len: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'in_port: ' + str(self.in_port) + '\n'
-        outstr += prefix + 'actions_len: ' + str(self.actions_len) + '\n'
-        return outstr
-
-
-class ofp_action_nw_addr:
-    """Automatically generated Python class for ofp_action_nw_addr
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.nw_addr = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.nw_addr)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.nw_addr) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.nw_addr !=  other.nw_addr: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'nw_addr: ' + str(self.nw_addr) + '\n'
-        return outstr
-
-
-class ofp_action_vlan_pcp:
-    """Automatically generated Python class for ofp_action_vlan_pcp
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.vlan_pcp = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.vlan_pcp)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.vlan_pcp) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.vlan_pcp !=  other.vlan_pcp: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'vlan_pcp: ' + str(self.vlan_pcp) + '\n'
-        return outstr
-
-
-class ofp_flow_mod:
-    """Automatically generated Python class for ofp_flow_mod
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.match = ofp_match()
-        self.cookie = 0
-        self.command = 0
-        self.idle_timeout = 0
-        self.hard_timeout = 0
-        self.priority = 0x8000
-        self.buffer_id = 0
-        self.out_port = 0
-        self.flags = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.match.pack()
-        packed += struct.pack("!QHHHHLHH", self.cookie, self.command, self.idle_timeout, self.hard_timeout, self.priority, self.buffer_id, self.out_port, self.flags)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 64):
-            return binaryString
-        self.match.unpack(binaryString[0:])
-        fmt = '!QHHHHLHH'
-        start = 40
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.command, self.idle_timeout, self.hard_timeout, self.priority, self.buffer_id, self.out_port, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[64:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 64
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.match !=  other.match: return False
-        if self.cookie !=  other.cookie: return False
-        if self.command !=  other.command: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.hard_timeout !=  other.hard_timeout: return False
-        if self.priority !=  other.priority: return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.out_port !=  other.out_port: return False
-        if self.flags !=  other.flags: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'command: ' + str(self.command) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'hard_timeout: ' + str(self.hard_timeout) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        return outstr
-
-
-class ofp_error_msg:
-    """Automatically generated Python class for ofp_error_msg
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.code = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.code)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.code) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.code !=  other.code: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'code: ' + str(self.code) + '\n'
-        return outstr
-
-
-# Enumerated type definitions
-ofp_error_type = ['OFPET_HELLO_FAILED', 'OFPET_BAD_REQUEST', 'OFPET_BAD_ACTION', 'OFPET_FLOW_MOD_FAILED', 'OFPET_PORT_MOD_FAILED', 'OFPET_QUEUE_OP_FAILED']
-OFPET_HELLO_FAILED                  = 0
-OFPET_BAD_REQUEST                   = 1
-OFPET_BAD_ACTION                    = 2
-OFPET_FLOW_MOD_FAILED               = 3
-OFPET_PORT_MOD_FAILED               = 4
-OFPET_QUEUE_OP_FAILED               = 5
-ofp_error_type_map = {
-    0                               : 'OFPET_HELLO_FAILED',
-    1                               : 'OFPET_BAD_REQUEST',
-    2                               : 'OFPET_BAD_ACTION',
-    3                               : 'OFPET_FLOW_MOD_FAILED',
-    4                               : 'OFPET_PORT_MOD_FAILED',
-    5                               : 'OFPET_QUEUE_OP_FAILED'
-}
-
-ofp_flow_mod_flags = ['OFPFF_SEND_FLOW_REM', 'OFPFF_CHECK_OVERLAP', 'OFPFF_EMERG']
-OFPFF_SEND_FLOW_REM                 = 1
-OFPFF_CHECK_OVERLAP                 = 2
-OFPFF_EMERG                         = 4
-ofp_flow_mod_flags_map = {
-    1                               : 'OFPFF_SEND_FLOW_REM',
-    2                               : 'OFPFF_CHECK_OVERLAP',
-    4                               : 'OFPFF_EMERG'
-}
-
-ofp_stats_reply_flags = ['OFPSF_REPLY_MORE']
-OFPSF_REPLY_MORE                    = 1
-ofp_stats_reply_flags_map = {
-    1                               : 'OFPSF_REPLY_MORE'
-}
-
-ofp_flow_mod_failed_code = ['OFPFMFC_ALL_TABLES_FULL', 'OFPFMFC_OVERLAP', 'OFPFMFC_EPERM', 'OFPFMFC_BAD_EMERG_TIMEOUT', 'OFPFMFC_BAD_COMMAND', 'OFPFMFC_UNSUPPORTED']
-OFPFMFC_ALL_TABLES_FULL             = 0
-OFPFMFC_OVERLAP                     = 1
-OFPFMFC_EPERM                       = 2
-OFPFMFC_BAD_EMERG_TIMEOUT           = 3
-OFPFMFC_BAD_COMMAND                 = 4
-OFPFMFC_UNSUPPORTED                 = 5
-ofp_flow_mod_failed_code_map = {
-    0                               : 'OFPFMFC_ALL_TABLES_FULL',
-    1                               : 'OFPFMFC_OVERLAP',
-    2                               : 'OFPFMFC_EPERM',
-    3                               : 'OFPFMFC_BAD_EMERG_TIMEOUT',
-    4                               : 'OFPFMFC_BAD_COMMAND',
-    5                               : 'OFPFMFC_UNSUPPORTED'
-}
-
-ofp_port_config = ['OFPPC_PORT_DOWN', 'OFPPC_NO_STP', 'OFPPC_NO_RECV', 'OFPPC_NO_RECV_STP', 'OFPPC_NO_FLOOD', 'OFPPC_NO_FWD', 'OFPPC_NO_PACKET_IN']
-OFPPC_PORT_DOWN                     = 1
-OFPPC_NO_STP                        = 2
-OFPPC_NO_RECV                       = 4
-OFPPC_NO_RECV_STP                   = 8
-OFPPC_NO_FLOOD                      = 16
-OFPPC_NO_FWD                        = 32
-OFPPC_NO_PACKET_IN                  = 64
-ofp_port_config_map = {
-    1                               : 'OFPPC_PORT_DOWN',
-    2                               : 'OFPPC_NO_STP',
-    4                               : 'OFPPC_NO_RECV',
-    8                               : 'OFPPC_NO_RECV_STP',
-    16                              : 'OFPPC_NO_FLOOD',
-    32                              : 'OFPPC_NO_FWD',
-    64                              : 'OFPPC_NO_PACKET_IN'
-}
-
-ofp_port_state = ['OFPPS_LINK_DOWN', 'OFPPS_STP_LISTEN', 'OFPPS_STP_LEARN', 'OFPPS_STP_FORWARD', 'OFPPS_STP_BLOCK', 'OFPPS_STP_MASK']
-OFPPS_LINK_DOWN                     = 1
-OFPPS_STP_LISTEN                    = 0
-OFPPS_STP_LEARN                     = 256
-OFPPS_STP_FORWARD                   = 512
-OFPPS_STP_BLOCK                     = 768
-OFPPS_STP_MASK                      = 768
-ofp_port_state_map = {
-    1                               : 'OFPPS_LINK_DOWN',
-    0                               : 'OFPPS_STP_LISTEN',
-    256                             : 'OFPPS_STP_LEARN',
-    512                             : 'OFPPS_STP_FORWARD',
-    768                             : 'OFPPS_STP_BLOCK',
-    768                             : 'OFPPS_STP_MASK'
-}
-
-ofp_config_flags = ['OFPC_FRAG_NORMAL', 'OFPC_FRAG_DROP', 'OFPC_FRAG_REASM', 'OFPC_FRAG_MASK']
-OFPC_FRAG_NORMAL                    = 0
-OFPC_FRAG_DROP                      = 1
-OFPC_FRAG_REASM                     = 2
-OFPC_FRAG_MASK                      = 3
-ofp_config_flags_map = {
-    0                               : 'OFPC_FRAG_NORMAL',
-    1                               : 'OFPC_FRAG_DROP',
-    2                               : 'OFPC_FRAG_REASM',
-    3                               : 'OFPC_FRAG_MASK'
-}
-
-ofp_hello_failed_code = ['OFPHFC_INCOMPATIBLE', 'OFPHFC_EPERM']
-OFPHFC_INCOMPATIBLE                 = 0
-OFPHFC_EPERM                        = 1
-ofp_hello_failed_code_map = {
-    0                               : 'OFPHFC_INCOMPATIBLE',
-    1                               : 'OFPHFC_EPERM'
-}
-
-ofp_capabilities = ['OFPC_FLOW_STATS', 'OFPC_TABLE_STATS', 'OFPC_PORT_STATS', 'OFPC_STP', 'OFPC_RESERVED', 'OFPC_IP_REASM', 'OFPC_QUEUE_STATS', 'OFPC_ARP_MATCH_IP']
-OFPC_FLOW_STATS                     = 1
-OFPC_TABLE_STATS                    = 2
-OFPC_PORT_STATS                     = 4
-OFPC_STP                            = 8
-OFPC_RESERVED                       = 16
-OFPC_IP_REASM                       = 32
-OFPC_QUEUE_STATS                    = 64
-OFPC_ARP_MATCH_IP                   = 128
-ofp_capabilities_map = {
-    1                               : 'OFPC_FLOW_STATS',
-    2                               : 'OFPC_TABLE_STATS',
-    4                               : 'OFPC_PORT_STATS',
-    8                               : 'OFPC_STP',
-    16                              : 'OFPC_RESERVED',
-    32                              : 'OFPC_IP_REASM',
-    64                              : 'OFPC_QUEUE_STATS',
-    128                             : 'OFPC_ARP_MATCH_IP'
-}
-
-ofp_flow_removed_reason = ['OFPRR_IDLE_TIMEOUT', 'OFPRR_HARD_TIMEOUT', 'OFPRR_DELETE']
-OFPRR_IDLE_TIMEOUT                  = 0
-OFPRR_HARD_TIMEOUT                  = 1
-OFPRR_DELETE                        = 2
-ofp_flow_removed_reason_map = {
-    0                               : 'OFPRR_IDLE_TIMEOUT',
-    1                               : 'OFPRR_HARD_TIMEOUT',
-    2                               : 'OFPRR_DELETE'
-}
-
-ofp_queue_properties = ['OFPQT_NONE', 'OFPQT_MIN_RATE']
-OFPQT_NONE                          = 0
-OFPQT_MIN_RATE                      = 0
-ofp_queue_properties_map = {
-    0                               : 'OFPQT_NONE',
-    0                               : 'OFPQT_MIN_RATE'
-}
-
-ofp_flow_wildcards = ['OFPFW_IN_PORT', 'OFPFW_DL_VLAN', 'OFPFW_DL_SRC', 'OFPFW_DL_DST', 'OFPFW_DL_TYPE', 'OFPFW_NW_PROTO', 'OFPFW_TP_SRC', 'OFPFW_TP_DST', 'OFPFW_NW_SRC_SHIFT', 'OFPFW_NW_SRC_BITS', 'OFPFW_NW_SRC_MASK', 'OFPFW_NW_SRC_ALL', 'OFPFW_NW_DST_SHIFT', 'OFPFW_NW_DST_BITS', 'OFPFW_NW_DST_MASK', 'OFPFW_NW_DST_ALL', 'OFPFW_DL_VLAN_PCP', 'OFPFW_NW_TOS', 'OFPFW_ALL']
-OFPFW_IN_PORT                       = 1
-OFPFW_DL_VLAN                       = 2
-OFPFW_DL_SRC                        = 4
-OFPFW_DL_DST                        = 8
-OFPFW_DL_TYPE                       = 16
-OFPFW_NW_PROTO                      = 32
-OFPFW_TP_SRC                        = 64
-OFPFW_TP_DST                        = 128
-OFPFW_NW_SRC_SHIFT                  = 8
-OFPFW_NW_SRC_BITS                   = 6
-OFPFW_NW_SRC_MASK                   = 16128
-OFPFW_NW_SRC_ALL                    = 8192
-OFPFW_NW_DST_SHIFT                  = 14
-OFPFW_NW_DST_BITS                   = 6
-OFPFW_NW_DST_MASK                   = 1032192
-OFPFW_NW_DST_ALL                    = 524288
-OFPFW_DL_VLAN_PCP                   = 1048576
-OFPFW_NW_TOS                        = 2097152
-OFPFW_ALL                           = 4194303
-ofp_flow_wildcards_map = {
-    1                               : 'OFPFW_IN_PORT',
-    2                               : 'OFPFW_DL_VLAN',
-    4                               : 'OFPFW_DL_SRC',
-    8                               : 'OFPFW_DL_DST',
-    16                              : 'OFPFW_DL_TYPE',
-    32                              : 'OFPFW_NW_PROTO',
-    64                              : 'OFPFW_TP_SRC',
-    128                             : 'OFPFW_TP_DST',
-    8                               : 'OFPFW_NW_SRC_SHIFT',
-    6                               : 'OFPFW_NW_SRC_BITS',
-    16128                           : 'OFPFW_NW_SRC_MASK',
-    8192                            : 'OFPFW_NW_SRC_ALL',
-    14                              : 'OFPFW_NW_DST_SHIFT',
-    6                               : 'OFPFW_NW_DST_BITS',
-    1032192                         : 'OFPFW_NW_DST_MASK',
-    524288                          : 'OFPFW_NW_DST_ALL',
-    1048576                         : 'OFPFW_DL_VLAN_PCP',
-    2097152                         : 'OFPFW_NW_TOS',
-    4194303                         : 'OFPFW_ALL'
-}
-
-ofp_port_reason = ['OFPPR_ADD', 'OFPPR_DELETE', 'OFPPR_MODIFY']
-OFPPR_ADD                           = 0
-OFPPR_DELETE                        = 1
-OFPPR_MODIFY                        = 2
-ofp_port_reason_map = {
-    0                               : 'OFPPR_ADD',
-    1                               : 'OFPPR_DELETE',
-    2                               : 'OFPPR_MODIFY'
-}
-
-ofp_action_type = ['OFPAT_OUTPUT', 'OFPAT_SET_VLAN_VID', 'OFPAT_SET_VLAN_PCP', 'OFPAT_STRIP_VLAN', 'OFPAT_SET_DL_SRC', 'OFPAT_SET_DL_DST', 'OFPAT_SET_NW_SRC', 'OFPAT_SET_NW_DST', 'OFPAT_SET_NW_TOS', 'OFPAT_SET_TP_SRC', 'OFPAT_SET_TP_DST', 'OFPAT_ENQUEUE', 'OFPAT_VENDOR']
-OFPAT_OUTPUT                        = 0
-OFPAT_SET_VLAN_VID                  = 1
-OFPAT_SET_VLAN_PCP                  = 2
-OFPAT_STRIP_VLAN                    = 3
-OFPAT_SET_DL_SRC                    = 4
-OFPAT_SET_DL_DST                    = 5
-OFPAT_SET_NW_SRC                    = 6
-OFPAT_SET_NW_DST                    = 7
-OFPAT_SET_NW_TOS                    = 8
-OFPAT_SET_TP_SRC                    = 9
-OFPAT_SET_TP_DST                    = 10
-OFPAT_ENQUEUE                       = 11
-OFPAT_VENDOR                        = 65535
-ofp_action_type_map = {
-    0                               : 'OFPAT_OUTPUT',
-    1                               : 'OFPAT_SET_VLAN_VID',
-    2                               : 'OFPAT_SET_VLAN_PCP',
-    3                               : 'OFPAT_STRIP_VLAN',
-    4                               : 'OFPAT_SET_DL_SRC',
-    5                               : 'OFPAT_SET_DL_DST',
-    6                               : 'OFPAT_SET_NW_SRC',
-    7                               : 'OFPAT_SET_NW_DST',
-    8                               : 'OFPAT_SET_NW_TOS',
-    9                               : 'OFPAT_SET_TP_SRC',
-    10                              : 'OFPAT_SET_TP_DST',
-    11                              : 'OFPAT_ENQUEUE',
-    65535                           : 'OFPAT_VENDOR'
-}
-
-ofp_flow_mod_command = ['OFPFC_ADD', 'OFPFC_MODIFY', 'OFPFC_MODIFY_STRICT', 'OFPFC_DELETE', 'OFPFC_DELETE_STRICT']
-OFPFC_ADD                           = 0
-OFPFC_MODIFY                        = 1
-OFPFC_MODIFY_STRICT                 = 2
-OFPFC_DELETE                        = 3
-OFPFC_DELETE_STRICT                 = 4
-ofp_flow_mod_command_map = {
-    0                               : 'OFPFC_ADD',
-    1                               : 'OFPFC_MODIFY',
-    2                               : 'OFPFC_MODIFY_STRICT',
-    3                               : 'OFPFC_DELETE',
-    4                               : 'OFPFC_DELETE_STRICT'
-}
-
-ofp_queue_op_failed_code = ['OFPQOFC_BAD_PORT', 'OFPQOFC_BAD_QUEUE', 'OFPQOFC_EPERM']
-OFPQOFC_BAD_PORT                    = 0
-OFPQOFC_BAD_QUEUE                   = 1
-OFPQOFC_EPERM                       = 2
-ofp_queue_op_failed_code_map = {
-    0                               : 'OFPQOFC_BAD_PORT',
-    1                               : 'OFPQOFC_BAD_QUEUE',
-    2                               : 'OFPQOFC_EPERM'
-}
-
-ofp_port = ['OFPP_MAX', 'OFPP_IN_PORT', 'OFPP_TABLE', 'OFPP_NORMAL', 'OFPP_FLOOD', 'OFPP_ALL', 'OFPP_CONTROLLER', 'OFPP_LOCAL', 'OFPP_NONE']
-OFPP_MAX                            = 65280
-OFPP_IN_PORT                        = 65528
-OFPP_TABLE                          = 65529
-OFPP_NORMAL                         = 65530
-OFPP_FLOOD                          = 65531
-OFPP_ALL                            = 65532
-OFPP_CONTROLLER                     = 65533
-OFPP_LOCAL                          = 65534
-OFPP_NONE                           = 65535
-ofp_port_map = {
-    65280                           : 'OFPP_MAX',
-    65528                           : 'OFPP_IN_PORT',
-    65529                           : 'OFPP_TABLE',
-    65530                           : 'OFPP_NORMAL',
-    65531                           : 'OFPP_FLOOD',
-    65532                           : 'OFPP_ALL',
-    65533                           : 'OFPP_CONTROLLER',
-    65534                           : 'OFPP_LOCAL',
-    65535                           : 'OFPP_NONE'
-}
-
-ofp_bad_action_code = ['OFPBAC_BAD_TYPE', 'OFPBAC_BAD_LEN', 'OFPBAC_BAD_VENDOR', 'OFPBAC_BAD_VENDOR_TYPE', 'OFPBAC_BAD_OUT_PORT', 'OFPBAC_BAD_ARGUMENT', 'OFPBAC_EPERM', 'OFPBAC_TOO_MANY', 'OFPBAC_BAD_QUEUE']
-OFPBAC_BAD_TYPE                     = 0
-OFPBAC_BAD_LEN                      = 1
-OFPBAC_BAD_VENDOR                   = 2
-OFPBAC_BAD_VENDOR_TYPE              = 3
-OFPBAC_BAD_OUT_PORT                 = 4
-OFPBAC_BAD_ARGUMENT                 = 5
-OFPBAC_EPERM                        = 6
-OFPBAC_TOO_MANY                     = 7
-OFPBAC_BAD_QUEUE                    = 8
-ofp_bad_action_code_map = {
-    0                               : 'OFPBAC_BAD_TYPE',
-    1                               : 'OFPBAC_BAD_LEN',
-    2                               : 'OFPBAC_BAD_VENDOR',
-    3                               : 'OFPBAC_BAD_VENDOR_TYPE',
-    4                               : 'OFPBAC_BAD_OUT_PORT',
-    5                               : 'OFPBAC_BAD_ARGUMENT',
-    6                               : 'OFPBAC_EPERM',
-    7                               : 'OFPBAC_TOO_MANY',
-    8                               : 'OFPBAC_BAD_QUEUE'
-}
-
-ofp_bad_request_code = ['OFPBRC_BAD_VERSION', 'OFPBRC_BAD_TYPE', 'OFPBRC_BAD_STAT', 'OFPBRC_BAD_VENDOR', 'OFPBRC_BAD_SUBTYPE', 'OFPBRC_EPERM', 'OFPBRC_BAD_LEN', 'OFPBRC_BUFFER_EMPTY', 'OFPBRC_BUFFER_UNKNOWN']
-OFPBRC_BAD_VERSION                  = 0
-OFPBRC_BAD_TYPE                     = 1
-OFPBRC_BAD_STAT                     = 2
-OFPBRC_BAD_VENDOR                   = 3
-OFPBRC_BAD_SUBTYPE                  = 4
-OFPBRC_EPERM                        = 5
-OFPBRC_BAD_LEN                      = 6
-OFPBRC_BUFFER_EMPTY                 = 7
-OFPBRC_BUFFER_UNKNOWN               = 8
-ofp_bad_request_code_map = {
-    0                               : 'OFPBRC_BAD_VERSION',
-    1                               : 'OFPBRC_BAD_TYPE',
-    2                               : 'OFPBRC_BAD_STAT',
-    3                               : 'OFPBRC_BAD_VENDOR',
-    4                               : 'OFPBRC_BAD_SUBTYPE',
-    5                               : 'OFPBRC_EPERM',
-    6                               : 'OFPBRC_BAD_LEN',
-    7                               : 'OFPBRC_BUFFER_EMPTY',
-    8                               : 'OFPBRC_BUFFER_UNKNOWN'
-}
-
-ofp_port_features = ['OFPPF_10MB_HD', 'OFPPF_10MB_FD', 'OFPPF_100MB_HD', 'OFPPF_100MB_FD', 'OFPPF_1GB_HD', 'OFPPF_1GB_FD', 'OFPPF_10GB_FD', 'OFPPF_COPPER', 'OFPPF_FIBER', 'OFPPF_AUTONEG', 'OFPPF_PAUSE', 'OFPPF_PAUSE_ASYM']
-OFPPF_10MB_HD                       = 1
-OFPPF_10MB_FD                       = 2
-OFPPF_100MB_HD                      = 4
-OFPPF_100MB_FD                      = 8
-OFPPF_1GB_HD                        = 16
-OFPPF_1GB_FD                        = 32
-OFPPF_10GB_FD                       = 64
-OFPPF_COPPER                        = 128
-OFPPF_FIBER                         = 256
-OFPPF_AUTONEG                       = 512
-OFPPF_PAUSE                         = 1024
-OFPPF_PAUSE_ASYM                    = 2048
-ofp_port_features_map = {
-    1                               : 'OFPPF_10MB_HD',
-    2                               : 'OFPPF_10MB_FD',
-    4                               : 'OFPPF_100MB_HD',
-    8                               : 'OFPPF_100MB_FD',
-    16                              : 'OFPPF_1GB_HD',
-    32                              : 'OFPPF_1GB_FD',
-    64                              : 'OFPPF_10GB_FD',
-    128                             : 'OFPPF_COPPER',
-    256                             : 'OFPPF_FIBER',
-    512                             : 'OFPPF_AUTONEG',
-    1024                            : 'OFPPF_PAUSE',
-    2048                            : 'OFPPF_PAUSE_ASYM'
-}
-
-ofp_type = ['OFPT_HELLO', 'OFPT_ERROR', 'OFPT_ECHO_REQUEST', 'OFPT_ECHO_REPLY', 'OFPT_VENDOR', 'OFPT_FEATURES_REQUEST', 'OFPT_FEATURES_REPLY', 'OFPT_GET_CONFIG_REQUEST', 'OFPT_GET_CONFIG_REPLY', 'OFPT_SET_CONFIG', 'OFPT_PACKET_IN', 'OFPT_FLOW_REMOVED', 'OFPT_PORT_STATUS', 'OFPT_PACKET_OUT', 'OFPT_FLOW_MOD', 'OFPT_PORT_MOD', 'OFPT_STATS_REQUEST', 'OFPT_STATS_REPLY', 'OFPT_BARRIER_REQUEST', 'OFPT_BARRIER_REPLY', 'OFPT_QUEUE_GET_CONFIG_REQUEST', 'OFPT_QUEUE_GET_CONFIG_REPLY']
-OFPT_HELLO                          = 0
-OFPT_ERROR                          = 1
-OFPT_ECHO_REQUEST                   = 2
-OFPT_ECHO_REPLY                     = 3
-OFPT_VENDOR                         = 4
-OFPT_FEATURES_REQUEST               = 5
-OFPT_FEATURES_REPLY                 = 6
-OFPT_GET_CONFIG_REQUEST             = 7
-OFPT_GET_CONFIG_REPLY               = 8
-OFPT_SET_CONFIG                     = 9
-OFPT_PACKET_IN                      = 10
-OFPT_FLOW_REMOVED                   = 11
-OFPT_PORT_STATUS                    = 12
-OFPT_PACKET_OUT                     = 13
-OFPT_FLOW_MOD                       = 14
-OFPT_PORT_MOD                       = 15
-OFPT_STATS_REQUEST                  = 16
-OFPT_STATS_REPLY                    = 17
-OFPT_BARRIER_REQUEST                = 18
-OFPT_BARRIER_REPLY                  = 19
-OFPT_QUEUE_GET_CONFIG_REQUEST       = 20
-OFPT_QUEUE_GET_CONFIG_REPLY         = 21
-ofp_type_map = {
-    0                               : 'OFPT_HELLO',
-    1                               : 'OFPT_ERROR',
-    2                               : 'OFPT_ECHO_REQUEST',
-    3                               : 'OFPT_ECHO_REPLY',
-    4                               : 'OFPT_VENDOR',
-    5                               : 'OFPT_FEATURES_REQUEST',
-    6                               : 'OFPT_FEATURES_REPLY',
-    7                               : 'OFPT_GET_CONFIG_REQUEST',
-    8                               : 'OFPT_GET_CONFIG_REPLY',
-    9                               : 'OFPT_SET_CONFIG',
-    10                              : 'OFPT_PACKET_IN',
-    11                              : 'OFPT_FLOW_REMOVED',
-    12                              : 'OFPT_PORT_STATUS',
-    13                              : 'OFPT_PACKET_OUT',
-    14                              : 'OFPT_FLOW_MOD',
-    15                              : 'OFPT_PORT_MOD',
-    16                              : 'OFPT_STATS_REQUEST',
-    17                              : 'OFPT_STATS_REPLY',
-    18                              : 'OFPT_BARRIER_REQUEST',
-    19                              : 'OFPT_BARRIER_REPLY',
-    20                              : 'OFPT_QUEUE_GET_CONFIG_REQUEST',
-    21                              : 'OFPT_QUEUE_GET_CONFIG_REPLY'
-}
-
-ofp_packet_in_reason = ['OFPR_NO_MATCH', 'OFPR_ACTION']
-OFPR_NO_MATCH                       = 0
-OFPR_ACTION                         = 1
-ofp_packet_in_reason_map = {
-    0                               : 'OFPR_NO_MATCH',
-    1                               : 'OFPR_ACTION'
-}
-
-ofp_stats_types = ['OFPST_DESC', 'OFPST_FLOW', 'OFPST_AGGREGATE', 'OFPST_TABLE', 'OFPST_PORT', 'OFPST_QUEUE', 'OFPST_VENDOR']
-OFPST_DESC                          = 0
-OFPST_FLOW                          = 1
-OFPST_AGGREGATE                     = 2
-OFPST_TABLE                         = 3
-OFPST_PORT                          = 4
-OFPST_QUEUE                         = 5
-OFPST_VENDOR                        = 65535
-ofp_stats_types_map = {
-    0                               : 'OFPST_DESC',
-    1                               : 'OFPST_FLOW',
-    2                               : 'OFPST_AGGREGATE',
-    3                               : 'OFPST_TABLE',
-    4                               : 'OFPST_PORT',
-    5                               : 'OFPST_QUEUE',
-    65535                           : 'OFPST_VENDOR'
-}
-
-ofp_port_mod_failed_code = ['OFPPMFC_BAD_PORT', 'OFPPMFC_BAD_HW_ADDR']
-OFPPMFC_BAD_PORT                    = 0
-OFPPMFC_BAD_HW_ADDR                 = 1
-ofp_port_mod_failed_code_map = {
-    0                               : 'OFPPMFC_BAD_PORT',
-    1                               : 'OFPPMFC_BAD_HW_ADDR'
-}
-
-# Values from macro definitions
-OFP_FLOW_PERMANENT = 0
-OFP_DL_TYPE_ETH2_CUTOFF = 0x0600
-DESC_STR_LEN = 256
-OFPFW_ICMP_CODE = OFPFW_TP_DST
-OFPQ_MIN_RATE_UNCFG = 0xffff
-OFP_VERSION = 0x01
-OFP_MAX_TABLE_NAME_LEN = 32
-OFP_DL_TYPE_NOT_ETH_TYPE = 0x05ff
-OFP_DEFAULT_MISS_SEND_LEN = 128
-OFP_MAX_PORT_NAME_LEN = 16
-OFP_SSL_PORT = 6633
-OFPFW_ICMP_TYPE = OFPFW_TP_SRC
-OFP_TCP_PORT = 6633
-SERIAL_NUM_LEN = 32
-OFP_DEFAULT_PRIORITY = 0x8000
-OFP_ETH_ALEN = 6
-OFP_VLAN_NONE = 0xffff
-OFPQ_ALL = 0xffffffff
-
-# Basic structure size definitions.
-# Does not include ofp_header members.
-# Does not include variable length arrays.
-OFP_ACTION_DL_ADDR_BYTES = 16
-OFP_ACTION_ENQUEUE_BYTES = 16
-OFP_ACTION_HEADER_BYTES = 8
-OFP_ACTION_NW_ADDR_BYTES = 8
-OFP_ACTION_NW_TOS_BYTES = 8
-OFP_ACTION_OUTPUT_BYTES = 8
-OFP_ACTION_TP_PORT_BYTES = 8
-OFP_ACTION_VENDOR_HEADER_BYTES = 8
-OFP_ACTION_VLAN_PCP_BYTES = 8
-OFP_ACTION_VLAN_VID_BYTES = 8
-OFP_AGGREGATE_STATS_REPLY_BYTES = 24
-OFP_AGGREGATE_STATS_REQUEST_BYTES = 44
-OFP_DESC_STATS_BYTES = 1056
-OFP_ERROR_MSG_BYTES = 4
-OFP_FLOW_MOD_BYTES = 64
-OFP_FLOW_REMOVED_BYTES = 80
-OFP_FLOW_STATS_BYTES = 88
-OFP_FLOW_STATS_REQUEST_BYTES = 44
-OFP_HEADER_BYTES = 8
-OFP_HELLO_BYTES = 0
-OFP_MATCH_BYTES = 40
-OFP_PACKET_IN_BYTES = 10
-OFP_PACKET_OUT_BYTES = 8
-OFP_PACKET_QUEUE_BYTES = 8
-OFP_PHY_PORT_BYTES = 48
-OFP_PORT_MOD_BYTES = 24
-OFP_PORT_STATS_BYTES = 104
-OFP_PORT_STATS_REQUEST_BYTES = 8
-OFP_PORT_STATUS_BYTES = 56
-OFP_QUEUE_GET_CONFIG_REPLY_BYTES = 8
-OFP_QUEUE_GET_CONFIG_REQUEST_BYTES = 4
-OFP_QUEUE_PROP_HEADER_BYTES = 8
-OFP_QUEUE_PROP_MIN_RATE_BYTES = 16
-OFP_QUEUE_STATS_BYTES = 32
-OFP_QUEUE_STATS_REQUEST_BYTES = 8
-OFP_STATS_REPLY_BYTES = 4
-OFP_STATS_REQUEST_BYTES = 4
-OFP_SWITCH_CONFIG_BYTES = 4
-OFP_SWITCH_FEATURES_BYTES = 24
-OFP_TABLE_STATS_BYTES = 64
-OFP_VENDOR_HEADER_BYTES = 4
-
diff --git a/src/python/of10/error.py b/src/python/of10/error.py
deleted file mode 100644
index c69b70d..0000000
--- a/src/python/of10/error.py
+++ /dev/null
@@ -1,306 +0,0 @@
-
-# Python OpenFlow error wrapper classes
-
-from cstruct import *
-
-
-
-class hello_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for hello_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_HELLO_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "hello_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_request_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_request error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_REQUEST
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_request_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_action_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_action error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_ACTION
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_action_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for flow_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_FLOW_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for port_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_PORT_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_op_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for queue_op_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_QUEUE_OP_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_op_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
diff --git a/src/python/of10/message.py b/src/python/of10/message.py
deleted file mode 100644
index bf0064e..0000000
--- a/src/python/of10/message.py
+++ /dev/null
@@ -1,3373 +0,0 @@
-
-# Python OpenFlow message wrapper classes
-
-from cstruct import *
-from action_list import action_list
-from error import *
-
-# Define templates for documentation
-class ofp_template_msg:
-    """
-    Sample base class for template_msg; normally auto generated
-    This class should live in the of_header name space and provides the
-    base class for this type of message.  It will be wrapped for the
-    high level API.
-
-    """
-    def __init__(self):
-        """
-        Constructor for base class
-
-        """
-        self.header = ofp_header()
-        # Additional base data members declared here
-
-    # Normally will define pack, unpack, __len__ functions
-
-class template_msg(ofp_template_msg):
-    """
-    Sample class wrapper for template_msg
-    This class should live in the of_message name space and provides the
-    high level API for an OpenFlow message object.  These objects must
-    implement the functions indicated in this template.
-
-    """
-    def __init__(self):
-        """
-        Constructor
-        Must set the header type value appropriately for the message
-
-        """
-
-        ##@var header
-        # OpenFlow message header: length, version, xid, type
-        ofp_template_msg.__init__(self)
-        self.header = ofp_header()
-        # For a real message, will be set to an integer
-        self.header.type = "TEMPLATE_MSG_VALUE"
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        pass
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-
-        @return Typically returns the remainder of binary_string that
-        was not parsed.  May give a warning if that string is non-empty
-
-        """
-        pass
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        pass
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-        pass
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        pass
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        pass
-
-
-################################################################
-#
-# OpenFlow Message Definitions
-#
-################################################################
-
-class barrier_reply:
-    """
-    Wrapper class for barrier_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_BARRIER_REPLY=19)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_BARRIER_REPLY
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'barrier_reply (OFPT_BARRIER_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class barrier_request:
-    """
-    Wrapper class for barrier_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_BARRIER_REQUEST=18)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_BARRIER_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'barrier_request (OFPT_BARRIER_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class echo_reply:
-    """
-    Wrapper class for echo_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ECHO_REPLY=3)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_ECHO_REPLY
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'echo_reply (OFPT_ECHO_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class echo_request:
-    """
-    Wrapper class for echo_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ECHO_REQUEST=2)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_ECHO_REQUEST
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'echo_request (OFPT_ECHO_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class error(ofp_error_msg):
-    """
-    Wrapper class for error
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ERROR=1)
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_error_msg.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'error (OFPT_ERROR)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_error_msg.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class features_reply(ofp_switch_features):
-    """
-    Wrapper class for features_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FEATURES_REPLY=6)
-
-    Data members inherited from ofp_switch_features:
-    @arg datapath_id
-    @arg n_buffers
-    @arg n_tables
-    @arg capabilities
-    @arg actions
-    @arg ports: Variable length array of TBD
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_switch_features.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FEATURES_REPLY
-        self.ports = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_features.pack(self)
-        for obj in self.ports:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_features.unpack(self, binary_string)
-        while len(binary_string) >= OFP_PHY_PORT_BYTES:
-            new_port = ofp_phy_port()
-            binary_string = new_port.unpack(binary_string)
-            self.ports.append(new_port)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_features.__len__(self)
-        for obj in self.ports:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'features_reply (OFPT_FEATURES_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_features.show(self, prefix)
-        outstr += prefix + "Array ports\n"
-        for obj in self.ports:
-            outstr += obj.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_features.__eq__(self, other): return False
-        if self.ports != other.ports: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class features_request:
-    """
-    Wrapper class for features_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FEATURES_REQUEST=5)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_FEATURES_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'features_request (OFPT_FEATURES_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class flow_mod(ofp_flow_mod):
-    """
-    Wrapper class for flow_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FLOW_MOD=14)
-
-    Data members inherited from ofp_flow_mod:
-    @arg match
-    @arg cookie
-    @arg command
-    @arg idle_timeout
-    @arg hard_timeout
-    @arg priority
-    @arg buffer_id
-    @arg out_port
-    @arg flags
-    @arg actions: Object of type action_list
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_flow_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FLOW_MOD
-        self.actions = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-        # Coerce keyword arg into list type
-        self.actions = action_list(self.actions)
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_flow_mod.pack(self)
-        packed += self.actions.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_flow_mod.unpack(self, binary_string)
-        ai_len = self.header.length - (OFP_FLOW_MOD_BYTES + OFP_HEADER_BYTES)
-        binary_string = self.actions.unpack(binary_string, bytes=ai_len)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_flow_mod.__len__(self)
-        length += len(self.actions)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'flow_mod (OFPT_FLOW_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_flow_mod.show(self, prefix)
-        outstr += prefix + "List actions\n"
-        outstr += self.actions.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_flow_mod.__eq__(self, other): return False
-        if self.actions != other.actions: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class flow_removed(ofp_flow_removed):
-    """
-    Wrapper class for flow_removed
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FLOW_REMOVED=11)
-
-    Data members inherited from ofp_flow_removed:
-    @arg match
-    @arg cookie
-    @arg priority
-    @arg reason
-    @arg duration_sec
-    @arg duration_nsec
-    @arg idle_timeout
-    @arg packet_count
-    @arg byte_count
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_flow_removed.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FLOW_REMOVED
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_flow_removed.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_flow_removed.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_flow_removed.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'flow_removed (OFPT_FLOW_REMOVED)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_flow_removed.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_flow_removed.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class get_config_reply(ofp_switch_config):
-    """
-    Wrapper class for get_config_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GET_CONFIG_REPLY=8)
-
-    Data members inherited from ofp_switch_config:
-    @arg flags
-    @arg miss_send_len
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_switch_config.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_GET_CONFIG_REPLY
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_config.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_config.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_config.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'get_config_reply (OFPT_GET_CONFIG_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_config.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_config.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class get_config_request:
-    """
-    Wrapper class for get_config_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GET_CONFIG_REQUEST=7)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_GET_CONFIG_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'get_config_request (OFPT_GET_CONFIG_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class hello:
-    """
-    Wrapper class for hello
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_HELLO=0)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_HELLO
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'hello (OFPT_HELLO)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class packet_in(ofp_packet_in):
-    """
-    Wrapper class for packet_in
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PACKET_IN=10)
-
-    Data members inherited from ofp_packet_in:
-    @arg buffer_id
-    @arg total_len
-    @arg in_port
-    @arg reason
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_packet_in.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PACKET_IN
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_packet_in.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_packet_in.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_packet_in.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'packet_in (OFPT_PACKET_IN)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_packet_in.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_packet_in.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class packet_out(ofp_packet_out):
-    """
-    Wrapper class for packet_out
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PACKET_OUT=13)
-
-    Data members inherited from ofp_packet_out:
-    @arg buffer_id
-    @arg in_port
-    @arg actions_len
-    @arg actions: Object of type action_list
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_packet_out.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PACKET_OUT
-        self.actions = []
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-        # Coerce keyword arg into list type
-        self.actions = action_list(self.actions)
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        self.actions_len = len(self.actions)
-        packed += ofp_packet_out.pack(self)
-        packed += self.actions.pack()
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_packet_out.unpack(self, binary_string)
-        binary_string = self.actions.unpack(binary_string, bytes=self.actions_len)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_packet_out.__len__(self)
-        length += len(self.actions)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'packet_out (OFPT_PACKET_OUT)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_packet_out.show(self, prefix)
-        outstr += prefix + "List actions\n"
-        outstr += self.actions.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_packet_out.__eq__(self, other): return False
-        if self.data != other.data: return False
-        if self.actions != other.actions: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class port_mod(ofp_port_mod):
-    """
-    Wrapper class for port_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PORT_MOD=15)
-
-    Data members inherited from ofp_port_mod:
-    @arg port_no
-    @arg hw_addr
-    @arg config
-    @arg mask
-    @arg advertise
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_port_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PORT_MOD
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_port_mod.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_port_mod.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_port_mod.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'port_mod (OFPT_PORT_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_port_mod.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_port_mod.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class port_status(ofp_port_status):
-    """
-    Wrapper class for port_status
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PORT_STATUS=12)
-
-    Data members inherited from ofp_port_status:
-    @arg reason
-    @arg desc
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_port_status.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PORT_STATUS
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_port_status.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_port_status.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_port_status.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'port_status (OFPT_PORT_STATUS)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_port_status.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_port_status.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class queue_get_config_reply(ofp_queue_get_config_reply):
-    """
-    Wrapper class for queue_get_config_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_QUEUE_GET_CONFIG_REPLY=21)
-
-    Data members inherited from ofp_queue_get_config_reply:
-    @arg port
-    @arg queues: Variable length array of TBD
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_queue_get_config_reply.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_QUEUE_GET_CONFIG_REPLY
-        self.queues = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_queue_get_config_reply.pack(self)
-        for obj in self.queues:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_queue_get_config_reply.unpack(self, binary_string)
-        for obj in self.queues:
-            binary_string = obj.unpack(binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_queue_get_config_reply.__len__(self)
-        for obj in self.queues:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'queue_get_config_reply (OFPT_QUEUE_GET_CONFIG_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_queue_get_config_reply.show(self, prefix)
-        outstr += prefix + "Array queues\n"
-        for obj in self.queues:
-            outstr += obj.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_queue_get_config_reply.__eq__(self, other): return False
-        if self.queues != other.queues: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class queue_get_config_request(ofp_queue_get_config_request):
-    """
-    Wrapper class for queue_get_config_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_QUEUE_GET_CONFIG_REQUEST=20)
-
-    Data members inherited from ofp_queue_get_config_request:
-    @arg port
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_queue_get_config_request.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_QUEUE_GET_CONFIG_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_queue_get_config_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_queue_get_config_request.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_queue_get_config_request.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'queue_get_config_request (OFPT_QUEUE_GET_CONFIG_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_queue_get_config_request.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_queue_get_config_request.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class set_config(ofp_switch_config):
-    """
-    Wrapper class for set_config
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_SET_CONFIG=9)
-
-    Data members inherited from ofp_switch_config:
-    @arg flags
-    @arg miss_send_len
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_switch_config.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_SET_CONFIG
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_config.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_config.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_config.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'set_config (OFPT_SET_CONFIG)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_config.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_config.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for stats_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_STATS_REPLY=17)
-
-    Data members inherited from ofp_stats_reply:
-    @arg type
-    @arg flags
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_stats_reply.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_STATS_REPLY
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_stats_reply.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_stats_reply.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'stats_reply (OFPT_STATS_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_stats_reply.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class stats_request(ofp_stats_request):
-    """
-    Wrapper class for stats_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_STATS_REQUEST=16)
-
-    Data members inherited from ofp_stats_request:
-    @arg type
-    @arg flags
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_stats_request.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_STATS_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_stats_request.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'stats_request (OFPT_STATS_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_stats_request.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class vendor(ofp_vendor_header):
-    """
-    Wrapper class for vendor
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_VENDOR=4)
-
-    Data members inherited from ofp_vendor_header:
-    @arg vendor
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_vendor_header.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_VENDOR
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_vendor_header.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_vendor_header.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_vendor_header.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'vendor (OFPT_VENDOR)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_vendor_header.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_vendor_header.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-
-################################################################
-#
-# Stats request and reply subclass definitions
-#
-################################################################
-
-
-# Stats request bodies for desc and table stats are not defined in the
-# OpenFlow header;  We define them here.  They are empty classes, really
-
-class ofp_desc_stats_request:
-    """
-    Forced definition of ofp_desc_stats_request (empty class)
-    """
-    def __init__(self):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_desc_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_DESC_STATS_REQUEST_BYTES = 0
-
-class ofp_table_stats_request:
-    """
-    Forced definition of ofp_table_stats_request (empty class)
-    """
-    def __init__(self):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_table_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_TABLE_STATS_REQUEST_BYTES = 0
-
-
-
-# Stats entries define the content of one element in a stats
-# reply for the indicated type; define _entry for consistency
-
-aggregate_stats_entry = ofp_aggregate_stats_reply
-desc_stats_entry = ofp_desc_stats
-port_stats_entry = ofp_port_stats
-queue_stats_entry = ofp_queue_stats
-table_stats_entry = ofp_table_stats
-
-
-#
-# Flow stats entry contains an action list of variable length, so
-# it is done by hand
-#
-
-class flow_stats_entry(ofp_flow_stats):
-    """
-    Special case flow stats entry to handle action list object
-    """
-    def __init__(self):
-        ofp_flow_stats.__init__(self)
-        self.actions = action_list()
-
-    def pack(self, assertstruct=True):
-        self.length = len(self)
-        packed = ofp_flow_stats.pack(self, assertstruct)
-        packed += self.actions.pack()
-        if len(packed) != self.length:
-            print("ERROR: flow_stats_entry pack length not equal",
-                  self.length, len(packed))
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = ofp_flow_stats.unpack(self, binary_string)
-        ai_len = self.length - OFP_FLOW_STATS_BYTES
-        if ai_len < 0:
-            print("ERROR: flow_stats_entry unpack length too small",
-                  self.length)
-        binary_string = self.actions.unpack(binary_string, bytes=ai_len)
-        return binary_string
-
-    def __len__(self):
-        return OFP_FLOW_STATS_BYTES + len(self.actions)
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_entry\n"
-        outstr += ofp_flow_stats.show(self, prefix + '  ')
-        outstr += self.actions.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (ofp_flow_stats.__eq__(self, other) and 
-                self.actions == other.actions)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class aggregate_stats_request(ofp_stats_request, ofp_aggregate_stats_request):
-    """
-    Wrapper class for aggregate stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_aggregate_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_AGGREGATE
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_aggregate_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_aggregate_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking aggregate: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_AGGREGATE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "aggregate_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_aggregate_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_aggregate_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class aggregate_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for aggregate stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_AGGREGATE
-        # stats: Array of type aggregate_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = aggregate_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = aggregate_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking aggregate stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "aggregate_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class desc_stats_request(ofp_stats_request, ofp_desc_stats_request):
-    """
-    Wrapper class for desc stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_desc_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_DESC
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_desc_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_desc_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking desc: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_DESC_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "desc_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_desc_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_desc_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class desc_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for desc stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_DESC
-        # stats: Array of type desc_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = desc_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = desc_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking desc stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "desc_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_stats_request(ofp_stats_request, ofp_flow_stats_request):
-    """
-    Wrapper class for flow stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_flow_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_FLOW
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_flow_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_flow_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking flow: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_FLOW_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_flow_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_flow_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for flow stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_FLOW
-        # stats: Array of type flow_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = flow_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = flow_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking flow stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_stats_request(ofp_stats_request, ofp_port_stats_request):
-    """
-    Wrapper class for port stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_port_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_PORT
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_port_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_port_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking port: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_PORT_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_port_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_port_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for port stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_PORT
-        # stats: Array of type port_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = port_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = port_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking port stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_stats_request(ofp_stats_request, ofp_queue_stats_request):
-    """
-    Wrapper class for queue stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_queue_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_QUEUE
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_queue_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_queue_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking queue: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_QUEUE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_queue_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_queue_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for queue stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_QUEUE
-        # stats: Array of type queue_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = queue_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = queue_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking queue stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_stats_request(ofp_stats_request, ofp_table_stats_request):
-    """
-    Wrapper class for table stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_table_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_TABLE
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_table_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_table_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking table: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_TABLE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_table_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_table_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for table stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_TABLE
-        # stats: Array of type table_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = table_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = table_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking table stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-message_type_list = (
-    aggregate_stats_reply,
-    aggregate_stats_request,
-    bad_action_error_msg,
-    bad_request_error_msg,
-    barrier_reply,
-    barrier_request,
-    desc_stats_reply,
-    desc_stats_request,
-    echo_reply,
-    echo_request,
-    features_reply,
-    features_request,
-    flow_mod,
-    flow_mod_failed_error_msg,
-    flow_removed,
-    flow_stats_reply,
-    flow_stats_request,
-    get_config_reply,
-    get_config_request,
-    hello,
-    hello_failed_error_msg,
-    packet_in,
-    packet_out,
-    port_mod,
-    port_mod_failed_error_msg,
-    port_stats_reply,
-    port_stats_request,
-    port_status,
-    queue_get_config_reply,
-    queue_get_config_request,
-    queue_op_failed_error_msg,
-    queue_stats_reply,
-    queue_stats_request,
-    set_config,
-    table_stats_reply,
-    table_stats_request,
-    vendor
-    )
-
diff --git a/src/python/of10/parse.py b/src/python/of10/parse.py
deleted file mode 100644
index e56b69a..0000000
--- a/src/python/of10/parse.py
+++ /dev/null
@@ -1,343 +0,0 @@
-"""
-OpenFlow message parsing functions
-"""
-
-import sys
-import logging
-import message
-import error
-import action
-import cstruct
-from action_list import action_list
-try:
-    import scapy.all as scapy
-except:
-    try:
-        import scapy as scapy
-    except:
-        sys.exit("Need to install scapy for packet parsing")
-
-"""
-of_message.py
-Contains wrapper functions and classes for the of_message namespace
-that are generated by hand.  It includes the rest of the wrapper
-function information into the of_message namespace
-"""
-
-parse_logger = logging.getLogger("parse")
-#parse_logger.setLevel(logging.DEBUG)
-
-# These message types are subclassed
-msg_type_subclassed = [
-    cstruct.OFPT_STATS_REQUEST,
-    cstruct.OFPT_STATS_REPLY,
-    cstruct.OFPT_ERROR
-]
-
-# Maps from sub-types to classes
-stats_reply_to_class_map = {
-    cstruct.OFPST_DESC                      : message.desc_stats_reply,
-    cstruct.OFPST_AGGREGATE                 : message.aggregate_stats_reply,
-    cstruct.OFPST_FLOW                      : message.flow_stats_reply,
-    cstruct.OFPST_TABLE                     : message.table_stats_reply,
-    cstruct.OFPST_PORT                      : message.port_stats_reply,
-    cstruct.OFPST_QUEUE                     : message.queue_stats_reply
-}
-
-stats_request_to_class_map = {
-    cstruct.OFPST_DESC                      : message.desc_stats_request,
-    cstruct.OFPST_AGGREGATE                 : message.aggregate_stats_request,
-    cstruct.OFPST_FLOW                      : message.flow_stats_request,
-    cstruct.OFPST_TABLE                     : message.table_stats_request,
-    cstruct.OFPST_PORT                      : message.port_stats_request,
-    cstruct.OFPST_QUEUE                     : message.queue_stats_request
-}
-
-error_to_class_map = {
-    cstruct.OFPET_HELLO_FAILED              : message.hello_failed_error_msg,
-    cstruct.OFPET_BAD_REQUEST               : message.bad_request_error_msg,
-    cstruct.OFPET_BAD_ACTION                : message.bad_action_error_msg,
-    cstruct.OFPET_FLOW_MOD_FAILED           : message.flow_mod_failed_error_msg,
-    cstruct.OFPET_PORT_MOD_FAILED           : message.port_mod_failed_error_msg,
-    cstruct.OFPET_QUEUE_OP_FAILED           : message.queue_op_failed_error_msg
-}
-
-# Map from header type value to the underlieing message class
-msg_type_to_class_map = {
-    cstruct.OFPT_HELLO                      : message.hello,
-    cstruct.OFPT_ERROR                      : message.error,
-    cstruct.OFPT_ECHO_REQUEST               : message.echo_request,
-    cstruct.OFPT_ECHO_REPLY                 : message.echo_reply,
-    cstruct.OFPT_VENDOR                     : message.vendor,
-    cstruct.OFPT_FEATURES_REQUEST           : message.features_request,
-    cstruct.OFPT_FEATURES_REPLY             : message.features_reply,
-    cstruct.OFPT_GET_CONFIG_REQUEST         : message.get_config_request,
-    cstruct.OFPT_GET_CONFIG_REPLY           : message.get_config_reply,
-    cstruct.OFPT_SET_CONFIG                 : message.set_config,
-    cstruct.OFPT_PACKET_IN                  : message.packet_in,
-    cstruct.OFPT_FLOW_REMOVED               : message.flow_removed,
-    cstruct.OFPT_PORT_STATUS                : message.port_status,
-    cstruct.OFPT_PACKET_OUT                 : message.packet_out,
-    cstruct.OFPT_FLOW_MOD                   : message.flow_mod,
-    cstruct.OFPT_PORT_MOD                   : message.port_mod,
-    cstruct.OFPT_STATS_REQUEST              : message.stats_request,
-    cstruct.OFPT_STATS_REPLY                : message.stats_reply,
-    cstruct.OFPT_BARRIER_REQUEST            : message.barrier_request,
-    cstruct.OFPT_BARRIER_REPLY              : message.barrier_reply,
-    cstruct.OFPT_QUEUE_GET_CONFIG_REQUEST   : message.queue_get_config_request,
-    cstruct.OFPT_QUEUE_GET_CONFIG_REPLY     : message.queue_get_config_reply
-}
-
-def _of_message_to_object(binary_string):
-    """
-    Map a binary string to the corresponding class.
-
-    Appropriately resolves subclasses
-    """
-    hdr = message.ofp_header()
-    hdr.unpack(binary_string)
-    # FIXME: Add error detection
-    if not hdr.type in msg_type_subclassed:
-        return msg_type_to_class_map[hdr.type]()
-    if hdr.type == cstruct.OFPT_STATS_REQUEST:
-        sub_hdr = message.ofp_stats_request()
-        sub_hdr.unpack(binary_string[cstruct.OFP_HEADER_BYTES:])
-        try:
-            obj = stats_request_to_class_map[sub_hdr.type]()
-        except KeyError:
-            obj = None
-        return obj
-    elif hdr.type == cstruct.OFPT_STATS_REPLY:
-        sub_hdr = message.ofp_stats_reply()
-        sub_hdr.unpack(binary_string[cstruct.OFP_HEADER_BYTES:])
-        try:
-            obj = stats_reply_to_class_map[sub_hdr.type]()
-        except KeyError:
-            obj = None
-        return obj
-    elif hdr.type == cstruct.OFPT_ERROR:
-        sub_hdr = message.ofp_error_msg()
-        sub_hdr.unpack(binary_string[cstruct.OFP_HEADER_BYTES:])
-        return error_to_class_map[sub_hdr.type]()
-    else:
-        parse_logger.error("Cannot parse pkt to message")
-        return None
-
-def of_message_parse(binary_string, raw=False):
-    """
-    Parse an OpenFlow packet
-
-    Parses a raw OpenFlow packet into a Python class, with class
-    members fully populated.
-
-    @param binary_string The packet (string) to be parsed
-    @param raw If true, interpret the packet as an L2 packet.  Not
-    yet supported.
-    @return An object of some message class or None if fails
-    Note that any data beyond that parsed is not returned
-
-    """
-
-    if raw:
-        parse_logger.error("raw packet message parsing not supported")
-        return None
-
-    obj = _of_message_to_object(binary_string)
-    if obj:
-        obj.unpack(binary_string)
-    return obj
-
-
-def of_header_parse(binary_string, raw=False):
-    """
-    Parse only the header from an OpenFlow packet
-
-    Parses the header from a raw OpenFlow packet into a
-    an ofp_header Python class.
-
-    @param binary_string The packet (string) to be parsed
-    @param raw If true, interpret the packet as an L2 packet.  Not
-    yet supported.
-    @return An ofp_header object
-
-    """
-
-    if raw:
-        parse_logger.error("raw packet message parsing not supported")
-        return None
-
-    hdr = message.ofp_header()
-    hdr.unpack(binary_string)
-
-    return hdr
-
-map_wc_field_to_match_member = {
-    'OFPFW_DL_VLAN'                 : 'dl_vlan',
-    'OFPFW_DL_SRC'                  : 'dl_src',
-    'OFPFW_DL_DST'                  : 'dl_dst',
-    'OFPFW_DL_TYPE'                 : 'dl_type',
-    'OFPFW_NW_PROTO'                : 'nw_proto',
-    'OFPFW_TP_SRC'                  : 'tp_src',
-    'OFPFW_TP_DST'                  : 'tp_dst',
-    'OFPFW_NW_SRC_SHIFT'            : 'nw_src_shift',
-    'OFPFW_NW_SRC_BITS'             : 'nw_src_bits',
-    'OFPFW_NW_SRC_MASK'             : 'nw_src_mask',
-    'OFPFW_NW_SRC_ALL'              : 'nw_src_all',
-    'OFPFW_NW_DST_SHIFT'            : 'nw_dst_shift',
-    'OFPFW_NW_DST_BITS'             : 'nw_dst_bits',
-    'OFPFW_NW_DST_MASK'             : 'nw_dst_mask',
-    'OFPFW_NW_DST_ALL'              : 'nw_dst_all',
-    'OFPFW_DL_VLAN_PCP'             : 'dl_vlan_pcp',
-    'OFPFW_NW_TOS'                  : 'nw_tos'
-}
-
-
-def parse_mac(mac_str):
-    """
-    Parse a MAC address
-
-    Parse a MAC address ':' separated string of hex digits to an
-    array of integer values.  '00:d0:05:5d:24:00' => [0, 208, 5, 93, 36, 0]
-    @param mac_str The string to convert
-    @return Array of 6 integer values
-    """
-    return map(lambda val: int(val, 16), mac_str.split(":"))
-
-def parse_ip(ip_str):
-    """
-    Parse an IP address
-
-    Parse an IP address '.' separated string of decimal digits to an
-    host ordered integer.  '172.24.74.77' => 
-    @param ip_str The string to convert
-    @return Integer value
-    """
-    array = map(lambda val: int(val), ip_str.split("."))
-    val = 0
-    for a in array:
-        val <<= 8
-        val += a
-    return val
-
-def packet_type_classify(ether):
-    try:
-        dot1q = ether[scapy.Dot1Q]
-    except:
-        dot1q = None
-
-    try:
-        ip = ether[scapy.IP]
-    except:
-        ip = None
-
-    try:
-        tcp = ether[scapy.TCP]
-    except:
-        tcp = None
-
-    try:
-        udp = ether[scapy.UDP]
-    except:
-        udp = None
-
-    try:
-        icmp = ether[scapy.ICMP]
-    except:
-        icmp = None
-
-    try:
-        arp = ether[scapy.ARP]
-    except:
-        arp = None
-    return (dot1q, ip, tcp, udp, icmp, arp)
-
-def packet_to_flow_match(packet, pkt_format="L2"):
-    """
-    Create a flow match that matches packet with the given wildcards
-
-    @param packet The packet to use as a flow template
-    @param pkt_format Currently only L2 is supported.  Will indicate the 
-    overall packet type for parsing
-    @return An ofp_match object if successful.  None if format is not
-    recognized.  The wildcards of the match will be cleared for the
-    values extracted from the packet.
-
-    @todo check min length of packet
-    @todo Check if packet is other than L2 format
-    @todo Implement ICMP and ARP fields
-    """
-
-    #@todo check min length of packet
-    if pkt_format.upper() != "L2":
-        parse_logger.error("Only L2 supported for packet_to_flow")
-        return None
-
-    if type(packet) == type(""):
-        ether = scapy.Ether(packet)
-    else:
-        ether = packet
-
-    # For now, assume ether IP packet and ignore wildcards
-    try:
-        (dot1q, ip, tcp, udp, icmp, arp) = packet_type_classify(ether)
-    except:
-        parse_logger.error("packet_to_flow_match: Classify error")
-        return None
-
-    match = cstruct.ofp_match()
-    match.wildcards = cstruct.OFPFW_ALL
-    #@todo Check if packet is other than L2 format
-    match.dl_dst = parse_mac(ether.dst)
-    match.wildcards &= ~cstruct.OFPFW_DL_DST
-    match.dl_src = parse_mac(ether.src)
-    match.wildcards &= ~cstruct.OFPFW_DL_SRC
-    match.dl_type = ether.type
-    match.wildcards &= ~cstruct.OFPFW_DL_TYPE
-
-    if dot1q:
-        match.dl_vlan = dot1q.vlan
-        match.dl_vlan_pcp = dot1q.prio
-        match.dl_type = dot1q.type
-    else:
-        match.dl_vlan = cstruct.OFP_VLAN_NONE
-        match.dl_vlan_pcp = 0
-    match.wildcards &= ~cstruct.OFPFW_DL_VLAN
-    match.wildcards &= ~cstruct.OFPFW_DL_VLAN_PCP
-
-    if ip:
-        match.nw_src = parse_ip(ip.src)
-        match.wildcards &= ~cstruct.OFPFW_NW_SRC_MASK
-        match.nw_dst = parse_ip(ip.dst)
-        match.wildcards &= ~cstruct.OFPFW_NW_DST_MASK
-        match.nw_tos = ip.tos
-        match.wildcards &= ~cstruct.OFPFW_NW_TOS
-
-    if tcp:
-        match.nw_proto = 6
-        match.wildcards &= ~cstruct.OFPFW_NW_PROTO
-    elif not tcp and udp:
-        tcp = udp
-        match.nw_proto = 17
-        match.wildcards &= ~cstruct.OFPFW_NW_PROTO
-
-    if tcp:
-        match.tp_src = tcp.sport
-        match.wildcards &= ~cstruct.OFPFW_TP_SRC
-        match.tp_dst = tcp.dport
-        match.wildcards &= ~cstruct.OFPFW_TP_DST
-
-    if icmp:
-        match.nw_proto = 1
-        match.tp_src = icmp.type
-        match.tp_dst = icmp.code
-        match.wildcards &= ~cstruct.OFPFW_NW_PROTO
-
-    if arp:
-        match.nw_proto = arp.op
-        match.wildcards &= ~cstruct.OFPFW_NW_PROTO
-        match.nw_src = parse_ip(arp.psrc)
-        match.wildcards &= ~cstruct.OFPFW_NW_SRC_MASK
-        match.nw_dst = parse_ip(arp.pdst)
-        match.wildcards &= ~cstruct.OFPFW_NW_DST_MASK
-
-    return match
diff --git a/src/python/of11/__init__.py b/src/python/of11/__init__.py
deleted file mode 100644
index c4407ee..0000000
--- a/src/python/of11/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-"""
-Python OpenFlow 1.0 library
-
-Most of the files in this package are automatically generated by tools/munger.
-They are checked in to simplify running OFTest.
-"""
-
-__all__ = ["action_list", "action", "cstruct", "error", "message", "parse"]
diff --git a/src/python/of11/action.py b/src/python/of11/action.py
deleted file mode 100644
index 447cd17..0000000
--- a/src/python/of11/action.py
+++ /dev/null
@@ -1,550 +0,0 @@
-
-# Python OpenFlow action wrapper classes
-
-from cstruct import *
-
-
-
-class action_set_nw_src(ofp_action_nw_addr):
-    """
-    Wrapper class for set_nw_src action object
-
-    Data members inherited from ofp_action_nw_addr:
-    @arg type
-    @arg len
-    @arg nw_addr
-
-    """
-    def __init__(self):
-        ofp_action_nw_addr.__init__(self)
-        self.type = OFPAT_SET_NW_SRC
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_src\n"
-        outstr += ofp_action_nw_addr.show(self, prefix)
-        return outstr
-
-
-class action_set_mpls_tc(ofp_action_mpls_tc):
-    """
-    Wrapper class for set_mpls_tc action object
-
-    Data members inherited from ofp_action_mpls_tc:
-    @arg type
-    @arg len
-    @arg mpls_tc
-
-    """
-    def __init__(self):
-        ofp_action_mpls_tc.__init__(self)
-        self.type = OFPAT_SET_MPLS_TC
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_mpls_tc\n"
-        outstr += ofp_action_mpls_tc.show(self, prefix)
-        return outstr
-
-
-class action_set_nw_tos(ofp_action_nw_tos):
-    """
-    Wrapper class for set_nw_tos action object
-
-    Data members inherited from ofp_action_nw_tos:
-    @arg type
-    @arg len
-    @arg nw_tos
-
-    """
-    def __init__(self):
-        ofp_action_nw_tos.__init__(self)
-        self.type = OFPAT_SET_NW_TOS
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_tos\n"
-        outstr += ofp_action_nw_tos.show(self, prefix)
-        return outstr
-
-
-class action_dec_mpls_ttl(ofp_action_header):
-    """
-    Wrapper class for dec_mpls_ttl action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_DEC_MPLS_TTL
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_dec_mpls_ttl\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class action_set_nw_dst(ofp_action_nw_addr):
-    """
-    Wrapper class for set_nw_dst action object
-
-    Data members inherited from ofp_action_nw_addr:
-    @arg type
-    @arg len
-    @arg nw_addr
-
-    """
-    def __init__(self):
-        ofp_action_nw_addr.__init__(self)
-        self.type = OFPAT_SET_NW_DST
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_dst\n"
-        outstr += ofp_action_nw_addr.show(self, prefix)
-        return outstr
-
-
-class action_set_mpls_label(ofp_action_mpls_label):
-    """
-    Wrapper class for set_mpls_label action object
-
-    Data members inherited from ofp_action_mpls_label:
-    @arg type
-    @arg len
-    @arg mpls_label
-
-    """
-    def __init__(self):
-        ofp_action_mpls_label.__init__(self)
-        self.type = OFPAT_SET_MPLS_LABEL
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_mpls_label\n"
-        outstr += ofp_action_mpls_label.show(self, prefix)
-        return outstr
-
-
-class action_group(ofp_action_group):
-    """
-    Wrapper class for group action object
-
-    Data members inherited from ofp_action_group:
-    @arg type
-    @arg len
-    @arg group_id
-
-    """
-    def __init__(self):
-        ofp_action_group.__init__(self)
-        self.type = OFPAT_GROUP
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_group\n"
-        outstr += ofp_action_group.show(self, prefix)
-        return outstr
-
-
-class action_copy_ttl_out(ofp_action_header):
-    """
-    Wrapper class for copy_ttl_out action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_COPY_TTL_OUT
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_copy_ttl_out\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class action_set_vlan_vid(ofp_action_vlan_vid):
-    """
-    Wrapper class for set_vlan_vid action object
-
-    Data members inherited from ofp_action_vlan_vid:
-    @arg type
-    @arg len
-    @arg vlan_vid
-
-    """
-    def __init__(self):
-        ofp_action_vlan_vid.__init__(self)
-        self.type = OFPAT_SET_VLAN_VID
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_vlan_vid\n"
-        outstr += ofp_action_vlan_vid.show(self, prefix)
-        return outstr
-
-
-class action_set_mpls_ttl(ofp_action_mpls_ttl):
-    """
-    Wrapper class for set_mpls_ttl action object
-
-    Data members inherited from ofp_action_mpls_ttl:
-    @arg type
-    @arg len
-    @arg mpls_ttl
-
-    """
-    def __init__(self):
-        ofp_action_mpls_ttl.__init__(self)
-        self.type = OFPAT_SET_MPLS_TTL
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_mpls_ttl\n"
-        outstr += ofp_action_mpls_ttl.show(self, prefix)
-        return outstr
-
-
-class action_pop_vlan(ofp_action_header):
-    """
-    Wrapper class for pop_vlan action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_POP_VLAN
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_pop_vlan\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class action_set_tp_dst(ofp_action_tp_port):
-    """
-    Wrapper class for set_tp_dst action object
-
-    Data members inherited from ofp_action_tp_port:
-    @arg type
-    @arg len
-    @arg tp_port
-
-    """
-    def __init__(self):
-        ofp_action_tp_port.__init__(self)
-        self.type = OFPAT_SET_TP_DST
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_tp_dst\n"
-        outstr += ofp_action_tp_port.show(self, prefix)
-        return outstr
-
-
-class action_pop_mpls(ofp_action_pop_mpls):
-    """
-    Wrapper class for pop_mpls action object
-
-    Data members inherited from ofp_action_pop_mpls:
-    @arg type
-    @arg len
-    @arg ethertype
-
-    """
-    def __init__(self):
-        ofp_action_pop_mpls.__init__(self)
-        self.type = OFPAT_POP_MPLS
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_pop_mpls\n"
-        outstr += ofp_action_pop_mpls.show(self, prefix)
-        return outstr
-
-
-class action_push_vlan(ofp_action_push):
-    """
-    Wrapper class for push_vlan action object
-
-    Data members inherited from ofp_action_push:
-    @arg type
-    @arg len
-    @arg ethertype
-
-    """
-    def __init__(self):
-        ofp_action_push.__init__(self)
-        self.type = OFPAT_PUSH_VLAN
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_push_vlan\n"
-        outstr += ofp_action_push.show(self, prefix)
-        return outstr
-
-
-class action_set_vlan_pcp(ofp_action_vlan_pcp):
-    """
-    Wrapper class for set_vlan_pcp action object
-
-    Data members inherited from ofp_action_vlan_pcp:
-    @arg type
-    @arg len
-    @arg vlan_pcp
-
-    """
-    def __init__(self):
-        ofp_action_vlan_pcp.__init__(self)
-        self.type = OFPAT_SET_VLAN_PCP
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_vlan_pcp\n"
-        outstr += ofp_action_vlan_pcp.show(self, prefix)
-        return outstr
-
-
-class action_set_tp_src(ofp_action_tp_port):
-    """
-    Wrapper class for set_tp_src action object
-
-    Data members inherited from ofp_action_tp_port:
-    @arg type
-    @arg len
-    @arg tp_port
-
-    """
-    def __init__(self):
-        ofp_action_tp_port.__init__(self)
-        self.type = OFPAT_SET_TP_SRC
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_tp_src\n"
-        outstr += ofp_action_tp_port.show(self, prefix)
-        return outstr
-
-
-class action_experimenter(ofp_action_experimenter_header):
-    """
-    Wrapper class for experimenter action object
-
-    Data members inherited from ofp_action_experimenter_header:
-    @arg type
-    @arg len
-    @arg experimenter
-
-    """
-    def __init__(self):
-        ofp_action_experimenter_header.__init__(self)
-        self.type = OFPAT_EXPERIMENTER
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_experimenter\n"
-        outstr += ofp_action_experimenter_header.show(self, prefix)
-        return outstr
-
-
-class action_set_nw_ttl(ofp_action_nw_ttl):
-    """
-    Wrapper class for set_nw_ttl action object
-
-    Data members inherited from ofp_action_nw_ttl:
-    @arg type
-    @arg len
-    @arg nw_ttl
-
-    """
-    def __init__(self):
-        ofp_action_nw_ttl.__init__(self)
-        self.type = OFPAT_SET_NW_TTL
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_ttl\n"
-        outstr += ofp_action_nw_ttl.show(self, prefix)
-        return outstr
-
-
-class action_copy_ttl_in(ofp_action_header):
-    """
-    Wrapper class for copy_ttl_in action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_COPY_TTL_IN
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_copy_ttl_in\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class action_set_nw_ecn(ofp_action_nw_ecn):
-    """
-    Wrapper class for set_nw_ecn action object
-
-    Data members inherited from ofp_action_nw_ecn:
-    @arg type
-    @arg len
-    @arg nw_ecn
-
-    """
-    def __init__(self):
-        ofp_action_nw_ecn.__init__(self)
-        self.type = OFPAT_SET_NW_ECN
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_ecn\n"
-        outstr += ofp_action_nw_ecn.show(self, prefix)
-        return outstr
-
-
-class action_set_dl_dst(ofp_action_dl_addr):
-    """
-    Wrapper class for set_dl_dst action object
-
-    Data members inherited from ofp_action_dl_addr:
-    @arg type
-    @arg len
-    @arg dl_addr
-
-    """
-    def __init__(self):
-        ofp_action_dl_addr.__init__(self)
-        self.type = OFPAT_SET_DL_DST
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_dl_dst\n"
-        outstr += ofp_action_dl_addr.show(self, prefix)
-        return outstr
-
-
-class action_push_mpls(ofp_action_push):
-    """
-    Wrapper class for push_mpls action object
-
-    Data members inherited from ofp_action_push:
-    @arg type
-    @arg len
-    @arg ethertype
-
-    """
-    def __init__(self):
-        ofp_action_push.__init__(self)
-        self.type = OFPAT_PUSH_MPLS
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_push_mpls\n"
-        outstr += ofp_action_push.show(self, prefix)
-        return outstr
-
-
-class action_dec_nw_ttl(ofp_action_header):
-    """
-    Wrapper class for dec_nw_ttl action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_DEC_NW_TTL
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_dec_nw_ttl\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class action_set_dl_src(ofp_action_dl_addr):
-    """
-    Wrapper class for set_dl_src action object
-
-    Data members inherited from ofp_action_dl_addr:
-    @arg type
-    @arg len
-    @arg dl_addr
-
-    """
-    def __init__(self):
-        ofp_action_dl_addr.__init__(self)
-        self.type = OFPAT_SET_DL_SRC
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_dl_src\n"
-        outstr += ofp_action_dl_addr.show(self, prefix)
-        return outstr
-
-
-class action_set_queue(ofp_action_set_queue):
-    """
-    Wrapper class for set_queue action object
-
-    Data members inherited from ofp_action_set_queue:
-    @arg type
-    @arg len
-    @arg queue_id
-
-    """
-    def __init__(self):
-        ofp_action_set_queue.__init__(self)
-        self.type = OFPAT_SET_QUEUE
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_queue\n"
-        outstr += ofp_action_set_queue.show(self, prefix)
-        return outstr
-
-
-class action_output(ofp_action_output):
-    """
-    Wrapper class for output action object
-
-    Data members inherited from ofp_action_output:
-    @arg type
-    @arg len
-    @arg port
-    @arg max_len
-
-    """
-    def __init__(self):
-        ofp_action_output.__init__(self)
-        self.type = OFPAT_OUTPUT
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "action_output\n"
-        outstr += ofp_action_output.show(self, prefix)
-        return outstr
-
-action_class_list = (
-    action_copy_ttl_in,
-    action_copy_ttl_out,
-    action_dec_mpls_ttl,
-    action_dec_nw_ttl,
-    action_experimenter,
-    action_group,
-    action_output,
-    action_pop_mpls,
-    action_pop_vlan,
-    action_push_mpls,
-    action_push_vlan,
-    action_set_dl_dst,
-    action_set_dl_src,
-    action_set_mpls_label,
-    action_set_mpls_tc,
-    action_set_mpls_ttl,
-    action_set_nw_dst,
-    action_set_nw_ecn,
-    action_set_nw_src,
-    action_set_nw_tos,
-    action_set_nw_ttl,
-    action_set_queue,
-    action_set_tp_dst,
-    action_set_tp_src,
-    action_set_vlan_pcp,
-    action_set_vlan_vid)
-
diff --git a/src/python/of11/action_list.py b/src/python/of11/action_list.py
deleted file mode 100644
index 878050b..0000000
--- a/src/python/of11/action_list.py
+++ /dev/null
@@ -1,97 +0,0 @@
-"""
-OpenFlow action, instruction and bucket list classes
-"""
-
-from action import *
-from cstruct import ofp_header
-from base_list import ofp_base_list
-import copy
-
-action_object_map = {
-    OFPAT_OUTPUT                        : action_output,
-    OFPAT_SET_VLAN_VID                  : action_set_vlan_vid,
-    OFPAT_SET_VLAN_PCP                  : action_set_vlan_pcp,
-    OFPAT_SET_DL_SRC                    : action_set_dl_src,
-    OFPAT_SET_DL_DST                    : action_set_dl_dst,
-    OFPAT_SET_NW_SRC                    : action_set_nw_src,
-    OFPAT_SET_NW_DST                    : action_set_nw_dst,
-    OFPAT_SET_NW_TOS                    : action_set_nw_tos,
-    OFPAT_SET_NW_ECN                    : action_set_nw_ecn,
-    OFPAT_SET_TP_SRC                    : action_set_tp_src,
-    OFPAT_SET_TP_DST                    : action_set_tp_dst,
-    OFPAT_COPY_TTL_OUT                  : action_copy_ttl_out,
-    OFPAT_COPY_TTL_IN                   : action_copy_ttl_in,
-    OFPAT_SET_MPLS_LABEL                : action_set_mpls_label,
-    OFPAT_SET_MPLS_TC                   : action_set_mpls_tc,
-    OFPAT_SET_MPLS_TTL                  : action_set_mpls_ttl,
-    OFPAT_DEC_MPLS_TTL                  : action_dec_mpls_ttl,
-    OFPAT_PUSH_VLAN                     : action_push_vlan,
-    OFPAT_POP_VLAN                      : action_pop_vlan,
-    OFPAT_PUSH_MPLS                     : action_push_mpls,
-    OFPAT_POP_MPLS                      : action_pop_mpls,
-    OFPAT_SET_QUEUE                     : action_set_queue,
-    OFPAT_GROUP                         : action_group,
-    OFPAT_SET_NW_TTL                    : action_set_nw_ttl,
-    OFPAT_DEC_NW_TTL                    : action_dec_nw_ttl,
-    OFPAT_EXPERIMENTER                  : action_experimenter
-}
-
-class action_list(ofp_base_list):
-    """
-    Maintain a list of actions
-
-    Data members:
-    @arg actions: An array of action objects such as action_output, etc.
-
-    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.actions = self.items
-        self.name = "action"
-        self.class_list = action_class_list
-
-    def unpack(self, binary_string, bytes=None):
-        """
-        Unpack a list of actions
-        
-        Unpack actions 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 action list in bytes.  
-        Ignored if decode is True.  If 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 = ofp_action_header()
-            hdr.unpack(cur_string)
-            if hdr.len < OFP_ACTION_HEADER_BYTES:
-                print "ERROR: Action too short"
-                break
-            if not hdr.type in action_object_map.keys():
-                print "WARNING: Skipping unknown action ", hdr.type, hdr.len
-            else:
-                self.actions.append(action_object_map[hdr.type]())
-                self.actions[count].unpack(cur_string)
-                count += 1
-            cur_string = cur_string[hdr.len:]
-            bytes_done += hdr.len
-        return cur_string
-
diff --git a/src/python/of11/base_list.py b/src/python/of11/base_list.py
deleted file mode 100644
index 938c68e..0000000
--- a/src/python/of11/base_list.py
+++ /dev/null
@@ -1,158 +0,0 @@
-
-"""
-Base list class for inheritance.
-Most of the list stuff is common; unpacking is the only thing that
-is left pure virtual.
-"""
-
-import copy
-
-class ofp_base_list(object):
-    """
-    Container type to maintain a list of ofp objects
-
-    Data members:
-    @arg items An array of objects
-    @arg class_list A tuple of classes that may be added to the list;
-         If None, no checking is done
-    @arg name The name to use when displaying the list
-
-    Methods:
-    @arg pack Pack the structure into a string
-    @arg unpack Unpack a string to objects, with proper typing
-    @arg add Add an item to the list; you can directly access
-    the item member, but add will validate that the added object 
-    is of the right type.
-    @arg extend Add the items for another list to this list
-
-    """
-
-    def __init__(self):
-        self.items = []
-        self.class_list = None
-        self.name = "unspecified"
-
-    def pack(self):
-        """
-        Pack a list of items
-
-        Returns the packed string
-        """
-        packed = ""
-        for obj in self.items:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string, bytes=None):
-        """
-        Pure virtual function for a list of items
-
-        Unpack items 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 list in bytes.  
-        Ignored if decode is True.  If 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
-        """
-        pass
-
-    def add(self, item):
-        """
-        Add an item to a list
-
-        @param item The item to add
-        @return True if successful, False if not proper type object
-
-        """
-
-        # Note that the second arg of isinstance can be a list which
-        # checks that the type of item is in the list
-        if (self.class_list is not None) and \
-                not isinstance(item, tuple(self.class_list)):
-            return False
-
-        tmp = copy.deepcopy(item)
-        self.items.append(tmp)
-        return True
-
-    def remove_type(self, target):
-        """
-        Remove the first item on the list of the given type
-
-        @param target The type of item to search
-
-        @return The object removed, if any; otherwise None
-
-        """
-        for index in xrange(len(self.items)):
-            if self.items[index].type == target:
-                return self.items.pop(index)
-        return None
-
-    def find_type(self, target):
-        """
-        Find the first item on the list of the given type
-
-        @param target The type of item to search
-
-        @return The object with the matching type if any; otherwise None
-
-        """
-        for index in xrange(len(self.items)):
-            if self.items[index].type == target:
-                return self.items[index]
-        return None
-
-    def extend(self, other):
-        """
-        Add the items in other to this list
-
-        @param other An object of the same type of list whose
-        entries are to be merged into this list
-
-        @return True if successful.  If not successful, the list
-        may have been modified.
-
-        @todo Check if this is proper deep copy or not
-
-        """
-        for act in other.items:
-            if not self.add(act):
-                return False
-        return True
-
-    def __len__(self):
-        """
-        Length of the list packed as a string
-        """
-        length = 0
-        for item in self.items:
-            length += item.__len__()
-        return length
-
-    def __eq__(self, other):
-        if type(self) != type(other):
-            return False
-        if self.items != other.items:
-            return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    # Methods to make class iterable
-    def __iter__(self):
-        return self.items.__iter__()
-
-    def show(self, prefix=''):
-        outstr = prefix + self.name + "list with " + str(len(self.items)) + \
-            " items\n"
-        count = 0
-        for obj in self.items:
-            count += 1
-            outstr += prefix + " " + self.name + " " + str(count) + ": \n"
-            outstr += obj.show(prefix + '    ')
-        return outstr
diff --git a/src/python/of11/bucket.py b/src/python/of11/bucket.py
deleted file mode 100644
index 64caed1..0000000
--- a/src/python/of11/bucket.py
+++ /dev/null
@@ -1,42 +0,0 @@
-
-# Python OpenFlow bucket wrapper class
-
-from cstruct import ofp_bucket
-from action_list import action_list
-
-
-
-class bucket(ofp_bucket):
-    """
-    Wrapper class for bucket object
-
-    Data members inherited from ofp_bucket:
-    @arg len
-    @arg weight
-    @arg watch_port
-    @arg watch_group
-
-    """
-    def __init__(self):
-        ofp_bucket.__init__(self)
-        self.actions = action_list()
-        self.type = None
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "bucket\n"
-        outstr += ofp_bucket.show(self, prefix)
-        outstr += self.actions.show()
-        return outstr
-    def unpack(self, binary_string):
-        binary_string = ofp_bucket.unpack(self, binary_string)
-        self.actions = action_list()
-        return self.actions.unpack(binary_string)
-    def pack(self):
-        self.len = len(self)
-        packed = ""
-        packed += ofp_bucket.pack(self)
-        packed += self.actions.pack()
-        return packed
-    def __len__(self):
-        return ofp_bucket.__len__(self) + self.actions.__len__()
-
diff --git a/src/python/of11/bucket_list.py b/src/python/of11/bucket_list.py
deleted file mode 100644
index 33d9472..0000000
--- a/src/python/of11/bucket_list.py
+++ /dev/null
@@ -1,52 +0,0 @@
-
-from base_list import ofp_base_list
-from bucket import bucket
-
-class bucket_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.buckets = self.items
-        self.name = "buckets"
-        self.class_list = (bucket,)
-
-    def unpack(self, binary_string, bytes=None):
-        """
-        Unpack a list of buckets
-        
-        Unpack buckets 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
-        cur_string = binary_string
-        while bytes_done < bytes:
-            b = bucket()
-            cur_string = b.unpack(cur_string)
-            self.buckets.append(b)
-            bytes_done += len(b)
-        return cur_string
diff --git a/src/python/of11/class_maps.py b/src/python/of11/class_maps.py
deleted file mode 100644
index 50ff188..0000000
--- a/src/python/of11/class_maps.py
+++ /dev/null
@@ -1,375 +0,0 @@
-
-# Class to array member map
-class_to_members_map = {
-    'ofp_action_mpls_tc'            : [
-                                       'type',
-                                       'len',
-                                       'mpls_tc'
-                                      ],
-    'ofp_aggregate_stats_reply'     : [
-                                       'packet_count',
-                                       'byte_count',
-                                       'flow_count'
-                                      ],
-    'ofp_action_set_queue'          : [
-                                       'type',
-                                       'len',
-                                       'queue_id'
-                                      ],
-    'ofp_table_stats'               : [
-                                       'table_id',
-                                       'name',
-                                       'wildcards',
-                                       'match',
-                                       'instructions',
-                                       'write_actions',
-                                       'apply_actions',
-                                       'config',
-                                       'max_entries',
-                                       'active_count',
-                                       'lookup_count',
-                                       'matched_count'
-                                      ],
-    'ofp_table_mod'                 : [
-                                       'table_id',
-                                       'config'
-                                      ],
-    'ofp_flow_removed'              : [
-                                       'cookie',
-                                       'priority',
-                                       'reason',
-                                       'table_id',
-                                       'duration_sec',
-                                       'duration_nsec',
-                                       'idle_timeout',
-                                       'packet_count',
-                                       'byte_count',
-                                       'match'
-                                      ],
-    'ofp_instruction_actions'       : [
-                                       'type',
-                                       'len'
-                                      ],
-    'ofp_queue_stats'               : [
-                                       'port_no',
-                                       'queue_id',
-                                       'tx_bytes',
-                                       'tx_packets',
-                                       'tx_errors'
-                                      ],
-    'ofp_action_tp_port'            : [
-                                       'type',
-                                       'len',
-                                       'tp_port'
-                                      ],
-    'ofp_action_nw_ecn'             : [
-                                       'type',
-                                       'len',
-                                       'nw_ecn'
-                                      ],
-    'ofp_group_mod'                 : [
-                                       'command',
-                                       'type',
-                                       'group_id'
-                                      ],
-    'ofp_port_stats_request'        : [
-                                       'port_no'
-                                      ],
-    'ofp_stats_request'             : [
-                                       'type',
-                                       'flags'
-                                      ],
-    'ofp_instruction'               : [
-                                       'type',
-                                       'len'
-                                      ],
-    'ofp_group_stats_request'       : [
-                                       'group_id'
-                                      ],
-    'ofp_experimenter_header'       : [
-                                       'experimenter'
-                                      ],
-    'ofp_aggregate_stats_request'   : [
-                                       'table_id',
-                                       'out_port',
-                                       'out_group',
-                                       'cookie',
-                                       'cookie_mask',
-                                       'match'
-                                      ],
-    'ofp_queue_get_config_request'  : [
-                                       'port'
-                                      ],
-    'ofp_instruction_experimenter'  : [
-                                       'type',
-                                       'len',
-                                       'experimenter'
-                                      ],
-    'ofp_action_nw_ttl'             : [
-                                       'type',
-                                       'len',
-                                       'nw_ttl'
-                                      ],
-    'ofp_port_status'               : [
-                                       'reason',
-                                       'desc'
-                                      ],
-    'ofp_action_header'             : [
-                                       'type',
-                                       'len'
-                                      ],
-    'ofp_port_mod'                  : [
-                                       'port_no',
-                                       'hw_addr',
-                                       'config',
-                                       'mask',
-                                       'advertise'
-                                      ],
-    'ofp_action_vlan_vid'           : [
-                                       'type',
-                                       'len',
-                                       'vlan_vid'
-                                      ],
-    'ofp_action_output'             : [
-                                       'type',
-                                       'len',
-                                       'port',
-                                       'max_len'
-                                      ],
-    'ofp_switch_config'             : [
-                                       'flags',
-                                       'miss_send_len'
-                                      ],
-    'ofp_action_nw_tos'             : [
-                                       'type',
-                                       'len',
-                                       'nw_tos'
-                                      ],
-    'ofp_action_experimenter_header' : [
-                                       'type',
-                                       'len',
-                                       'experimenter'
-                                      ],
-    'ofp_queue_get_config_reply'    : [
-                                       'port'
-                                      ],
-    'ofp_queue_prop_header'         : [
-                                       'property',
-                                       'len'
-                                      ],
-    'ofp_packet_in'                 : [
-                                       'buffer_id',
-                                       'in_port',
-                                       'in_phy_port',
-                                       'total_len',
-                                       'reason',
-                                       'table_id'
-                                      ],
-    'ofp_instruction_write_metadata' : [
-                                       'type',
-                                       'len',
-                                       'metadata',
-                                       'metadata_mask'
-                                      ],
-    'ofp_flow_stats'                : [
-                                       'length',
-                                       'table_id',
-                                       'duration_sec',
-                                       'duration_nsec',
-                                       'priority',
-                                       'idle_timeout',
-                                       'hard_timeout',
-                                       'cookie',
-                                       'packet_count',
-                                       'byte_count',
-                                       'match'
-                                      ],
-    'ofp_action_mpls_label'         : [
-                                       'type',
-                                       'len',
-                                       'mpls_label'
-                                      ],
-    'ofp_flow_stats_request'        : [
-                                       'table_id',
-                                       'out_port',
-                                       'out_group',
-                                       'cookie',
-                                       'cookie_mask',
-                                       'match'
-                                      ],
-    'ofp_header'                    : [
-                                       'version',
-                                       'type',
-                                       'length',
-                                       'xid'
-                                      ],
-    'ofp_stats_reply'               : [
-                                       'type',
-                                       'flags'
-                                      ],
-    'ofp_queue_stats_request'       : [
-                                       'port_no',
-                                       'queue_id'
-                                      ],
-    'ofp_desc_stats'                : [
-                                       'mfr_desc',
-                                       'hw_desc',
-                                       'sw_desc',
-                                       'serial_num',
-                                       'dp_desc'
-                                      ],
-    'ofp_match'                     : [
-                                       'type',
-                                       'length',
-                                       'in_port',
-                                       'wildcards',
-                                       'dl_src',
-                                       'dl_src_mask',
-                                       'dl_dst',
-                                       'dl_dst_mask',
-                                       'dl_vlan',
-                                       'dl_vlan_pcp',
-                                       'dl_type',
-                                       'nw_tos',
-                                       'nw_proto',
-                                       'nw_src',
-                                       'nw_src_mask',
-                                       'nw_dst',
-                                       'nw_dst_mask',
-                                       'tp_src',
-                                       'tp_dst',
-                                       'mpls_label',
-                                       'mpls_tc',
-                                       'metadata',
-                                       'metadata_mask'
-                                      ],
-    'ofp_port_stats'                : [
-                                       'port_no',
-                                       'rx_packets',
-                                       'tx_packets',
-                                       'rx_bytes',
-                                       'tx_bytes',
-                                       'rx_dropped',
-                                       'tx_dropped',
-                                       'rx_errors',
-                                       'tx_errors',
-                                       'rx_frame_err',
-                                       'rx_over_err',
-                                       'rx_crc_err',
-                                       'collisions'
-                                      ],
-    'ofp_packet_queue'              : [
-                                       'queue_id',
-                                       'len'
-                                      ],
-    'ofp_port'                      : [
-                                       'port_no',
-                                       'hw_addr',
-                                       'name',
-                                       'config',
-                                       'state',
-                                       'curr',
-                                       'advertised',
-                                       'supported',
-                                       'peer',
-                                       'curr_speed',
-                                       'max_speed'
-                                      ],
-    'ofp_action_dl_addr'            : [
-                                       'type',
-                                       'len',
-                                       'dl_addr'
-                                      ],
-    'ofp_bucket_counter'            : [
-                                       'packet_count',
-                                       'byte_count'
-                                      ],
-    'ofp_queue_prop_min_rate'       : [
-                                       'prop_header',
-                                       'rate'
-                                      ],
-    'ofp_bucket'                    : [
-                                       'len',
-                                       'weight',
-                                       'watch_port',
-                                       'watch_group'
-                                      ],
-    'ofp_switch_features'           : [
-                                       'datapath_id',
-                                       'n_buffers',
-                                       'n_tables',
-                                       'capabilities',
-                                       'reserved'
-                                      ],
-    'ofp_action_pop_mpls'           : [
-                                       'type',
-                                       'len',
-                                       'ethertype'
-                                      ],
-    'ofp_flow_mod'                  : [
-                                       'cookie',
-                                       'cookie_mask',
-                                       'table_id',
-                                       'command',
-                                       'idle_timeout',
-                                       'hard_timeout',
-                                       'priority',
-                                       'buffer_id',
-                                       'out_port',
-                                       'out_group',
-                                       'flags',
-                                       'match'
-                                      ],
-    'ofp_packet_out'                : [
-                                       'buffer_id',
-                                       'in_port',
-                                       'actions_len'
-                                      ],
-    'ofp_instruction_goto_table'    : [
-                                       'type',
-                                       'len',
-                                       'table_id'
-                                      ],
-    'ofp_action_nw_addr'            : [
-                                       'type',
-                                       'len',
-                                       'nw_addr'
-                                      ],
-    'ofp_action_group'              : [
-                                       'type',
-                                       'len',
-                                       'group_id'
-                                      ],
-    'ofp_group_stats'               : [
-                                       'length',
-                                       'group_id',
-                                       'ref_count',
-                                       'packet_count',
-                                       'byte_count'
-                                      ],
-    'ofp_action_vlan_pcp'           : [
-                                       'type',
-                                       'len',
-                                       'vlan_pcp'
-                                      ],
-    'ofp_action_push'               : [
-                                       'type',
-                                       'len',
-                                       'ethertype'
-                                      ],
-    'ofp_group_desc_stats'          : [
-                                       'length',
-                                       'type',
-                                       'group_id'
-                                      ],
-    'ofp_error_msg'                 : [
-                                       'type',
-                                       'code'
-                                      ],
-    'ofp_action_mpls_ttl'           : [
-                                       'type',
-                                       'len',
-                                       'mpls_ttl'
-                                      ],
-    '_ignore' : []
-}
diff --git a/src/python/of11/cstruct.py b/src/python/of11/cstruct.py
deleted file mode 100644
index 1db5f00..0000000
--- a/src/python/of11/cstruct.py
+++ /dev/null
@@ -1,6043 +0,0 @@
-import struct
-
-# Structure definitions
-class ofp_action_mpls_tc(object):
-    """Automatically generated Python class for ofp_action_mpls_tc
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.mpls_tc = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.mpls_tc)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.mpls_tc) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.mpls_tc !=  other.mpls_tc: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'mpls_tc: ' + str(self.mpls_tc) + '\n'
-        return outstr
-
-
-class ofp_aggregate_stats_reply(object):
-    """Automatically generated Python class for ofp_aggregate_stats_reply
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.packet_count = 0
-        self.byte_count = 0
-        self.flow_count = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QQL", self.packet_count, self.byte_count, self.flow_count)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!QQL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count, self.flow_count) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 20
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        if self.flow_count !=  other.flow_count: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        outstr += prefix + 'flow_count: ' + str(self.flow_count) + '\n'
-        return outstr
-
-
-class ofp_action_set_queue(object):
-    """Automatically generated Python class for ofp_action_set_queue
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.queue_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.queue_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.queue_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.queue_id !=  other.queue_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        return outstr
-
-
-class ofp_table_stats(object):
-    """Automatically generated Python class for ofp_table_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad= [0,0,0,0,0,0,0]
-        self.name= ""
-        self.wildcards = 0
-        self.match = 0
-        self.instructions = 0
-        self.write_actions = 0
-        self.apply_actions = 0
-        self.config = 0
-        self.max_entries = 0
-        self.active_count = 0
-        self.lookup_count = 0
-        self.matched_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 7):
-            return (False, "self.pad is not of size 7 as expected.")
-        if(not isinstance(self.name, str)):
-            return (False, "self.name is not string as expected.")
-        if(len(self.name) > 32):
-            return (False, "self.name is not of size 32 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6])
-        packed += self.name.ljust(32,'\0')
-        packed += struct.pack("!LLLLLLLLQQ", self.wildcards, self.match, self.instructions, self.write_actions, self.apply_actions, self.config, self.max_entries, self.active_count, self.lookup_count, self.matched_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 88):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6]) = struct.unpack(fmt, binaryString[start:end])
-        self.name = binaryString[8:40].replace("\0","")
-        fmt = '!LLLLLLLLQQ'
-        start = 40
-        end = start + struct.calcsize(fmt)
-        (self.wildcards, self.match, self.instructions, self.write_actions, self.apply_actions, self.config, self.max_entries, self.active_count, self.lookup_count, self.matched_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[88:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 88
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.name !=  other.name: return False
-        if self.wildcards !=  other.wildcards: return False
-        if self.match !=  other.match: return False
-        if self.instructions !=  other.instructions: return False
-        if self.write_actions !=  other.write_actions: return False
-        if self.apply_actions !=  other.apply_actions: return False
-        if self.config !=  other.config: return False
-        if self.max_entries !=  other.max_entries: return False
-        if self.active_count !=  other.active_count: return False
-        if self.lookup_count !=  other.lookup_count: return False
-        if self.matched_count !=  other.matched_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'name: ' + str(self.name) + '\n'
-        outstr += prefix + 'wildcards: ' + str(self.wildcards) + '\n'
-        outstr += prefix + 'match: ' + str(self.match) + '\n'
-        outstr += prefix + 'instructions: ' + str(self.instructions) + '\n'
-        outstr += prefix + 'write_actions: ' + str(self.write_actions) + '\n'
-        outstr += prefix + 'apply_actions: ' + str(self.apply_actions) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'max_entries: ' + str(self.max_entries) + '\n'
-        outstr += prefix + 'active_count: ' + str(self.active_count) + '\n'
-        outstr += prefix + 'lookup_count: ' + str(self.lookup_count) + '\n'
-        outstr += prefix + 'matched_count: ' + str(self.matched_count) + '\n'
-        return outstr
-
-
-class ofp_table_mod(object):
-    """Automatically generated Python class for ofp_table_mod
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad= [0,0,0]
-        self.config = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += struct.pack("!L", self.config)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!L'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.config,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.config !=  other.config: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        return outstr
-
-
-class ofp_flow_removed(object):
-    """Automatically generated Python class for ofp_flow_removed
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.cookie = 0
-        self.priority = 0
-        self.reason = 0
-        self.table_id = 0
-        self.duration_sec = 0
-        self.duration_nsec = 0
-        self.idle_timeout = 0
-        self.pad2= [0,0]
-        self.packet_count = 0
-        self.byte_count = 0
-        self.match = ofp_match()
-        self.match.length = OFP_MATCH_BYTES
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 2):
-            return (False, "self.pad2 is not of size 2 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QHBBLLH", self.cookie, self.priority, self.reason, self.table_id, self.duration_sec, self.duration_nsec, self.idle_timeout)
-        packed += struct.pack("!BB", self.pad2[0], self.pad2[1])
-        packed += struct.pack("!QQ", self.packet_count, self.byte_count)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 128):
-            return binaryString
-        fmt = '!QHBBLLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.priority, self.reason, self.table_id, self.duration_sec, self.duration_nsec, self.idle_timeout) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 22
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 24
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[40:])
-        return binaryString[128:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 128
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.cookie !=  other.cookie: return False
-        if self.priority !=  other.priority: return False
-        if self.reason !=  other.reason: return False
-        if self.table_id !=  other.table_id: return False
-        if self.duration_sec !=  other.duration_sec: return False
-        if self.duration_nsec !=  other.duration_nsec: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'duration_sec: ' + str(self.duration_sec) + '\n'
-        outstr += prefix + 'duration_nsec: ' + str(self.duration_nsec) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_instruction_actions(object):
-    """Automatically generated Python class for ofp_instruction_actions
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_queue_stats(object):
-    """Automatically generated Python class for ofp_queue_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.queue_id = 0
-        self.tx_bytes = 0
-        self.tx_packets = 0
-        self.tx_errors = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LLQQQ", self.port_no, self.queue_id, self.tx_bytes, self.tx_packets, self.tx_errors)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 32):
-            return binaryString
-        fmt = '!LLQQQ'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no, self.queue_id, self.tx_bytes, self.tx_packets, self.tx_errors) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[32:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 32
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.queue_id !=  other.queue_id: return False
-        if self.tx_bytes !=  other.tx_bytes: return False
-        if self.tx_packets !=  other.tx_packets: return False
-        if self.tx_errors !=  other.tx_errors: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        outstr += prefix + 'tx_bytes: ' + str(self.tx_bytes) + '\n'
-        outstr += prefix + 'tx_packets: ' + str(self.tx_packets) + '\n'
-        outstr += prefix + 'tx_errors: ' + str(self.tx_errors) + '\n'
-        return outstr
-
-
-class ofp_action_tp_port(object):
-    """Automatically generated Python class for ofp_action_tp_port
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.tp_port = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.tp_port)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.tp_port) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.tp_port !=  other.tp_port: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'tp_port: ' + str(self.tp_port) + '\n'
-        return outstr
-
-
-class ofp_action_nw_ecn(object):
-    """Automatically generated Python class for ofp_action_nw_ecn
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.nw_ecn = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.nw_ecn)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.nw_ecn) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.nw_ecn !=  other.nw_ecn: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'nw_ecn: ' + str(self.nw_ecn) + '\n'
-        return outstr
-
-
-class ofp_group_mod(object):
-    """Automatically generated Python class for ofp_group_mod
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.command = 0
-        self.type = 0
-        self.pad = 0
-        self.group_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HBBL", self.command, self.type, self.pad, self.group_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HBBL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.command, self.type, self.pad, self.group_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.command !=  other.command: return False
-        if self.type !=  other.type: return False
-        if self.pad !=  other.pad: return False
-        if self.group_id !=  other.group_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'command: ' + str(self.command) + '\n'
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_port_stats_request(object):
-    """Automatically generated Python class for ofp_port_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        return outstr
-
-
-class ofp_stats_request(object):
-    """Automatically generated Python class for ofp_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.flags = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.flags)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.flags !=  other.flags: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        return outstr
-
-
-class ofp_instruction(object):
-    """Automatically generated Python class for ofp_instruction
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_hello(object):
-    """Automatically generated Python class for ofp_hello
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 0):
-            return binaryString
-        return binaryString[0:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 0
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        return outstr
-
-
-class ofp_group_stats_request(object):
-    """Automatically generated Python class for ofp_group_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.group_id = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.group_id)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.group_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.group_id !=  other.group_id: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_experimenter_header(object):
-    """Automatically generated Python class for ofp_experimenter_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.experimenter = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.experimenter)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.experimenter,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.experimenter !=  other.experimenter: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        return outstr
-
-
-class ofp_aggregate_stats_request(object):
-    """Automatically generated Python class for ofp_aggregate_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad= [0,0,0]
-        self.out_port = 0
-        self.out_group = 0
-        self.pad2= [0,0,0,0]
-        self.cookie = 0
-        self.cookie_mask = 0
-        self.match = ofp_match()
-        self.match.length = OFP_MATCH_BYTES
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 4):
-            return (False, "self.pad2 is not of size 4 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += struct.pack("!LL", self.out_port, self.out_group)
-        packed += struct.pack("!BBBB", self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3])
-        packed += struct.pack("!QQ", self.cookie, self.cookie_mask)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 120):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.out_port, self.out_group) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.cookie_mask) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[32:])
-        return binaryString[120:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 120
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.out_port !=  other.out_port: return False
-        if self.out_group !=  other.out_group: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.cookie !=  other.cookie: return False
-        if self.cookie_mask !=  other.cookie_mask: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        outstr += prefix + 'out_group: ' + str(self.out_group) + '\n'
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'cookie_mask: ' + str(self.cookie_mask) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_queue_get_config_request(object):
-    """Automatically generated Python class for ofp_queue_get_config_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port !=  other.port: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        return outstr
-
-
-class ofp_instruction_experimenter(object):
-    """Automatically generated Python class for ofp_instruction_experimenter
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.experimenter = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.experimenter)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.experimenter) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.experimenter !=  other.experimenter: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        return outstr
-
-
-class ofp_action_nw_ttl(object):
-    """Automatically generated Python class for ofp_action_nw_ttl
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.nw_ttl = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.nw_ttl)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.nw_ttl) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.nw_ttl !=  other.nw_ttl: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'nw_ttl: ' + str(self.nw_ttl) + '\n'
-        return outstr
-
-
-class ofp_port_status(object):
-    """Automatically generated Python class for ofp_port_status
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.reason = 0
-        self.pad= [0,0,0,0,0,0,0]
-        self.desc = ofp_port()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 7):
-            return (False, "self.pad is not of size 7 as expected.")
-        if(not isinstance(self.desc, ofp_port)):
-            return (False, "self.desc is not class ofp_port as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.reason)
-        packed += struct.pack("!BBBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6])
-        packed += self.desc.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 72):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.reason,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6]) = struct.unpack(fmt, binaryString[start:end])
-        self.desc.unpack(binaryString[8:])
-        return binaryString[72:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 72
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.reason !=  other.reason: return False
-        if self.pad !=  other.pad: return False
-        if self.desc !=  other.desc: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'desc: \n' 
-        outstr += self.desc.show(prefix + '  ')
-        return outstr
-
-
-class ofp_action_header(object):
-    """Automatically generated Python class for ofp_action_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_port_mod(object):
-    """Automatically generated Python class for ofp_port_mod
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-        self.hw_addr= [0,0,0,0,0,0]
-        self.pad2= [0,0]
-        self.config = 0
-        self.mask = 0
-        self.advertise = 0
-        self.pad3= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        if(not isinstance(self.hw_addr, list)):
-            return (False, "self.hw_addr is not list as expected.")
-        if(len(self.hw_addr) != 6):
-            return (False, "self.hw_addr is not of size 6 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 2):
-            return (False, "self.pad2 is not of size 2 as expected.")
-        if(not isinstance(self.pad3, list)):
-            return (False, "self.pad3 is not list as expected.")
-        if(len(self.pad3) != 4):
-            return (False, "self.pad3 is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!BBBBBB", self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5])
-        packed += struct.pack("!BB", self.pad2[0], self.pad2[1])
-        packed += struct.pack("!LLL", self.config, self.mask, self.advertise)
-        packed += struct.pack("!BBBB", self.pad3[0], self.pad3[1], self.pad3[2], self.pad3[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 32):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 14
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LLL'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.config, self.mask, self.advertise) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 28
-        end = start + struct.calcsize(fmt)
-        (self.pad3[0], self.pad3[1], self.pad3[2], self.pad3[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[32:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 32
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.hw_addr !=  other.hw_addr: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.config !=  other.config: return False
-        if self.mask !=  other.mask: return False
-        if self.advertise !=  other.advertise: return False
-        if self.pad3 !=  other.pad3: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'hw_addr: ' + str(self.hw_addr) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'mask: ' + str(self.mask) + '\n'
-        outstr += prefix + 'advertise: ' + str(self.advertise) + '\n'
-        return outstr
-
-
-class ofp_action_vlan_vid(object):
-    """Automatically generated Python class for ofp_action_vlan_vid
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.vlan_vid = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.vlan_vid)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.vlan_vid) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.vlan_vid !=  other.vlan_vid: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'vlan_vid: ' + str(self.vlan_vid) + '\n'
-        return outstr
-
-
-class ofp_action_output(object):
-    """Automatically generated Python class for ofp_action_output
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.port = 0
-        self.max_len = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHLH", self.type, self.len, self.port, self.max_len)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!HHLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.port, self.max_len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.port !=  other.port: return False
-        if self.max_len !=  other.max_len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        outstr += prefix + 'max_len: ' + str(self.max_len) + '\n'
-        return outstr
-
-
-class ofp_switch_config(object):
-    """Automatically generated Python class for ofp_switch_config
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.flags = 0
-        self.miss_send_len = 128
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.flags, self.miss_send_len)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.flags, self.miss_send_len) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.flags !=  other.flags: return False
-        if self.miss_send_len !=  other.miss_send_len: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        outstr += prefix + 'miss_send_len: ' + str(self.miss_send_len) + '\n'
-        return outstr
-
-
-class ofp_action_nw_tos(object):
-    """Automatically generated Python class for ofp_action_nw_tos
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.nw_tos = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.nw_tos)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.nw_tos) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.nw_tos !=  other.nw_tos: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'nw_tos: ' + str(self.nw_tos) + '\n'
-        return outstr
-
-
-class ofp_action_experimenter_header(object):
-    """Automatically generated Python class for ofp_action_experimenter_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.experimenter = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.experimenter)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.experimenter) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.experimenter !=  other.experimenter: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        return outstr
-
-
-class ofp_queue_get_config_reply(object):
-    """Automatically generated Python class for ofp_queue_get_config_reply
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port !=  other.port: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        return outstr
-
-
-class ofp_queue_prop_header(object):
-    """Automatically generated Python class for ofp_queue_prop_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.property = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.property, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.property, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.property !=  other.property: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'property: ' + str(self.property) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_packet_in(object):
-    """Automatically generated Python class for ofp_packet_in
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.buffer_id = 0
-        self.in_port = 0
-        self.in_phy_port = 0
-        self.total_len = 0
-        self.reason = 0
-        self.table_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LLLHBB", self.buffer_id, self.in_port, self.in_phy_port, self.total_len, self.reason, self.table_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!LLLHBB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.buffer_id, self.in_port, self.in_phy_port, self.total_len, self.reason, self.table_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.in_port !=  other.in_port: return False
-        if self.in_phy_port !=  other.in_phy_port: return False
-        if self.total_len !=  other.total_len: return False
-        if self.reason !=  other.reason: return False
-        if self.table_id !=  other.table_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'in_port: ' + str(self.in_port) + '\n'
-        outstr += prefix + 'in_phy_port: ' + str(self.in_phy_port) + '\n'
-        outstr += prefix + 'total_len: ' + str(self.total_len) + '\n'
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        return outstr
-
-
-class ofp_instruction_write_metadata(object):
-    """Automatically generated Python class for ofp_instruction_write_metadata
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-        self.metadata = 0
-        self.metadata_mask = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!QQ", self.metadata, self.metadata_mask)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.metadata, self.metadata_mask) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        if self.metadata !=  other.metadata: return False
-        if self.metadata_mask !=  other.metadata_mask: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'metadata: ' + str(self.metadata) + '\n'
-        outstr += prefix + 'metadata_mask: ' + str(self.metadata_mask) + '\n'
-        return outstr
-
-
-class ofp_flow_stats(object):
-    """Automatically generated Python class for ofp_flow_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.length = 0
-        self.table_id = 0
-        self.pad = 0
-        self.duration_sec = 0
-        self.duration_nsec = 0
-        self.priority = 0x8000
-        self.idle_timeout = 0
-        self.hard_timeout = 0
-        self.pad2= [0,0,0,0,0,0]
-        self.cookie = 0
-        self.packet_count = 0
-        self.byte_count = 0
-        self.match = ofp_match()
-        self.match.length = OFP_MATCH_BYTES
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 6):
-            return (False, "self.pad2 is not of size 6 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HBBLLHHH", self.length, self.table_id, self.pad, self.duration_sec, self.duration_nsec, self.priority, self.idle_timeout, self.hard_timeout)
-        packed += struct.pack("!BBBBBB", self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3], self.pad2[4], self.pad2[5])
-        packed += struct.pack("!QQQ", self.cookie, self.packet_count, self.byte_count)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 136):
-            return binaryString
-        fmt = '!HBBLLHHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.length, self.table_id, self.pad, self.duration_sec, self.duration_nsec, self.priority, self.idle_timeout, self.hard_timeout) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 18
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3], self.pad2[4], self.pad2[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQQ'
-        start = 24
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[48:])
-        return binaryString[136:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 136
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.length !=  other.length: return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.duration_sec !=  other.duration_sec: return False
-        if self.duration_nsec !=  other.duration_nsec: return False
-        if self.priority !=  other.priority: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.hard_timeout !=  other.hard_timeout: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.cookie !=  other.cookie: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'duration_sec: ' + str(self.duration_sec) + '\n'
-        outstr += prefix + 'duration_nsec: ' + str(self.duration_nsec) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'hard_timeout: ' + str(self.hard_timeout) + '\n'
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_action_mpls_label(object):
-    """Automatically generated Python class for ofp_action_mpls_label
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.mpls_label = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.mpls_label)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.mpls_label) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.mpls_label !=  other.mpls_label: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'mpls_label: ' + str(self.mpls_label) + '\n'
-        return outstr
-
-
-class ofp_flow_stats_request(object):
-    """Automatically generated Python class for ofp_flow_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad= [0,0,0]
-        self.out_port = 0
-        self.out_group = 0
-        self.pad2= [0,0,0,0]
-        self.cookie = 0
-        self.cookie_mask = 0
-        self.match = ofp_match()
-        self.match.length = OFP_MATCH_BYTES
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 4):
-            return (False, "self.pad2 is not of size 4 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += struct.pack("!LL", self.out_port, self.out_group)
-        packed += struct.pack("!BBBB", self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3])
-        packed += struct.pack("!QQ", self.cookie, self.cookie_mask)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 120):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.out_port, self.out_group) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.cookie_mask) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[32:])
-        return binaryString[120:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 120
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.out_port !=  other.out_port: return False
-        if self.out_group !=  other.out_group: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.cookie !=  other.cookie: return False
-        if self.cookie_mask !=  other.cookie_mask: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        outstr += prefix + 'out_group: ' + str(self.out_group) + '\n'
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'cookie_mask: ' + str(self.cookie_mask) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_header(object):
-    """Automatically generated Python class for ofp_header
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.version = 0x02
-        self.type = 0
-        self.length = 0
-        self.xid = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if (not (self.type in ofp_type_map.keys())):
-            return (False, "type must have values from ofp_type_map.keys()")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!BBHL", self.version, self.type, self.length, self.xid)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!BBHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.version, self.type, self.length, self.xid) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.version !=  other.version: return False
-        if self.type !=  other.type: return False
-        if self.length !=  other.length: return False
-        if self.xid !=  other.xid: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'version: ' + str(self.version) + '\n'
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'xid: ' + str(self.xid) + '\n'
-        return outstr
-
-
-class ofp_stats_reply(object):
-    """Automatically generated Python class for ofp_stats_reply
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.flags = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.flags)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.flags !=  other.flags: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        return outstr
-
-
-class ofp_queue_stats_request(object):
-    """Automatically generated Python class for ofp_queue_stats_request
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.queue_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LL", self.port_no, self.queue_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no, self.queue_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.queue_id !=  other.queue_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        return outstr
-
-
-class ofp_desc_stats(object):
-    """Automatically generated Python class for ofp_desc_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.mfr_desc= ""
-        self.hw_desc= ""
-        self.sw_desc= ""
-        self.serial_num= ""
-        self.dp_desc= ""
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.mfr_desc, str)):
-            return (False, "self.mfr_desc is not string as expected.")
-        if(len(self.mfr_desc) > 256):
-            return (False, "self.mfr_desc is not of size 256 as expected.")
-        if(not isinstance(self.hw_desc, str)):
-            return (False, "self.hw_desc is not string as expected.")
-        if(len(self.hw_desc) > 256):
-            return (False, "self.hw_desc is not of size 256 as expected.")
-        if(not isinstance(self.sw_desc, str)):
-            return (False, "self.sw_desc is not string as expected.")
-        if(len(self.sw_desc) > 256):
-            return (False, "self.sw_desc is not of size 256 as expected.")
-        if(not isinstance(self.serial_num, str)):
-            return (False, "self.serial_num is not string as expected.")
-        if(len(self.serial_num) > 32):
-            return (False, "self.serial_num is not of size 32 as expected.")
-        if(not isinstance(self.dp_desc, str)):
-            return (False, "self.dp_desc is not string as expected.")
-        if(len(self.dp_desc) > 256):
-            return (False, "self.dp_desc is not of size 256 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.mfr_desc.ljust(256,'\0')
-        packed += self.hw_desc.ljust(256,'\0')
-        packed += self.sw_desc.ljust(256,'\0')
-        packed += self.serial_num.ljust(32,'\0')
-        packed += self.dp_desc.ljust(256,'\0')
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 1056):
-            return binaryString
-        self.mfr_desc = binaryString[0:256].replace("\0","")
-        self.hw_desc = binaryString[256:512].replace("\0","")
-        self.sw_desc = binaryString[512:768].replace("\0","")
-        self.serial_num = binaryString[768:800].replace("\0","")
-        self.dp_desc = binaryString[800:1056].replace("\0","")
-        return binaryString[1056:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 1056
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.mfr_desc !=  other.mfr_desc: return False
-        if self.hw_desc !=  other.hw_desc: return False
-        if self.sw_desc !=  other.sw_desc: return False
-        if self.serial_num !=  other.serial_num: return False
-        if self.dp_desc !=  other.dp_desc: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'mfr_desc: ' + str(self.mfr_desc) + '\n'
-        outstr += prefix + 'hw_desc: ' + str(self.hw_desc) + '\n'
-        outstr += prefix + 'sw_desc: ' + str(self.sw_desc) + '\n'
-        outstr += prefix + 'serial_num: ' + str(self.serial_num) + '\n'
-        outstr += prefix + 'dp_desc: ' + str(self.dp_desc) + '\n'
-        return outstr
-
-
-class ofp_match(object):
-    """Automatically generated Python class for ofp_match
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.length = 0
-        self.in_port = 0
-        self.wildcards = 0
-        self.dl_src= [0,0,0,0,0,0]
-        self.dl_src_mask= [0,0,0,0,0,0]
-        self.dl_dst= [0,0,0,0,0,0]
-        self.dl_dst_mask= [0,0,0,0,0,0]
-        self.dl_vlan = 0
-        self.dl_vlan_pcp = 0
-        self.pad1 = 0
-        self.dl_type = 0
-        self.nw_tos = 0
-        self.nw_proto = 0
-        self.nw_src = 0
-        self.nw_src_mask = 0
-        self.nw_dst = 0
-        self.nw_dst_mask = 0
-        self.tp_src = 0
-        self.tp_dst = 0
-        self.mpls_label = 0
-        self.mpls_tc = 0
-        self.pad2= [0,0,0]
-        self.metadata = 0
-        self.metadata_mask = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.dl_src, list)):
-            return (False, "self.dl_src is not list as expected.")
-        if(len(self.dl_src) != 6):
-            return (False, "self.dl_src is not of size 6 as expected.")
-        if(not isinstance(self.dl_src_mask, list)):
-            return (False, "self.dl_src_mask is not list as expected.")
-        if(len(self.dl_src_mask) != 6):
-            return (False, "self.dl_src_mask is not of size 6 as expected.")
-        if(not isinstance(self.dl_dst, list)):
-            return (False, "self.dl_dst is not list as expected.")
-        if(len(self.dl_dst) != 6):
-            return (False, "self.dl_dst is not of size 6 as expected.")
-        if(not isinstance(self.dl_dst_mask, list)):
-            return (False, "self.dl_dst_mask is not list as expected.")
-        if(len(self.dl_dst_mask) != 6):
-            return (False, "self.dl_dst_mask is not of size 6 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 3):
-            return (False, "self.pad2 is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHLL", self.type, self.length, self.in_port, self.wildcards)
-        packed += struct.pack("!BBBBBB", self.dl_src[0], self.dl_src[1], self.dl_src[2], self.dl_src[3], self.dl_src[4], self.dl_src[5])
-        packed += struct.pack("!BBBBBB", self.dl_src_mask[0], self.dl_src_mask[1], self.dl_src_mask[2], self.dl_src_mask[3], self.dl_src_mask[4], self.dl_src_mask[5])
-        packed += struct.pack("!BBBBBB", self.dl_dst[0], self.dl_dst[1], self.dl_dst[2], self.dl_dst[3], self.dl_dst[4], self.dl_dst[5])
-        packed += struct.pack("!BBBBBB", self.dl_dst_mask[0], self.dl_dst_mask[1], self.dl_dst_mask[2], self.dl_dst_mask[3], self.dl_dst_mask[4], self.dl_dst_mask[5])
-        packed += struct.pack("!HBBHBBLLLLHHLB", self.dl_vlan, self.dl_vlan_pcp, self.pad1, self.dl_type, self.nw_tos, self.nw_proto, self.nw_src, self.nw_src_mask, self.nw_dst, self.nw_dst_mask, self.tp_src, self.tp_dst, self.mpls_label, self.mpls_tc)
-        packed += struct.pack("!BBB", self.pad2[0], self.pad2[1], self.pad2[2])
-        packed += struct.pack("!QQ", self.metadata, self.metadata_mask)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 88):
-            return binaryString
-        fmt = '!HHLL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.length, self.in_port, self.wildcards) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.dl_src[0], self.dl_src[1], self.dl_src[2], self.dl_src[3], self.dl_src[4], self.dl_src[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 18
-        end = start + struct.calcsize(fmt)
-        (self.dl_src_mask[0], self.dl_src_mask[1], self.dl_src_mask[2], self.dl_src_mask[3], self.dl_src_mask[4], self.dl_src_mask[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 24
-        end = start + struct.calcsize(fmt)
-        (self.dl_dst[0], self.dl_dst[1], self.dl_dst[2], self.dl_dst[3], self.dl_dst[4], self.dl_dst[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 30
-        end = start + struct.calcsize(fmt)
-        (self.dl_dst_mask[0], self.dl_dst_mask[1], self.dl_dst_mask[2], self.dl_dst_mask[3], self.dl_dst_mask[4], self.dl_dst_mask[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!HBBHBBLLLLHHLB'
-        start = 36
-        end = start + struct.calcsize(fmt)
-        (self.dl_vlan, self.dl_vlan_pcp, self.pad1, self.dl_type, self.nw_tos, self.nw_proto, self.nw_src, self.nw_src_mask, self.nw_dst, self.nw_dst_mask, self.tp_src, self.tp_dst, self.mpls_label, self.mpls_tc) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 69
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 72
-        end = start + struct.calcsize(fmt)
-        (self.metadata, self.metadata_mask) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[88:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 88
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.length !=  other.length: return False
-        if self.in_port !=  other.in_port: return False
-        if self.wildcards !=  other.wildcards: return False
-        if self.dl_src !=  other.dl_src: return False
-        if self.dl_src_mask !=  other.dl_src_mask: return False
-        if self.dl_dst !=  other.dl_dst: return False
-        if self.dl_dst_mask !=  other.dl_dst_mask: return False
-        if self.dl_vlan !=  other.dl_vlan: return False
-        if self.dl_vlan_pcp !=  other.dl_vlan_pcp: return False
-        if self.pad1 !=  other.pad1: return False
-        if self.dl_type !=  other.dl_type: return False
-        if self.nw_tos !=  other.nw_tos: return False
-        if self.nw_proto !=  other.nw_proto: return False
-        if self.nw_src !=  other.nw_src: return False
-        if self.nw_src_mask !=  other.nw_src_mask: return False
-        if self.nw_dst !=  other.nw_dst: return False
-        if self.nw_dst_mask !=  other.nw_dst_mask: return False
-        if self.tp_src !=  other.tp_src: return False
-        if self.tp_dst !=  other.tp_dst: return False
-        if self.mpls_label !=  other.mpls_label: return False
-        if self.mpls_tc !=  other.mpls_tc: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.metadata !=  other.metadata: return False
-        if self.metadata_mask !=  other.metadata_mask: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'in_port: ' + str(self.in_port) + '\n'
-        outstr += prefix + 'wildcards: ' + str(self.wildcards) + '\n'
-        outstr += prefix + 'dl_src: ' + str(self.dl_src) + '\n'
-        outstr += prefix + 'dl_src_mask: ' + str(self.dl_src_mask) + '\n'
-        outstr += prefix + 'dl_dst: ' + str(self.dl_dst) + '\n'
-        outstr += prefix + 'dl_dst_mask: ' + str(self.dl_dst_mask) + '\n'
-        outstr += prefix + 'dl_vlan: ' + str(self.dl_vlan) + '\n'
-        outstr += prefix + 'dl_vlan_pcp: ' + str(self.dl_vlan_pcp) + '\n'
-        outstr += prefix + 'dl_type: ' + str(self.dl_type) + '\n'
-        outstr += prefix + 'nw_tos: ' + str(self.nw_tos) + '\n'
-        outstr += prefix + 'nw_proto: ' + str(self.nw_proto) + '\n'
-        outstr += prefix + 'nw_src: ' + str(self.nw_src) + '\n'
-        outstr += prefix + 'nw_src_mask: ' + str(self.nw_src_mask) + '\n'
-        outstr += prefix + 'nw_dst: ' + str(self.nw_dst) + '\n'
-        outstr += prefix + 'nw_dst_mask: ' + str(self.nw_dst_mask) + '\n'
-        outstr += prefix + 'tp_src: ' + str(self.tp_src) + '\n'
-        outstr += prefix + 'tp_dst: ' + str(self.tp_dst) + '\n'
-        outstr += prefix + 'mpls_label: ' + str(self.mpls_label) + '\n'
-        outstr += prefix + 'mpls_tc: ' + str(self.mpls_tc) + '\n'
-        outstr += prefix + 'metadata: ' + str(self.metadata) + '\n'
-        outstr += prefix + 'metadata_mask: ' + str(self.metadata_mask) + '\n'
-        return outstr
-
-
-class ofp_port_stats(object):
-    """Automatically generated Python class for ofp_port_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-        self.rx_packets = 0
-        self.tx_packets = 0
-        self.rx_bytes = 0
-        self.tx_bytes = 0
-        self.rx_dropped = 0
-        self.tx_dropped = 0
-        self.rx_errors = 0
-        self.tx_errors = 0
-        self.rx_frame_err = 0
-        self.rx_over_err = 0
-        self.rx_crc_err = 0
-        self.collisions = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!QQQQQQQQQQQQ", self.rx_packets, self.tx_packets, self.rx_bytes, self.tx_bytes, self.rx_dropped, self.tx_dropped, self.rx_errors, self.tx_errors, self.rx_frame_err, self.rx_over_err, self.rx_crc_err, self.collisions)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 104):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQQQQQQQQQQQ'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.rx_packets, self.tx_packets, self.rx_bytes, self.tx_bytes, self.rx_dropped, self.tx_dropped, self.rx_errors, self.tx_errors, self.rx_frame_err, self.rx_over_err, self.rx_crc_err, self.collisions) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[104:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 104
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.rx_packets !=  other.rx_packets: return False
-        if self.tx_packets !=  other.tx_packets: return False
-        if self.rx_bytes !=  other.rx_bytes: return False
-        if self.tx_bytes !=  other.tx_bytes: return False
-        if self.rx_dropped !=  other.rx_dropped: return False
-        if self.tx_dropped !=  other.tx_dropped: return False
-        if self.rx_errors !=  other.rx_errors: return False
-        if self.tx_errors !=  other.tx_errors: return False
-        if self.rx_frame_err !=  other.rx_frame_err: return False
-        if self.rx_over_err !=  other.rx_over_err: return False
-        if self.rx_crc_err !=  other.rx_crc_err: return False
-        if self.collisions !=  other.collisions: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'rx_packets: ' + str(self.rx_packets) + '\n'
-        outstr += prefix + 'tx_packets: ' + str(self.tx_packets) + '\n'
-        outstr += prefix + 'rx_bytes: ' + str(self.rx_bytes) + '\n'
-        outstr += prefix + 'tx_bytes: ' + str(self.tx_bytes) + '\n'
-        outstr += prefix + 'rx_dropped: ' + str(self.rx_dropped) + '\n'
-        outstr += prefix + 'tx_dropped: ' + str(self.tx_dropped) + '\n'
-        outstr += prefix + 'rx_errors: ' + str(self.rx_errors) + '\n'
-        outstr += prefix + 'tx_errors: ' + str(self.tx_errors) + '\n'
-        outstr += prefix + 'rx_frame_err: ' + str(self.rx_frame_err) + '\n'
-        outstr += prefix + 'rx_over_err: ' + str(self.rx_over_err) + '\n'
-        outstr += prefix + 'rx_crc_err: ' + str(self.rx_crc_err) + '\n'
-        outstr += prefix + 'collisions: ' + str(self.collisions) + '\n'
-        return outstr
-
-
-class ofp_packet_queue(object):
-    """Automatically generated Python class for ofp_packet_queue
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.queue_id = 0
-        self.len = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LH", self.queue_id, self.len)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.queue_id, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.queue_id !=  other.queue_id: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_port(object):
-    """Automatically generated Python class for ofp_port
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-        self.hw_addr= [0,0,0,0,0,0]
-        self.pad2= [0,0]
-        self.name= ""
-        self.config = 0
-        self.state = 0
-        self.curr = 0
-        self.advertised = 0
-        self.supported = 0
-        self.peer = 0
-        self.curr_speed = 0
-        self.max_speed = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        if(not isinstance(self.hw_addr, list)):
-            return (False, "self.hw_addr is not list as expected.")
-        if(len(self.hw_addr) != 6):
-            return (False, "self.hw_addr is not of size 6 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 2):
-            return (False, "self.pad2 is not of size 2 as expected.")
-        if(not isinstance(self.name, str)):
-            return (False, "self.name is not string as expected.")
-        if(len(self.name) > 16):
-            return (False, "self.name is not of size 16 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!BBBBBB", self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5])
-        packed += struct.pack("!BB", self.pad2[0], self.pad2[1])
-        packed += self.name.ljust(16,'\0')
-        packed += struct.pack("!LLLLLLLL", self.config, self.state, self.curr, self.advertised, self.supported, self.peer, self.curr_speed, self.max_speed)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 64):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 14
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1]) = struct.unpack(fmt, binaryString[start:end])
-        self.name = binaryString[16:32].replace("\0","")
-        fmt = '!LLLLLLLL'
-        start = 32
-        end = start + struct.calcsize(fmt)
-        (self.config, self.state, self.curr, self.advertised, self.supported, self.peer, self.curr_speed, self.max_speed) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[64:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 64
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.hw_addr !=  other.hw_addr: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.name !=  other.name: return False
-        if self.config !=  other.config: return False
-        if self.state !=  other.state: return False
-        if self.curr !=  other.curr: return False
-        if self.advertised !=  other.advertised: return False
-        if self.supported !=  other.supported: return False
-        if self.peer !=  other.peer: return False
-        if self.curr_speed !=  other.curr_speed: return False
-        if self.max_speed !=  other.max_speed: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'hw_addr: ' + str(self.hw_addr) + '\n'
-        outstr += prefix + 'name: ' + str(self.name) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'state: ' + str(self.state) + '\n'
-        outstr += prefix + 'curr: ' + str(self.curr) + '\n'
-        outstr += prefix + 'advertised: ' + str(self.advertised) + '\n'
-        outstr += prefix + 'supported: ' + str(self.supported) + '\n'
-        outstr += prefix + 'peer: ' + str(self.peer) + '\n'
-        outstr += prefix + 'curr_speed: ' + str(self.curr_speed) + '\n'
-        outstr += prefix + 'max_speed: ' + str(self.max_speed) + '\n'
-        return outstr
-
-
-class ofp_action_dl_addr(object):
-    """Automatically generated Python class for ofp_action_dl_addr
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.dl_addr= [0,0,0,0,0,0]
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.dl_addr, list)):
-            return (False, "self.dl_addr is not list as expected.")
-        if(len(self.dl_addr) != 6):
-            return (False, "self.dl_addr is not of size 6 as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBBBB", self.dl_addr[0], self.dl_addr[1], self.dl_addr[2], self.dl_addr[3], self.dl_addr[4], self.dl_addr[5])
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.dl_addr[0], self.dl_addr[1], self.dl_addr[2], self.dl_addr[3], self.dl_addr[4], self.dl_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.dl_addr !=  other.dl_addr: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'dl_addr: ' + str(self.dl_addr) + '\n'
-        return outstr
-
-
-class ofp_bucket_counter(object):
-    """Automatically generated Python class for ofp_bucket_counter
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.packet_count = 0
-        self.byte_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QQ", self.packet_count, self.byte_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!QQ'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        return outstr
-
-
-class ofp_queue_prop_min_rate(object):
-    """Automatically generated Python class for ofp_queue_prop_min_rate
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.prop_header = ofp_queue_prop_header()
-        self.rate = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.prop_header, ofp_queue_prop_header)):
-            return (False, "self.prop_header is not class ofp_queue_prop_header as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.prop_header.pack()
-        packed += struct.pack("!H", self.rate)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        self.prop_header.unpack(binaryString[0:])
-        fmt = '!H'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.rate,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.prop_header !=  other.prop_header: return False
-        if self.rate !=  other.rate: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'prop_header: \n' 
-        outstr += self.prop_header.show(prefix + '  ')
-        outstr += prefix + 'rate: ' + str(self.rate) + '\n'
-        return outstr
-
-
-class ofp_bucket(object):
-    """Automatically generated Python class for ofp_bucket
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.len = 0
-        self.weight = 0
-        self.watch_port = 0
-        self.watch_group = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHLL", self.len, self.weight, self.watch_port, self.watch_group)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!HHLL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.len, self.weight, self.watch_port, self.watch_group) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.len !=  other.len: return False
-        if self.weight !=  other.weight: return False
-        if self.watch_port !=  other.watch_port: return False
-        if self.watch_group !=  other.watch_group: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'weight: ' + str(self.weight) + '\n'
-        outstr += prefix + 'watch_port: ' + str(self.watch_port) + '\n'
-        outstr += prefix + 'watch_group: ' + str(self.watch_group) + '\n'
-        return outstr
-
-
-class ofp_switch_features(object):
-    """Automatically generated Python class for ofp_switch_features
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.datapath_id = 0
-        self.n_buffers = 0
-        self.n_tables = 0
-        self.pad= [0,0,0]
-        self.capabilities = 0
-        self.reserved = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QLB", self.datapath_id, self.n_buffers, self.n_tables)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += struct.pack("!LL", self.capabilities, self.reserved)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!QLB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.datapath_id, self.n_buffers, self.n_tables) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 13
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.capabilities, self.reserved) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.datapath_id !=  other.datapath_id: return False
-        if self.n_buffers !=  other.n_buffers: return False
-        if self.n_tables !=  other.n_tables: return False
-        if self.pad !=  other.pad: return False
-        if self.capabilities !=  other.capabilities: return False
-        if self.reserved !=  other.reserved: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'datapath_id: ' + str(self.datapath_id) + '\n'
-        outstr += prefix + 'n_buffers: ' + str(self.n_buffers) + '\n'
-        outstr += prefix + 'n_tables: ' + str(self.n_tables) + '\n'
-        outstr += prefix + 'capabilities: ' + str(self.capabilities) + '\n'
-        outstr += prefix + 'reserved: ' + str(self.reserved) + '\n'
-        return outstr
-
-
-class ofp_action_pop_mpls(object):
-    """Automatically generated Python class for ofp_action_pop_mpls
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.ethertype = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.ethertype)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.ethertype) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.ethertype !=  other.ethertype: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'ethertype: ' + str(self.ethertype) + '\n'
-        return outstr
-
-
-class ofp_flow_mod(object):
-    """Automatically generated Python class for ofp_flow_mod
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.cookie = 0
-        self.cookie_mask = 0
-        self.table_id = 0
-        self.command = 0
-        self.idle_timeout = 0
-        self.hard_timeout = 0
-        self.priority = 0x8000
-        self.buffer_id = 0
-        self.out_port = 0
-        self.out_group = 0
-        self.flags = 0
-        self.pad= [0,0]
-        self.match = ofp_match()
-        self.match.length = OFP_MATCH_BYTES
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QQBBHHHLLLH", self.cookie, self.cookie_mask, self.table_id, self.command, self.idle_timeout, self.hard_timeout, self.priority, self.buffer_id, self.out_port, self.out_group, self.flags)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 128):
-            return binaryString
-        fmt = '!QQBBHHHLLLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.cookie_mask, self.table_id, self.command, self.idle_timeout, self.hard_timeout, self.priority, self.buffer_id, self.out_port, self.out_group, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 38
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        self.match.unpack(binaryString[40:])
-        return binaryString[128:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 128
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.cookie !=  other.cookie: return False
-        if self.cookie_mask !=  other.cookie_mask: return False
-        if self.table_id !=  other.table_id: return False
-        if self.command !=  other.command: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.hard_timeout !=  other.hard_timeout: return False
-        if self.priority !=  other.priority: return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.out_port !=  other.out_port: return False
-        if self.out_group !=  other.out_group: return False
-        if self.flags !=  other.flags: return False
-        if self.pad !=  other.pad: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'cookie_mask: ' + str(self.cookie_mask) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'command: ' + str(self.command) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'hard_timeout: ' + str(self.hard_timeout) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        outstr += prefix + 'out_group: ' + str(self.out_group) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_packet_out(object):
-    """Automatically generated Python class for ofp_packet_out
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.buffer_id = 4294967295
-        self.in_port = 0
-        self.actions_len = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LLH", self.buffer_id, self.in_port, self.actions_len)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 12):
-            return binaryString
-        fmt = '!LLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.buffer_id, self.in_port, self.actions_len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[12:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 12
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.in_port !=  other.in_port: return False
-        if self.actions_len !=  other.actions_len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'in_port: ' + str(self.in_port) + '\n'
-        outstr += prefix + 'actions_len: ' + str(self.actions_len) + '\n'
-        return outstr
-
-
-class ofp_instruction_goto_table(object):
-    """Automatically generated Python class for ofp_instruction_goto_table
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.table_id = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.table_id)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.table_id) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        return outstr
-
-
-class ofp_action_nw_addr(object):
-    """Automatically generated Python class for ofp_action_nw_addr
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.nw_addr = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.nw_addr)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.nw_addr) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.nw_addr !=  other.nw_addr: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'nw_addr: ' + str(self.nw_addr) + '\n'
-        return outstr
-
-
-class ofp_action_group(object):
-    """Automatically generated Python class for ofp_action_group
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.group_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.group_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.group_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.group_id !=  other.group_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_group_stats(object):
-    """Automatically generated Python class for ofp_group_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.length = 0
-        self.pad= [0,0]
-        self.group_id = 0
-        self.ref_count = 0
-        self.pad2= [0,0,0,0]
-        self.packet_count = 0
-        self.byte_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 4):
-            return (False, "self.pad2 is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.length)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        packed += struct.pack("!LL", self.group_id, self.ref_count)
-        packed += struct.pack("!BBBB", self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3])
-        packed += struct.pack("!QQ", self.packet_count, self.byte_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 32):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.length,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.group_id, self.ref_count) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[32:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 32
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.length !=  other.length: return False
-        if self.pad !=  other.pad: return False
-        if self.group_id !=  other.group_id: return False
-        if self.ref_count !=  other.ref_count: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        outstr += prefix + 'ref_count: ' + str(self.ref_count) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        return outstr
-
-
-class ofp_action_vlan_pcp(object):
-    """Automatically generated Python class for ofp_action_vlan_pcp
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.vlan_pcp = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.vlan_pcp)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.vlan_pcp) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.vlan_pcp !=  other.vlan_pcp: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'vlan_pcp: ' + str(self.vlan_pcp) + '\n'
-        return outstr
-
-
-class ofp_action_push(object):
-    """Automatically generated Python class for ofp_action_push
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.ethertype = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.ethertype)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.ethertype) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.ethertype !=  other.ethertype: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'ethertype: ' + str(self.ethertype) + '\n'
-        return outstr
-
-
-class ofp_group_desc_stats(object):
-    """Automatically generated Python class for ofp_group_desc_stats
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.length = 0
-        self.type = 0
-        self.pad = 0
-        self.group_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HBBL", self.length, self.type, self.pad, self.group_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HBBL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.length, self.type, self.pad, self.group_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.length !=  other.length: return False
-        if self.type !=  other.type: return False
-        if self.pad !=  other.pad: return False
-        if self.group_id !=  other.group_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_error_msg(object):
-    """Automatically generated Python class for ofp_error_msg
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.code = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.code)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.code) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.code !=  other.code: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'code: ' + str(self.code) + '\n'
-        return outstr
-
-
-class ofp_action_mpls_ttl(object):
-    """Automatically generated Python class for ofp_action_mpls_ttl
-
-    Date 2013-01-06
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.mpls_ttl = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.mpls_ttl)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.mpls_ttl) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.mpls_ttl !=  other.mpls_ttl: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'mpls_ttl: ' + str(self.mpls_ttl) + '\n'
-        return outstr
-
-
-# Enumerated type definitions
-ofp_error_type = ['OFPET_HELLO_FAILED', 'OFPET_BAD_REQUEST', 'OFPET_BAD_ACTION', 'OFPET_FLOW_MOD_FAILED', 'OFPET_GROUP_MOD_FAILED', 'OFPET_PORT_MOD_FAILED', 'OFPET_TABLE_MOD_FAILED', 'OFPET_QUEUE_OP_FAILED', 'OFPET_SWITCH_CONFIG_FAILED']
-OFPET_HELLO_FAILED                  = 0
-OFPET_BAD_REQUEST                   = 1
-OFPET_BAD_ACTION                    = 2
-OFPET_FLOW_MOD_FAILED               = 3
-OFPET_GROUP_MOD_FAILED              = 4
-OFPET_PORT_MOD_FAILED               = 5
-OFPET_TABLE_MOD_FAILED              = 6
-OFPET_QUEUE_OP_FAILED               = 7
-OFPET_SWITCH_CONFIG_FAILED          = 8
-ofp_error_type_map = {
-    0                               : 'OFPET_HELLO_FAILED',
-    1                               : 'OFPET_BAD_REQUEST',
-    2                               : 'OFPET_BAD_ACTION',
-    3                               : 'OFPET_FLOW_MOD_FAILED',
-    4                               : 'OFPET_GROUP_MOD_FAILED',
-    5                               : 'OFPET_PORT_MOD_FAILED',
-    6                               : 'OFPET_TABLE_MOD_FAILED',
-    7                               : 'OFPET_QUEUE_OP_FAILED',
-    8                               : 'OFPET_SWITCH_CONFIG_FAILED'
-}
-
-ofp_flow_mod_flags = ['OFPFF_SEND_FLOW_REM', 'OFPFF_CHECK_OVERLAP']
-OFPFF_SEND_FLOW_REM                 = 1
-OFPFF_CHECK_OVERLAP                 = 2
-ofp_flow_mod_flags_map = {
-    1                               : 'OFPFF_SEND_FLOW_REM',
-    2                               : 'OFPFF_CHECK_OVERLAP'
-}
-
-ofp_stats_reply_flags = ['OFPSF_REPLY_MORE']
-OFPSF_REPLY_MORE                    = 1
-ofp_stats_reply_flags_map = {
-    1                               : 'OFPSF_REPLY_MORE'
-}
-
-ofp_port_no = ['OFPP_MAX', 'OFPP_IN_PORT', 'OFPP_TABLE', 'OFPP_NORMAL', 'OFPP_FLOOD', 'OFPP_ALL', 'OFPP_CONTROLLER', 'OFPP_LOCAL', 'OFPP_ANY']
-OFPP_MAX                            = 4294967040
-OFPP_IN_PORT                        = 4294967288
-OFPP_TABLE                          = 4294967289
-OFPP_NORMAL                         = 4294967290
-OFPP_FLOOD                          = 4294967291
-OFPP_ALL                            = 4294967292
-OFPP_CONTROLLER                     = 4294967293
-OFPP_LOCAL                          = 4294967294
-OFPP_ANY                            = 4294967295
-ofp_port_no_map = {
-    4294967040                      : 'OFPP_MAX',
-    4294967288                      : 'OFPP_IN_PORT',
-    4294967289                      : 'OFPP_TABLE',
-    4294967290                      : 'OFPP_NORMAL',
-    4294967291                      : 'OFPP_FLOOD',
-    4294967292                      : 'OFPP_ALL',
-    4294967293                      : 'OFPP_CONTROLLER',
-    4294967294                      : 'OFPP_LOCAL',
-    4294967295                      : 'OFPP_ANY'
-}
-
-ofp_flow_match_fields = ['OFPFMF_IN_PORT', 'OFPFMF_DL_VLAN', 'OFPFMF_DL_VLAN_PCP', 'OFPFMF_DL_TYPE', 'OFPFMF_NW_TOS', 'OFPFMF_NW_PROTO', 'OFPFMF_TP_SRC', 'OFPFMF_TP_DST', 'OFPFMF_MPLS_LABEL', 'OFPFMF_MPLS_TC', 'OFPFMF_TYPE', 'OFPFMF_DL_SRC', 'OFPFMF_DL_DST', 'OFPFMF_NW_SRC', 'OFPFMF_NW_DST', 'OFPFMF_METADATA']
-OFPFMF_IN_PORT                      = 1
-OFPFMF_DL_VLAN                      = 2
-OFPFMF_DL_VLAN_PCP                  = 4
-OFPFMF_DL_TYPE                      = 8
-OFPFMF_NW_TOS                       = 16
-OFPFMF_NW_PROTO                     = 32
-OFPFMF_TP_SRC                       = 64
-OFPFMF_TP_DST                       = 128
-OFPFMF_MPLS_LABEL                   = 256
-OFPFMF_MPLS_TC                      = 512
-OFPFMF_TYPE                         = 1024
-OFPFMF_DL_SRC                       = 2048
-OFPFMF_DL_DST                       = 4096
-OFPFMF_NW_SRC                       = 8192
-OFPFMF_NW_DST                       = 16384
-OFPFMF_METADATA                     = 32768
-ofp_flow_match_fields_map = {
-    1                               : 'OFPFMF_IN_PORT',
-    2                               : 'OFPFMF_DL_VLAN',
-    4                               : 'OFPFMF_DL_VLAN_PCP',
-    8                               : 'OFPFMF_DL_TYPE',
-    16                              : 'OFPFMF_NW_TOS',
-    32                              : 'OFPFMF_NW_PROTO',
-    64                              : 'OFPFMF_TP_SRC',
-    128                             : 'OFPFMF_TP_DST',
-    256                             : 'OFPFMF_MPLS_LABEL',
-    512                             : 'OFPFMF_MPLS_TC',
-    1024                            : 'OFPFMF_TYPE',
-    2048                            : 'OFPFMF_DL_SRC',
-    4096                            : 'OFPFMF_DL_DST',
-    8192                            : 'OFPFMF_NW_SRC',
-    16384                           : 'OFPFMF_NW_DST',
-    32768                           : 'OFPFMF_METADATA'
-}
-
-ofp_bad_request_code = ['OFPBRC_BAD_VERSION', 'OFPBRC_BAD_TYPE', 'OFPBRC_BAD_STAT', 'OFPBRC_BAD_EXPERIMENTER', 'OFPBRC_BAD_SUBTYPE', 'OFPBRC_EPERM', 'OFPBRC_BAD_LEN', 'OFPBRC_BUFFER_EMPTY', 'OFPBRC_BUFFER_UNKNOWN', 'OFPBRC_BAD_TABLE_ID']
-OFPBRC_BAD_VERSION                  = 0
-OFPBRC_BAD_TYPE                     = 1
-OFPBRC_BAD_STAT                     = 2
-OFPBRC_BAD_EXPERIMENTER             = 3
-OFPBRC_BAD_SUBTYPE                  = 4
-OFPBRC_EPERM                        = 5
-OFPBRC_BAD_LEN                      = 6
-OFPBRC_BUFFER_EMPTY                 = 7
-OFPBRC_BUFFER_UNKNOWN               = 8
-OFPBRC_BAD_TABLE_ID                 = 9
-ofp_bad_request_code_map = {
-    0                               : 'OFPBRC_BAD_VERSION',
-    1                               : 'OFPBRC_BAD_TYPE',
-    2                               : 'OFPBRC_BAD_STAT',
-    3                               : 'OFPBRC_BAD_EXPERIMENTER',
-    4                               : 'OFPBRC_BAD_SUBTYPE',
-    5                               : 'OFPBRC_EPERM',
-    6                               : 'OFPBRC_BAD_LEN',
-    7                               : 'OFPBRC_BUFFER_EMPTY',
-    8                               : 'OFPBRC_BUFFER_UNKNOWN',
-    9                               : 'OFPBRC_BAD_TABLE_ID'
-}
-
-ofp_port_config = ['OFPPC_PORT_DOWN', 'OFPPC_NO_RECV', 'OFPPC_NO_FWD', 'OFPPC_NO_PACKET_IN']
-OFPPC_PORT_DOWN                     = 1
-OFPPC_NO_RECV                       = 4
-OFPPC_NO_FWD                        = 32
-OFPPC_NO_PACKET_IN                  = 64
-ofp_port_config_map = {
-    1                               : 'OFPPC_PORT_DOWN',
-    4                               : 'OFPPC_NO_RECV',
-    32                              : 'OFPPC_NO_FWD',
-    64                              : 'OFPPC_NO_PACKET_IN'
-}
-
-ofp_port_state = ['OFPPS_LINK_DOWN', 'OFPPS_BLOCKED', 'OFPPS_LIVE']
-OFPPS_LINK_DOWN                     = 1
-OFPPS_BLOCKED                       = 2
-OFPPS_LIVE                          = 4
-ofp_port_state_map = {
-    1                               : 'OFPPS_LINK_DOWN',
-    2                               : 'OFPPS_BLOCKED',
-    4                               : 'OFPPS_LIVE'
-}
-
-ofp_config_flags = ['OFPC_FRAG_NORMAL', 'OFPC_FRAG_DROP', 'OFPC_FRAG_REASM', 'OFPC_FRAG_MASK', 'OFPC_INVALID_TTL_TO_CONTROLLER']
-OFPC_FRAG_NORMAL                    = 0
-OFPC_FRAG_DROP                      = 1
-OFPC_FRAG_REASM                     = 2
-OFPC_FRAG_MASK                      = 3
-OFPC_INVALID_TTL_TO_CONTROLLER      = 4
-ofp_config_flags_map = {
-    0                               : 'OFPC_FRAG_NORMAL',
-    1                               : 'OFPC_FRAG_DROP',
-    2                               : 'OFPC_FRAG_REASM',
-    3                               : 'OFPC_FRAG_MASK',
-    4                               : 'OFPC_INVALID_TTL_TO_CONTROLLER'
-}
-
-ofp_switch_config_failed_code = ['OFPSCFC_BAD_FLAGS', 'OFPSCFC_BAD_LEN']
-OFPSCFC_BAD_FLAGS                   = 0
-OFPSCFC_BAD_LEN                     = 1
-ofp_switch_config_failed_code_map = {
-    0                               : 'OFPSCFC_BAD_FLAGS',
-    1                               : 'OFPSCFC_BAD_LEN'
-}
-
-ofp_hello_failed_code = ['OFPHFC_INCOMPATIBLE', 'OFPHFC_EPERM']
-OFPHFC_INCOMPATIBLE                 = 0
-OFPHFC_EPERM                        = 1
-ofp_hello_failed_code_map = {
-    0                               : 'OFPHFC_INCOMPATIBLE',
-    1                               : 'OFPHFC_EPERM'
-}
-
-ofp_capabilities = ['OFPC_FLOW_STATS', 'OFPC_TABLE_STATS', 'OFPC_PORT_STATS', 'OFPC_GROUP_STATS', 'OFPC_IP_REASM', 'OFPC_QUEUE_STATS', 'OFPC_ARP_MATCH_IP']
-OFPC_FLOW_STATS                     = 1
-OFPC_TABLE_STATS                    = 2
-OFPC_PORT_STATS                     = 4
-OFPC_GROUP_STATS                    = 8
-OFPC_IP_REASM                       = 32
-OFPC_QUEUE_STATS                    = 64
-OFPC_ARP_MATCH_IP                   = 128
-ofp_capabilities_map = {
-    1                               : 'OFPC_FLOW_STATS',
-    2                               : 'OFPC_TABLE_STATS',
-    4                               : 'OFPC_PORT_STATS',
-    8                               : 'OFPC_GROUP_STATS',
-    32                              : 'OFPC_IP_REASM',
-    64                              : 'OFPC_QUEUE_STATS',
-    128                             : 'OFPC_ARP_MATCH_IP'
-}
-
-ofp_flow_removed_reason = ['OFPRR_IDLE_TIMEOUT', 'OFPRR_HARD_TIMEOUT', 'OFPRR_DELETE', 'OFPRR_GROUP_DELETE']
-OFPRR_IDLE_TIMEOUT                  = 0
-OFPRR_HARD_TIMEOUT                  = 1
-OFPRR_DELETE                        = 2
-OFPRR_GROUP_DELETE                  = 3
-ofp_flow_removed_reason_map = {
-    0                               : 'OFPRR_IDLE_TIMEOUT',
-    1                               : 'OFPRR_HARD_TIMEOUT',
-    2                               : 'OFPRR_DELETE',
-    3                               : 'OFPRR_GROUP_DELETE'
-}
-
-ofp_table_mod_failed_code = ['OFPTMFC_BAD_TABLE', 'OFPTMFC_BAD_CONFIG']
-OFPTMFC_BAD_TABLE                   = 0
-OFPTMFC_BAD_CONFIG                  = 1
-ofp_table_mod_failed_code_map = {
-    0                               : 'OFPTMFC_BAD_TABLE',
-    1                               : 'OFPTMFC_BAD_CONFIG'
-}
-
-ofp_queue_properties = ['OFPQT_NONE', 'OFPQT_MIN_RATE']
-OFPQT_NONE                          = 0
-OFPQT_MIN_RATE                      = 0
-ofp_queue_properties_map = {
-    0                               : 'OFPQT_NONE',
-    0                               : 'OFPQT_MIN_RATE'
-}
-
-ofp_flow_wildcards = ['OFPFW_IN_PORT', 'OFPFW_DL_VLAN', 'OFPFW_DL_VLAN_PCP', 'OFPFW_DL_TYPE', 'OFPFW_NW_TOS', 'OFPFW_NW_PROTO', 'OFPFW_TP_SRC', 'OFPFW_TP_DST', 'OFPFW_MPLS_LABEL', 'OFPFW_MPLS_TC', 'OFPFW_ALL']
-OFPFW_IN_PORT                       = 1
-OFPFW_DL_VLAN                       = 2
-OFPFW_DL_VLAN_PCP                   = 4
-OFPFW_DL_TYPE                       = 8
-OFPFW_NW_TOS                        = 16
-OFPFW_NW_PROTO                      = 32
-OFPFW_TP_SRC                        = 64
-OFPFW_TP_DST                        = 128
-OFPFW_MPLS_LABEL                    = 256
-OFPFW_MPLS_TC                       = 512
-OFPFW_ALL                           = 1023
-ofp_flow_wildcards_map = {
-    1                               : 'OFPFW_IN_PORT',
-    2                               : 'OFPFW_DL_VLAN',
-    4                               : 'OFPFW_DL_VLAN_PCP',
-    8                               : 'OFPFW_DL_TYPE',
-    16                              : 'OFPFW_NW_TOS',
-    32                              : 'OFPFW_NW_PROTO',
-    64                              : 'OFPFW_TP_SRC',
-    128                             : 'OFPFW_TP_DST',
-    256                             : 'OFPFW_MPLS_LABEL',
-    512                             : 'OFPFW_MPLS_TC',
-    1023                            : 'OFPFW_ALL'
-}
-
-ofp_group = ['OFPG_MAX', 'OFPG_ALL', 'OFPG_ANY']
-OFPG_MAX                            = 4294967040
-OFPG_ALL                            = 4294967292
-OFPG_ANY                            = 4294967295
-ofp_group_map = {
-    4294967040                      : 'OFPG_MAX',
-    4294967292                      : 'OFPG_ALL',
-    4294967295                      : 'OFPG_ANY'
-}
-
-ofp_port_reason = ['OFPPR_ADD', 'OFPPR_DELETE', 'OFPPR_MODIFY']
-OFPPR_ADD                           = 0
-OFPPR_DELETE                        = 1
-OFPPR_MODIFY                        = 2
-ofp_port_reason_map = {
-    0                               : 'OFPPR_ADD',
-    1                               : 'OFPPR_DELETE',
-    2                               : 'OFPPR_MODIFY'
-}
-
-ofp_table_config = ['OFPTC_TABLE_MISS_CONTROLLER', 'OFPTC_TABLE_MISS_CONTINUE', 'OFPTC_TABLE_MISS_DROP', 'OFPTC_TABLE_MISS_MASK']
-OFPTC_TABLE_MISS_CONTROLLER         = 0
-OFPTC_TABLE_MISS_CONTINUE           = 1
-OFPTC_TABLE_MISS_DROP               = 2
-OFPTC_TABLE_MISS_MASK               = 3
-ofp_table_config_map = {
-    0                               : 'OFPTC_TABLE_MISS_CONTROLLER',
-    1                               : 'OFPTC_TABLE_MISS_CONTINUE',
-    2                               : 'OFPTC_TABLE_MISS_DROP',
-    3                               : 'OFPTC_TABLE_MISS_MASK'
-}
-
-ofp_action_type = ['OFPAT_OUTPUT', 'OFPAT_SET_VLAN_VID', 'OFPAT_SET_VLAN_PCP', 'OFPAT_SET_DL_SRC', 'OFPAT_SET_DL_DST', 'OFPAT_SET_NW_SRC', 'OFPAT_SET_NW_DST', 'OFPAT_SET_NW_TOS', 'OFPAT_SET_NW_ECN', 'OFPAT_SET_TP_SRC', 'OFPAT_SET_TP_DST', 'OFPAT_COPY_TTL_OUT', 'OFPAT_COPY_TTL_IN', 'OFPAT_SET_MPLS_LABEL', 'OFPAT_SET_MPLS_TC', 'OFPAT_SET_MPLS_TTL', 'OFPAT_DEC_MPLS_TTL', 'OFPAT_PUSH_VLAN', 'OFPAT_POP_VLAN', 'OFPAT_PUSH_MPLS', 'OFPAT_POP_MPLS', 'OFPAT_SET_QUEUE', 'OFPAT_GROUP', 'OFPAT_SET_NW_TTL', 'OFPAT_DEC_NW_TTL', 'OFPAT_EXPERIMENTER']
-OFPAT_OUTPUT                        = 0
-OFPAT_SET_VLAN_VID                  = 1
-OFPAT_SET_VLAN_PCP                  = 2
-OFPAT_SET_DL_SRC                    = 3
-OFPAT_SET_DL_DST                    = 4
-OFPAT_SET_NW_SRC                    = 5
-OFPAT_SET_NW_DST                    = 6
-OFPAT_SET_NW_TOS                    = 7
-OFPAT_SET_NW_ECN                    = 8
-OFPAT_SET_TP_SRC                    = 9
-OFPAT_SET_TP_DST                    = 10
-OFPAT_COPY_TTL_OUT                  = 11
-OFPAT_COPY_TTL_IN                   = 12
-OFPAT_SET_MPLS_LABEL                = 13
-OFPAT_SET_MPLS_TC                   = 14
-OFPAT_SET_MPLS_TTL                  = 15
-OFPAT_DEC_MPLS_TTL                  = 16
-OFPAT_PUSH_VLAN                     = 17
-OFPAT_POP_VLAN                      = 18
-OFPAT_PUSH_MPLS                     = 19
-OFPAT_POP_MPLS                      = 20
-OFPAT_SET_QUEUE                     = 21
-OFPAT_GROUP                         = 22
-OFPAT_SET_NW_TTL                    = 23
-OFPAT_DEC_NW_TTL                    = 24
-OFPAT_EXPERIMENTER                  = 65535
-ofp_action_type_map = {
-    0                               : 'OFPAT_OUTPUT',
-    1                               : 'OFPAT_SET_VLAN_VID',
-    2                               : 'OFPAT_SET_VLAN_PCP',
-    3                               : 'OFPAT_SET_DL_SRC',
-    4                               : 'OFPAT_SET_DL_DST',
-    5                               : 'OFPAT_SET_NW_SRC',
-    6                               : 'OFPAT_SET_NW_DST',
-    7                               : 'OFPAT_SET_NW_TOS',
-    8                               : 'OFPAT_SET_NW_ECN',
-    9                               : 'OFPAT_SET_TP_SRC',
-    10                              : 'OFPAT_SET_TP_DST',
-    11                              : 'OFPAT_COPY_TTL_OUT',
-    12                              : 'OFPAT_COPY_TTL_IN',
-    13                              : 'OFPAT_SET_MPLS_LABEL',
-    14                              : 'OFPAT_SET_MPLS_TC',
-    15                              : 'OFPAT_SET_MPLS_TTL',
-    16                              : 'OFPAT_DEC_MPLS_TTL',
-    17                              : 'OFPAT_PUSH_VLAN',
-    18                              : 'OFPAT_POP_VLAN',
-    19                              : 'OFPAT_PUSH_MPLS',
-    20                              : 'OFPAT_POP_MPLS',
-    21                              : 'OFPAT_SET_QUEUE',
-    22                              : 'OFPAT_GROUP',
-    23                              : 'OFPAT_SET_NW_TTL',
-    24                              : 'OFPAT_DEC_NW_TTL',
-    65535                           : 'OFPAT_EXPERIMENTER'
-}
-
-ofp_flow_mod_command = ['OFPFC_ADD', 'OFPFC_MODIFY', 'OFPFC_MODIFY_STRICT', 'OFPFC_DELETE', 'OFPFC_DELETE_STRICT']
-OFPFC_ADD                           = 0
-OFPFC_MODIFY                        = 1
-OFPFC_MODIFY_STRICT                 = 2
-OFPFC_DELETE                        = 3
-OFPFC_DELETE_STRICT                 = 4
-ofp_flow_mod_command_map = {
-    0                               : 'OFPFC_ADD',
-    1                               : 'OFPFC_MODIFY',
-    2                               : 'OFPFC_MODIFY_STRICT',
-    3                               : 'OFPFC_DELETE',
-    4                               : 'OFPFC_DELETE_STRICT'
-}
-
-ofp_queue_op_failed_code = ['OFPQOFC_BAD_PORT', 'OFPQOFC_BAD_QUEUE', 'OFPQOFC_EPERM']
-OFPQOFC_BAD_PORT                    = 0
-OFPQOFC_BAD_QUEUE                   = 1
-OFPQOFC_EPERM                       = 2
-ofp_queue_op_failed_code_map = {
-    0                               : 'OFPQOFC_BAD_PORT',
-    1                               : 'OFPQOFC_BAD_QUEUE',
-    2                               : 'OFPQOFC_EPERM'
-}
-
-ofp_match_type = ['OFPMT_STANDARD']
-OFPMT_STANDARD                      = 0
-ofp_match_type_map = {
-    0                               : 'OFPMT_STANDARD'
-}
-
-ofp_vlan_id = ['OFPVID_ANY', 'OFPVID_NONE']
-OFPVID_ANY                          = 65534
-OFPVID_NONE                         = 65535
-ofp_vlan_id_map = {
-    65534                           : 'OFPVID_ANY',
-    65535                           : 'OFPVID_NONE'
-}
-
-ofp_group_mod_failed_code = ['OFPGMFC_GROUP_EXISTS', 'OFPGMFC_INVALID_GROUP', 'OFPGMFC_WEIGHT_UNSUPPORTED', 'OFPGMFC_OUT_OF_GROUPS', 'OFPGMFC_OUT_OF_BUCKETS', 'OFPGMFC_CHAINING_UNSUPPORTED', 'OFPGMFC_WATCH_UNSUPPORTED', 'OFPGMFC_LOOP', 'OFPGMFC_UNKNOWN_GROUP']
-OFPGMFC_GROUP_EXISTS                = 0
-OFPGMFC_INVALID_GROUP               = 1
-OFPGMFC_WEIGHT_UNSUPPORTED          = 2
-OFPGMFC_OUT_OF_GROUPS               = 3
-OFPGMFC_OUT_OF_BUCKETS              = 4
-OFPGMFC_CHAINING_UNSUPPORTED        = 5
-OFPGMFC_WATCH_UNSUPPORTED           = 6
-OFPGMFC_LOOP                        = 7
-OFPGMFC_UNKNOWN_GROUP               = 8
-ofp_group_mod_failed_code_map = {
-    0                               : 'OFPGMFC_GROUP_EXISTS',
-    1                               : 'OFPGMFC_INVALID_GROUP',
-    2                               : 'OFPGMFC_WEIGHT_UNSUPPORTED',
-    3                               : 'OFPGMFC_OUT_OF_GROUPS',
-    4                               : 'OFPGMFC_OUT_OF_BUCKETS',
-    5                               : 'OFPGMFC_CHAINING_UNSUPPORTED',
-    6                               : 'OFPGMFC_WATCH_UNSUPPORTED',
-    7                               : 'OFPGMFC_LOOP',
-    8                               : 'OFPGMFC_UNKNOWN_GROUP'
-}
-
-ofp_group_type = ['OFPGT_ALL', 'OFPGT_SELECT', 'OFPGT_INDIRECT', 'OFPGT_FF']
-OFPGT_ALL                           = 0
-OFPGT_SELECT                        = 1
-OFPGT_INDIRECT                      = 2
-OFPGT_FF                            = 3
-ofp_group_type_map = {
-    0                               : 'OFPGT_ALL',
-    1                               : 'OFPGT_SELECT',
-    2                               : 'OFPGT_INDIRECT',
-    3                               : 'OFPGT_FF'
-}
-
-ofp_instruction_type = ['OFPIT_GOTO_TABLE', 'OFPIT_WRITE_METADATA', 'OFPIT_WRITE_ACTIONS', 'OFPIT_APPLY_ACTIONS', 'OFPIT_CLEAR_ACTIONS', 'OFPIT_EXPERIMENTER']
-OFPIT_GOTO_TABLE                    = 1
-OFPIT_WRITE_METADATA                = 2
-OFPIT_WRITE_ACTIONS                 = 3
-OFPIT_APPLY_ACTIONS                 = 4
-OFPIT_CLEAR_ACTIONS                 = 5
-OFPIT_EXPERIMENTER                  = 65535
-ofp_instruction_type_map = {
-    1                               : 'OFPIT_GOTO_TABLE',
-    2                               : 'OFPIT_WRITE_METADATA',
-    3                               : 'OFPIT_WRITE_ACTIONS',
-    4                               : 'OFPIT_APPLY_ACTIONS',
-    5                               : 'OFPIT_CLEAR_ACTIONS',
-    65535                           : 'OFPIT_EXPERIMENTER'
-}
-
-ofp_bad_action_code = ['OFPBAC_BAD_TYPE', 'OFPBAC_BAD_LEN', 'OFPBAC_BAD_EXPERIMENTER', 'OFPBAC_BAD_EXPERIMENTER_TYPE', 'OFPBAC_BAD_OUT_PORT', 'OFPBAC_BAD_ARGUMENT', 'OFPBAC_EPERM', 'OFPBAC_TOO_MANY', 'OFPBAC_BAD_QUEUE', 'OFPBAC_BAD_OUT_GROUP', 'OFPBAC_MATCH_INCONSISTENT', 'OFPBAC_UNSUPPORTED_ORDER']
-OFPBAC_BAD_TYPE                     = 0
-OFPBAC_BAD_LEN                      = 1
-OFPBAC_BAD_EXPERIMENTER             = 2
-OFPBAC_BAD_EXPERIMENTER_TYPE        = 3
-OFPBAC_BAD_OUT_PORT                 = 4
-OFPBAC_BAD_ARGUMENT                 = 5
-OFPBAC_EPERM                        = 6
-OFPBAC_TOO_MANY                     = 7
-OFPBAC_BAD_QUEUE                    = 8
-OFPBAC_BAD_OUT_GROUP                = 9
-OFPBAC_MATCH_INCONSISTENT           = 10
-OFPBAC_UNSUPPORTED_ORDER            = 11
-ofp_bad_action_code_map = {
-    0                               : 'OFPBAC_BAD_TYPE',
-    1                               : 'OFPBAC_BAD_LEN',
-    2                               : 'OFPBAC_BAD_EXPERIMENTER',
-    3                               : 'OFPBAC_BAD_EXPERIMENTER_TYPE',
-    4                               : 'OFPBAC_BAD_OUT_PORT',
-    5                               : 'OFPBAC_BAD_ARGUMENT',
-    6                               : 'OFPBAC_EPERM',
-    7                               : 'OFPBAC_TOO_MANY',
-    8                               : 'OFPBAC_BAD_QUEUE',
-    9                               : 'OFPBAC_BAD_OUT_GROUP',
-    10                              : 'OFPBAC_MATCH_INCONSISTENT',
-    11                              : 'OFPBAC_UNSUPPORTED_ORDER'
-}
-
-ofp_flow_mod_failed_code = ['OFPFMFC_UNKNOWN', 'OFPFMFC_TABLE_FULL', 'OFPFMFC_BAD_TABLE_ID', 'OFPFMFC_OVERLAP', 'OFPFMFC_EPERM', 'OFPFMFC_BAD_TIMEOUT', 'OFPFMFC_BAD_COMMAND', 'OFPFMFC_BAD_INSTRUCTION', 'OFPFMFC_BAD_MATCH', 'OFPFMFC_BAD_MATCH_TYPE', 'OFPFMFC_BAD_TAG', 'OFPFMFC_BAD_DL_ADDR_MASK', 'OFPFMFC_BAD_NW_ADDR_MASK']
-OFPFMFC_UNKNOWN                     = 0
-OFPFMFC_TABLE_FULL                  = 1
-OFPFMFC_BAD_TABLE_ID                = 2
-OFPFMFC_OVERLAP                     = 3
-OFPFMFC_EPERM                       = 4
-OFPFMFC_BAD_TIMEOUT                 = 5
-OFPFMFC_BAD_COMMAND                 = 6
-OFPFMFC_BAD_INSTRUCTION             = 7
-OFPFMFC_BAD_MATCH                   = 8
-OFPFMFC_BAD_MATCH_TYPE              = 9
-OFPFMFC_BAD_TAG                     = 10
-OFPFMFC_BAD_DL_ADDR_MASK            = 11
-OFPFMFC_BAD_NW_ADDR_MASK            = 12
-ofp_flow_mod_failed_code_map = {
-    0                               : 'OFPFMFC_UNKNOWN',
-    1                               : 'OFPFMFC_TABLE_FULL',
-    2                               : 'OFPFMFC_BAD_TABLE_ID',
-    3                               : 'OFPFMFC_OVERLAP',
-    4                               : 'OFPFMFC_EPERM',
-    5                               : 'OFPFMFC_BAD_TIMEOUT',
-    6                               : 'OFPFMFC_BAD_COMMAND',
-    7                               : 'OFPFMFC_BAD_INSTRUCTION',
-    8                               : 'OFPFMFC_BAD_MATCH',
-    9                               : 'OFPFMFC_BAD_MATCH_TYPE',
-    10                              : 'OFPFMFC_BAD_TAG',
-    11                              : 'OFPFMFC_BAD_DL_ADDR_MASK',
-    12                              : 'OFPFMFC_BAD_NW_ADDR_MASK'
-}
-
-ofp_port_mod_failed_code = ['OFPPMFC_BAD_PORT', 'OFPPMFC_BAD_HW_ADDR', 'OFPPMFC_BAD_CONFIG', 'OFPPMFC_BAD_ADVERTISE']
-OFPPMFC_BAD_PORT                    = 0
-OFPPMFC_BAD_HW_ADDR                 = 1
-OFPPMFC_BAD_CONFIG                  = 2
-OFPPMFC_BAD_ADVERTISE               = 3
-ofp_port_mod_failed_code_map = {
-    0                               : 'OFPPMFC_BAD_PORT',
-    1                               : 'OFPPMFC_BAD_HW_ADDR',
-    2                               : 'OFPPMFC_BAD_CONFIG',
-    3                               : 'OFPPMFC_BAD_ADVERTISE'
-}
-
-ofp_type = ['OFPT_HELLO', 'OFPT_ERROR', 'OFPT_ECHO_REQUEST', 'OFPT_ECHO_REPLY', 'OFPT_EXPERIMENTER', 'OFPT_FEATURES_REQUEST', 'OFPT_FEATURES_REPLY', 'OFPT_GET_CONFIG_REQUEST', 'OFPT_GET_CONFIG_REPLY', 'OFPT_SET_CONFIG', 'OFPT_PACKET_IN', 'OFPT_FLOW_REMOVED', 'OFPT_PORT_STATUS', 'OFPT_PACKET_OUT', 'OFPT_FLOW_MOD', 'OFPT_GROUP_MOD', 'OFPT_PORT_MOD', 'OFPT_TABLE_MOD', 'OFPT_STATS_REQUEST', 'OFPT_STATS_REPLY', 'OFPT_BARRIER_REQUEST', 'OFPT_BARRIER_REPLY', 'OFPT_QUEUE_GET_CONFIG_REQUEST', 'OFPT_QUEUE_GET_CONFIG_REPLY']
-OFPT_HELLO                          = 0
-OFPT_ERROR                          = 1
-OFPT_ECHO_REQUEST                   = 2
-OFPT_ECHO_REPLY                     = 3
-OFPT_EXPERIMENTER                   = 4
-OFPT_FEATURES_REQUEST               = 5
-OFPT_FEATURES_REPLY                 = 6
-OFPT_GET_CONFIG_REQUEST             = 7
-OFPT_GET_CONFIG_REPLY               = 8
-OFPT_SET_CONFIG                     = 9
-OFPT_PACKET_IN                      = 10
-OFPT_FLOW_REMOVED                   = 11
-OFPT_PORT_STATUS                    = 12
-OFPT_PACKET_OUT                     = 13
-OFPT_FLOW_MOD                       = 14
-OFPT_GROUP_MOD                      = 15
-OFPT_PORT_MOD                       = 16
-OFPT_TABLE_MOD                      = 17
-OFPT_STATS_REQUEST                  = 18
-OFPT_STATS_REPLY                    = 19
-OFPT_BARRIER_REQUEST                = 20
-OFPT_BARRIER_REPLY                  = 21
-OFPT_QUEUE_GET_CONFIG_REQUEST       = 22
-OFPT_QUEUE_GET_CONFIG_REPLY         = 23
-ofp_type_map = {
-    0                               : 'OFPT_HELLO',
-    1                               : 'OFPT_ERROR',
-    2                               : 'OFPT_ECHO_REQUEST',
-    3                               : 'OFPT_ECHO_REPLY',
-    4                               : 'OFPT_EXPERIMENTER',
-    5                               : 'OFPT_FEATURES_REQUEST',
-    6                               : 'OFPT_FEATURES_REPLY',
-    7                               : 'OFPT_GET_CONFIG_REQUEST',
-    8                               : 'OFPT_GET_CONFIG_REPLY',
-    9                               : 'OFPT_SET_CONFIG',
-    10                              : 'OFPT_PACKET_IN',
-    11                              : 'OFPT_FLOW_REMOVED',
-    12                              : 'OFPT_PORT_STATUS',
-    13                              : 'OFPT_PACKET_OUT',
-    14                              : 'OFPT_FLOW_MOD',
-    15                              : 'OFPT_GROUP_MOD',
-    16                              : 'OFPT_PORT_MOD',
-    17                              : 'OFPT_TABLE_MOD',
-    18                              : 'OFPT_STATS_REQUEST',
-    19                              : 'OFPT_STATS_REPLY',
-    20                              : 'OFPT_BARRIER_REQUEST',
-    21                              : 'OFPT_BARRIER_REPLY',
-    22                              : 'OFPT_QUEUE_GET_CONFIG_REQUEST',
-    23                              : 'OFPT_QUEUE_GET_CONFIG_REPLY'
-}
-
-ofp_packet_in_reason = ['OFPR_NO_MATCH', 'OFPR_ACTION']
-OFPR_NO_MATCH                       = 0
-OFPR_ACTION                         = 1
-ofp_packet_in_reason_map = {
-    0                               : 'OFPR_NO_MATCH',
-    1                               : 'OFPR_ACTION'
-}
-
-ofp_stats_types = ['OFPST_DESC', 'OFPST_FLOW', 'OFPST_AGGREGATE', 'OFPST_TABLE', 'OFPST_PORT', 'OFPST_QUEUE', 'OFPST_GROUP', 'OFPST_GROUP_DESC', 'OFPST_EXPERIMENTER']
-OFPST_DESC                          = 0
-OFPST_FLOW                          = 1
-OFPST_AGGREGATE                     = 2
-OFPST_TABLE                         = 3
-OFPST_PORT                          = 4
-OFPST_QUEUE                         = 5
-OFPST_GROUP                         = 6
-OFPST_GROUP_DESC                    = 7
-OFPST_EXPERIMENTER                  = 65535
-ofp_stats_types_map = {
-    0                               : 'OFPST_DESC',
-    1                               : 'OFPST_FLOW',
-    2                               : 'OFPST_AGGREGATE',
-    3                               : 'OFPST_TABLE',
-    4                               : 'OFPST_PORT',
-    5                               : 'OFPST_QUEUE',
-    6                               : 'OFPST_GROUP',
-    7                               : 'OFPST_GROUP_DESC',
-    65535                           : 'OFPST_EXPERIMENTER'
-}
-
-ofp_group_mod_command = ['OFPGC_ADD', 'OFPGC_MODIFY', 'OFPGC_DELETE']
-OFPGC_ADD                           = 0
-OFPGC_MODIFY                        = 1
-OFPGC_DELETE                        = 2
-ofp_group_mod_command_map = {
-    0                               : 'OFPGC_ADD',
-    1                               : 'OFPGC_MODIFY',
-    2                               : 'OFPGC_DELETE'
-}
-
-ofp_port_features = ['OFPPF_10MB_HD', 'OFPPF_10MB_FD', 'OFPPF_100MB_HD', 'OFPPF_100MB_FD', 'OFPPF_1GB_HD', 'OFPPF_1GB_FD', 'OFPPF_10GB_FD', 'OFPPF_40GB_FD', 'OFPPF_100GB_FD', 'OFPPF_1TB_FD', 'OFPPF_LUDICROUS', 'OFPPF_COPPER', 'OFPPF_FIBER', 'OFPPF_AUTONEG', 'OFPPF_PAUSE', 'OFPPF_PAUSE_ASYM']
-OFPPF_10MB_HD                       = 1
-OFPPF_10MB_FD                       = 2
-OFPPF_100MB_HD                      = 4
-OFPPF_100MB_FD                      = 8
-OFPPF_1GB_HD                        = 16
-OFPPF_1GB_FD                        = 32
-OFPPF_10GB_FD                       = 64
-OFPPF_40GB_FD                       = 128
-OFPPF_100GB_FD                      = 256
-OFPPF_1TB_FD                        = 512
-OFPPF_LUDICROUS                     = 1024
-OFPPF_COPPER                        = 2048
-OFPPF_FIBER                         = 4096
-OFPPF_AUTONEG                       = 8192
-OFPPF_PAUSE                         = 16384
-OFPPF_PAUSE_ASYM                    = 32768
-ofp_port_features_map = {
-    1                               : 'OFPPF_10MB_HD',
-    2                               : 'OFPPF_10MB_FD',
-    4                               : 'OFPPF_100MB_HD',
-    8                               : 'OFPPF_100MB_FD',
-    16                              : 'OFPPF_1GB_HD',
-    32                              : 'OFPPF_1GB_FD',
-    64                              : 'OFPPF_10GB_FD',
-    128                             : 'OFPPF_40GB_FD',
-    256                             : 'OFPPF_100GB_FD',
-    512                             : 'OFPPF_1TB_FD',
-    1024                            : 'OFPPF_LUDICROUS',
-    2048                            : 'OFPPF_COPPER',
-    4096                            : 'OFPPF_FIBER',
-    8192                            : 'OFPPF_AUTONEG',
-    16384                           : 'OFPPF_PAUSE',
-    32768                           : 'OFPPF_PAUSE_ASYM'
-}
-
-ofp_mpls_label = ['OFPML_ANY', 'OFPML_NONE']
-OFPML_ANY                           = 16777214
-OFPML_NONE                          = 16777215
-ofp_mpls_label_map = {
-    16777214                        : 'OFPML_ANY',
-    16777215                        : 'OFPML_NONE'
-}
-
-# Values from macro definitions
-OFP_FLOW_PERMANENT = 0
-OFP_DL_TYPE_ETH2_CUTOFF = 0x0600
-DESC_STR_LEN = 256
-OFPFW_ICMP_CODE = OFPFW_TP_DST
-OFPQ_MIN_RATE_UNCFG = 0xffff
-OFP_VERSION = 0x02
-OFP_MAX_TABLE_NAME_LEN = 32
-OFP_DL_TYPE_NOT_ETH_TYPE = 0x05ff
-OFP_DEFAULT_MISS_SEND_LEN = 128
-OFP_MAX_PORT_NAME_LEN = 16
-OFP_SSL_PORT = 6633
-OFPMT_STANDARD_LENGTH = 88
-OFPFW_ICMP_TYPE = OFPFW_TP_SRC
-OFP_TCP_PORT = 6633
-SERIAL_NUM_LEN = 32
-OFP_DEFAULT_PRIORITY = 0x8000
-OFP_ETH_ALEN = 6
-OFP_VLAN_NONE = OFPVID_NONE
-OFPQ_ALL = 0xffffffff
-
-# Basic structure size definitions.
-# Does not include ofp_header members.
-# Does not include variable length arrays.
-OFP_ACTION_DL_ADDR_BYTES = 16
-OFP_ACTION_EXPERIMENTER_HEADER_BYTES = 8
-OFP_ACTION_GROUP_BYTES = 8
-OFP_ACTION_HEADER_BYTES = 8
-OFP_ACTION_MPLS_LABEL_BYTES = 8
-OFP_ACTION_MPLS_TC_BYTES = 8
-OFP_ACTION_MPLS_TTL_BYTES = 8
-OFP_ACTION_NW_ADDR_BYTES = 8
-OFP_ACTION_NW_ECN_BYTES = 8
-OFP_ACTION_NW_TOS_BYTES = 8
-OFP_ACTION_NW_TTL_BYTES = 8
-OFP_ACTION_OUTPUT_BYTES = 16
-OFP_ACTION_POP_MPLS_BYTES = 8
-OFP_ACTION_PUSH_BYTES = 8
-OFP_ACTION_SET_QUEUE_BYTES = 8
-OFP_ACTION_TP_PORT_BYTES = 8
-OFP_ACTION_VLAN_PCP_BYTES = 8
-OFP_ACTION_VLAN_VID_BYTES = 8
-OFP_AGGREGATE_STATS_REPLY_BYTES = 24
-OFP_AGGREGATE_STATS_REQUEST_BYTES = 120
-OFP_BUCKET_BYTES = 16
-OFP_BUCKET_COUNTER_BYTES = 16
-OFP_DESC_STATS_BYTES = 1056
-OFP_ERROR_MSG_BYTES = 4
-OFP_EXPERIMENTER_HEADER_BYTES = 4
-OFP_FLOW_MOD_BYTES = 128
-OFP_FLOW_REMOVED_BYTES = 128
-OFP_FLOW_STATS_BYTES = 136
-OFP_FLOW_STATS_REQUEST_BYTES = 120
-OFP_GROUP_DESC_STATS_BYTES = 8
-OFP_GROUP_MOD_BYTES = 8
-OFP_GROUP_STATS_BYTES = 32
-OFP_GROUP_STATS_REQUEST_BYTES = 8
-OFP_HEADER_BYTES = 8
-OFP_HELLO_BYTES = 0
-OFP_INSTRUCTION_BYTES = 8
-OFP_INSTRUCTION_ACTIONS_BYTES = 8
-OFP_INSTRUCTION_EXPERIMENTER_BYTES = 8
-OFP_INSTRUCTION_GOTO_TABLE_BYTES = 8
-OFP_INSTRUCTION_WRITE_METADATA_BYTES = 24
-OFP_MATCH_BYTES = 88
-OFP_PACKET_IN_BYTES = 16
-OFP_PACKET_OUT_BYTES = 12
-OFP_PACKET_QUEUE_BYTES = 8
-OFP_PORT_BYTES = 64
-OFP_PORT_MOD_BYTES = 32
-OFP_PORT_STATS_BYTES = 104
-OFP_PORT_STATS_REQUEST_BYTES = 8
-OFP_PORT_STATUS_BYTES = 72
-OFP_QUEUE_GET_CONFIG_REPLY_BYTES = 8
-OFP_QUEUE_GET_CONFIG_REQUEST_BYTES = 4
-OFP_QUEUE_PROP_HEADER_BYTES = 8
-OFP_QUEUE_PROP_MIN_RATE_BYTES = 16
-OFP_QUEUE_STATS_BYTES = 32
-OFP_QUEUE_STATS_REQUEST_BYTES = 8
-OFP_STATS_REPLY_BYTES = 4
-OFP_STATS_REQUEST_BYTES = 4
-OFP_SWITCH_CONFIG_BYTES = 4
-OFP_SWITCH_FEATURES_BYTES = 24
-OFP_TABLE_MOD_BYTES = 8
-OFP_TABLE_STATS_BYTES = 88
-
diff --git a/src/python/of11/error.py b/src/python/of11/error.py
deleted file mode 100644
index 3ea74f4..0000000
--- a/src/python/of11/error.py
+++ /dev/null
@@ -1,456 +0,0 @@
-
-# Python OpenFlow error wrapper classes
-
-from cstruct import *
-
-
-
-class hello_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for hello_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_HELLO_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "hello_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_request_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_request error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_REQUEST
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_request_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_action_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_action error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_ACTION
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_action_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for flow_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_FLOW_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for group_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_GROUP_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for port_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_PORT_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for table_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_TABLE_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_op_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for queue_op_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_QUEUE_OP_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_op_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class switch_config_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for switch_config_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_SWITCH_CONFIG_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "switch_config_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
diff --git a/src/python/of11/instruction.py b/src/python/of11/instruction.py
deleted file mode 100644
index ce323c2..0000000
--- a/src/python/of11/instruction.py
+++ /dev/null
@@ -1,164 +0,0 @@
-
-# Python OpenFlow instruction wrapper classes
-
-from cstruct import *
-from action_list import action_list
-
-
-
-class instruction_goto_table(ofp_instruction_goto_table):
-    """
-    Wrapper class for goto_table instruction object
-
-    Data members inherited from ofp_instruction_goto_table:
-    @arg type
-    @arg len
-    @arg table_id
-
-    """
-    def __init__(self):
-        ofp_instruction_goto_table.__init__(self)
-        self.type = OFPIT_GOTO_TABLE
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_goto_table\n"
-        outstr += ofp_instruction_goto_table.show(self, prefix)
-        return outstr
-
-
-class instruction_write_actions(ofp_instruction_actions):
-    """
-    Wrapper class for write_actions instruction object
-
-    Data members inherited from ofp_instruction_actions:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_instruction_actions.__init__(self)
-        self.type = OFPIT_WRITE_ACTIONS
-        self.actions = action_list()
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_write_actions\n"
-        outstr += ofp_instruction_actions.show(self, prefix)
-        outstr += self.actions.show(prefix)
-        return outstr
-    def unpack(self, binary_string):
-        binary_string = ofp_instruction_actions.unpack(self, binary_string)
-        bytes = self.len - OFP_INSTRUCTION_ACTIONS_BYTES
-        self.actions = action_list()
-        binary_string = self.actions.unpack(binary_string, bytes=bytes)
-        return binary_string
-    def pack(self):
-        self.len = self.__len__()
-        packed = ""
-        packed += ofp_instruction_actions.pack(self)
-        packed += self.actions.pack()
-        return packed
-    def __len__(self):
-        return ofp_instruction_actions.__len__(self) + self.actions.__len__()
-
-
-class instruction_apply_actions(ofp_instruction_actions):
-    """
-    Wrapper class for apply_actions instruction object
-
-    Data members inherited from ofp_instruction_actions:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_instruction_actions.__init__(self)
-        self.type = OFPIT_APPLY_ACTIONS
-        self.actions = action_list()
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_apply_actions\n"
-        outstr += ofp_instruction_actions.show(self, prefix)
-        outstr += self.actions.show(prefix)
-        return outstr
-    def unpack(self, binary_string):
-        binary_string = ofp_instruction_actions.unpack(self, binary_string)
-        bytes = self.len - OFP_INSTRUCTION_ACTIONS_BYTES
-        self.actions = action_list()
-        binary_string = self.actions.unpack(binary_string, bytes=bytes)
-        return binary_string
-    def pack(self):
-        self.len = self.__len__()
-        packed = ""
-        packed += ofp_instruction_actions.pack(self)
-        packed += self.actions.pack()
-        return packed
-    def __len__(self):
-        return ofp_instruction_actions.__len__(self) + self.actions.__len__()
-
-
-class instruction_experimenter(ofp_instruction_experimenter):
-    """
-    Wrapper class for experimenter instruction object
-
-    Data members inherited from ofp_instruction_experimenter:
-    @arg type
-    @arg len
-    @arg experimenter
-
-    """
-    def __init__(self):
-        ofp_instruction_experimenter.__init__(self)
-        self.type = OFPIT_EXPERIMENTER
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_experimenter\n"
-        outstr += ofp_instruction_experimenter.show(self, prefix)
-        return outstr
-
-
-class instruction_write_metadata(ofp_instruction_write_metadata):
-    """
-    Wrapper class for write_metadata instruction object
-
-    Data members inherited from ofp_instruction_write_metadata:
-    @arg type
-    @arg len
-    @arg metadata
-    @arg metadata_mask
-
-    """
-    def __init__(self):
-        ofp_instruction_write_metadata.__init__(self)
-        self.type = OFPIT_WRITE_METADATA
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_write_metadata\n"
-        outstr += ofp_instruction_write_metadata.show(self, prefix)
-        return outstr
-
-
-class instruction_clear_actions(ofp_instruction):
-    """
-    Wrapper class for clear_actions instruction object
-
-    Data members inherited from ofp_instruction:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_instruction.__init__(self)
-        self.type = OFPIT_CLEAR_ACTIONS
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_clear_actions\n"
-        outstr += ofp_instruction.show(self, prefix)
-        return outstr
-
-instruction_class_list = (
-    instruction_apply_actions,
-    instruction_clear_actions,
-    instruction_experimenter,
-    instruction_goto_table,
-    instruction_write_actions,
-    instruction_write_metadata)
diff --git a/src/python/of11/instruction_list.py b/src/python/of11/instruction_list.py
deleted file mode 100644
index bce8cc7..0000000
--- a/src/python/of11/instruction_list.py
+++ /dev/null
@@ -1,97 +0,0 @@
-"""
-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()))
-        
diff --git a/src/python/of11/message.py b/src/python/of11/message.py
deleted file mode 100644
index a26da63..0000000
--- a/src/python/of11/message.py
+++ /dev/null
@@ -1,3692 +0,0 @@
-
-# Python OpenFlow message wrapper classes
-
-from cstruct import *
-from action_list import action_list
-from instruction_list import instruction_list
-from bucket_list import bucket_list
-from error import *
-
-# Define templates for documentation
-class ofp_template_msg(object):
-    """
-    Sample base class for template_msg; normally auto generated
-    This class should live in the of_header name space and provides the
-    base class for this type of message.  It will be wrapped for the
-    high level API.
-
-    """
-    def __init__(self):
-        """
-        Constructor for base class
-
-        """
-        self.header = ofp_header()
-        # Additional base data members declared here
-
-    # Normally will define pack, unpack, __len__ functions
-
-class template_msg(ofp_template_msg):
-    """
-    Sample class wrapper for template_msg
-    This class should live in the of_message name space and provides the
-    high level API for an OpenFlow message object.  These objects must
-    implement the functions indicated in this template.
-
-    """
-    def __init__(self):
-        """
-        Constructor
-        Must set the header type value appropriately for the message
-
-        """
-
-        ##@var header
-        # OpenFlow message header: length, version, xid, type
-        ofp_template_msg.__init__(self)
-        self.header = ofp_header()
-        # For a real message, will be set to an integer
-        self.header.type = "TEMPLATE_MSG_VALUE"
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        pass
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-
-        @return Typically returns the remainder of binary_string that
-        was not parsed.  May give a warning if that string is non-empty
-
-        """
-        pass
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        pass
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-        pass
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        pass
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        pass
-
-
-################################################################
-#
-# OpenFlow Message Definitions
-#
-################################################################
-
-class barrier_reply(object):
-    """
-    Wrapper class for barrier_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_BARRIER_REPLY=21)
-
-
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = OFPT_BARRIER_REPLY
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'barrier_reply (OFPT_BARRIER_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class barrier_request(object):
-    """
-    Wrapper class for barrier_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_BARRIER_REQUEST=20)
-
-
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = OFPT_BARRIER_REQUEST
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'barrier_request (OFPT_BARRIER_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class echo_reply(object):
-    """
-    Wrapper class for echo_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ECHO_REPLY=3)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = OFPT_ECHO_REPLY
-        self.data = ""
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'echo_reply (OFPT_ECHO_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class echo_request(object):
-    """
-    Wrapper class for echo_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ECHO_REQUEST=2)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = OFPT_ECHO_REQUEST
-        self.data = ""
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'echo_request (OFPT_ECHO_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class error(ofp_error_msg):
-    """
-    Wrapper class for error
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ERROR=1)
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.data = ""
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_error_msg.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'error (OFPT_ERROR)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_error_msg.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class experimenter(ofp_experimenter_header):
-    """
-    Wrapper class for experimenter
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_EXPERIMENTER=4)
-
-    Data members inherited from ofp_experimenter_header:
-    @arg experimenter
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self):
-        ofp_experimenter_header.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_EXPERIMENTER
-        self.data = ""
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_experimenter_header.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_experimenter_header.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_experimenter_header.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'experimenter (OFPT_EXPERIMENTER)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_experimenter_header.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_experimenter_header.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class features_reply(ofp_switch_features):
-    """
-    Wrapper class for features_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FEATURES_REPLY=6)
-
-    Data members inherited from ofp_switch_features:
-    @arg datapath_id
-    @arg n_buffers
-    @arg n_tables
-    @arg capabilities
-    @arg reserved
-    @arg ports: Variable length array of TBD
-
-    """
-
-    def __init__(self):
-        ofp_switch_features.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FEATURES_REPLY
-        self.ports = []
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_features.pack(self)
-        for obj in self.ports:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_features.unpack(self, binary_string)
-        while len(binary_string) >= OFP_PORT_BYTES:
-            new_port = ofp_port()
-            binary_string = new_port.unpack(binary_string)
-            self.ports.append(new_port)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_features.__len__(self)
-        for obj in self.ports:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'features_reply (OFPT_FEATURES_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_features.show(self, prefix)
-        outstr += prefix + "Array ports\n"
-        for obj in self.ports:
-            outstr += obj.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_features.__eq__(self, other): return False
-        if self.ports != other.ports: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class features_request(object):
-    """
-    Wrapper class for features_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FEATURES_REQUEST=5)
-
-
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = OFPT_FEATURES_REQUEST
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'features_request (OFPT_FEATURES_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class flow_mod(ofp_flow_mod):
-    """
-    Wrapper class for flow_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FLOW_MOD=14)
-
-    Data members inherited from ofp_flow_mod:
-    @arg cookie
-    @arg cookie_mask
-    @arg table_id
-    @arg command
-    @arg idle_timeout
-    @arg hard_timeout
-    @arg priority
-    @arg buffer_id
-    @arg out_port
-    @arg out_group
-    @arg flags
-    @arg match
-    @arg instructions: Object of type instruction_list
-
-    """
-
-    def __init__(self):
-        ofp_flow_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FLOW_MOD
-        self.instructions = instruction_list()
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_flow_mod.pack(self)
-        packed += self.instructions.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_flow_mod.unpack(self, binary_string)
-        ai_len = self.header.length - (OFP_FLOW_MOD_BYTES + OFP_HEADER_BYTES)
-        binary_string = self.instructions.unpack(binary_string, bytes=ai_len)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_flow_mod.__len__(self)
-        length += len(self.instructions)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'flow_mod (OFPT_FLOW_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_flow_mod.show(self, prefix)
-        outstr += prefix + "List instructions\n"
-        outstr += self.instructions.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_flow_mod.__eq__(self, other): return False
-        if self.instructions != other.instructions: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class flow_removed(ofp_flow_removed):
-    """
-    Wrapper class for flow_removed
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FLOW_REMOVED=11)
-
-    Data members inherited from ofp_flow_removed:
-    @arg cookie
-    @arg priority
-    @arg reason
-    @arg table_id
-    @arg duration_sec
-    @arg duration_nsec
-    @arg idle_timeout
-    @arg packet_count
-    @arg byte_count
-    @arg match
-
-    """
-
-    def __init__(self):
-        ofp_flow_removed.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FLOW_REMOVED
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_flow_removed.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_flow_removed.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_flow_removed.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'flow_removed (OFPT_FLOW_REMOVED)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_flow_removed.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_flow_removed.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class get_config_reply(ofp_switch_config):
-    """
-    Wrapper class for get_config_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GET_CONFIG_REPLY=8)
-
-    Data members inherited from ofp_switch_config:
-    @arg flags
-    @arg miss_send_len
-
-    """
-
-    def __init__(self):
-        ofp_switch_config.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_GET_CONFIG_REPLY
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_config.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_config.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_config.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'get_config_reply (OFPT_GET_CONFIG_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_config.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_config.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class get_config_request(object):
-    """
-    Wrapper class for get_config_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GET_CONFIG_REQUEST=7)
-
-
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = OFPT_GET_CONFIG_REQUEST
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'get_config_request (OFPT_GET_CONFIG_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class group_mod(ofp_group_mod):
-    """
-    Wrapper class for group_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GROUP_MOD=15)
-
-    Data members inherited from ofp_group_mod:
-    @arg command
-    @arg type
-    @arg group_id
-    @arg buckets: Object of type bucket_list
-
-    """
-
-    def __init__(self):
-        ofp_group_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_GROUP_MOD
-        self.buckets = bucket_list()
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_group_mod.pack(self)
-        packed += self.buckets.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_group_mod.unpack(self, binary_string)
-        binary_string = self.buckets.unpack(binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_group_mod.__len__(self)
-        length += len(self.buckets)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'group_mod (OFPT_GROUP_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_group_mod.show(self, prefix)
-        outstr += prefix + "List buckets\n"
-        outstr += self.buckets.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_group_mod.__eq__(self, other): return False
-        if self.buckets != other.buckets: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class hello(object):
-    """
-    Wrapper class for hello
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_HELLO=0)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = OFPT_HELLO
-        self.data = ""
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'hello (OFPT_HELLO)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class packet_in(ofp_packet_in):
-    """
-    Wrapper class for packet_in
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PACKET_IN=10)
-
-    Data members inherited from ofp_packet_in:
-    @arg buffer_id
-    @arg in_port
-    @arg in_phy_port
-    @arg total_len
-    @arg reason
-    @arg table_id
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self):
-        ofp_packet_in.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PACKET_IN
-        self.data = ""
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_packet_in.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_packet_in.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_packet_in.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'packet_in (OFPT_PACKET_IN)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_packet_in.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_packet_in.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class packet_out(ofp_packet_out):
-    """
-    Wrapper class for packet_out
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PACKET_OUT=13)
-
-    Data members inherited from ofp_packet_out:
-    @arg buffer_id
-    @arg in_port
-    @arg actions_len
-    @arg actions: Object of type action_list
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self):
-        ofp_packet_out.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PACKET_OUT
-        self.actions = action_list()
-        self.data = ""
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        self.actions_len = len(self.actions)
-        packed += ofp_packet_out.pack(self)
-        packed += self.actions.pack()
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_packet_out.unpack(self, binary_string)
-        binary_string = self.actions.unpack(binary_string, bytes=self.actions_len)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_packet_out.__len__(self)
-        length += len(self.actions)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'packet_out (OFPT_PACKET_OUT)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_packet_out.show(self, prefix)
-        outstr += prefix + "List actions\n"
-        outstr += self.actions.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_packet_out.__eq__(self, other): return False
-        if self.data != other.data: return False
-        if self.actions != other.actions: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class port_mod(ofp_port_mod):
-    """
-    Wrapper class for port_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PORT_MOD=16)
-
-    Data members inherited from ofp_port_mod:
-    @arg port_no
-    @arg hw_addr
-    @arg config
-    @arg mask
-    @arg advertise
-
-    """
-
-    def __init__(self):
-        ofp_port_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PORT_MOD
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_port_mod.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_port_mod.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_port_mod.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'port_mod (OFPT_PORT_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_port_mod.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_port_mod.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class port_status(ofp_port_status):
-    """
-    Wrapper class for port_status
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PORT_STATUS=12)
-
-    Data members inherited from ofp_port_status:
-    @arg reason
-    @arg desc
-
-    """
-
-    def __init__(self):
-        ofp_port_status.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PORT_STATUS
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_port_status.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_port_status.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_port_status.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'port_status (OFPT_PORT_STATUS)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_port_status.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_port_status.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class queue_get_config_reply(ofp_queue_get_config_reply):
-    """
-    Wrapper class for queue_get_config_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_QUEUE_GET_CONFIG_REPLY=23)
-
-    Data members inherited from ofp_queue_get_config_reply:
-    @arg port
-    @arg queues: Variable length array of TBD
-
-    """
-
-    def __init__(self):
-        ofp_queue_get_config_reply.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_QUEUE_GET_CONFIG_REPLY
-        self.queues = []
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_queue_get_config_reply.pack(self)
-        for obj in self.queues:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_queue_get_config_reply.unpack(self, binary_string)
-        for obj in self.queues:
-            binary_string = obj.unpack(binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_queue_get_config_reply.__len__(self)
-        for obj in self.queues:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'queue_get_config_reply (OFPT_QUEUE_GET_CONFIG_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_queue_get_config_reply.show(self, prefix)
-        outstr += prefix + "Array queues\n"
-        for obj in self.queues:
-            outstr += obj.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_queue_get_config_reply.__eq__(self, other): return False
-        if self.queues != other.queues: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class queue_get_config_request(ofp_queue_get_config_request):
-    """
-    Wrapper class for queue_get_config_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_QUEUE_GET_CONFIG_REQUEST=22)
-
-    Data members inherited from ofp_queue_get_config_request:
-    @arg port
-
-    """
-
-    def __init__(self):
-        ofp_queue_get_config_request.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_QUEUE_GET_CONFIG_REQUEST
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_queue_get_config_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_queue_get_config_request.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_queue_get_config_request.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'queue_get_config_request (OFPT_QUEUE_GET_CONFIG_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_queue_get_config_request.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_queue_get_config_request.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class set_config(ofp_switch_config):
-    """
-    Wrapper class for set_config
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_SET_CONFIG=9)
-
-    Data members inherited from ofp_switch_config:
-    @arg flags
-    @arg miss_send_len
-
-    """
-
-    def __init__(self):
-        ofp_switch_config.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_SET_CONFIG
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_config.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_config.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_config.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'set_config (OFPT_SET_CONFIG)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_config.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_config.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for stats_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_STATS_REPLY=19)
-
-    Data members inherited from ofp_stats_reply:
-    @arg type
-    @arg flags
-
-    """
-
-    def __init__(self):
-        ofp_stats_reply.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_STATS_REPLY
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_stats_reply.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_stats_reply.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'stats_reply (OFPT_STATS_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_stats_reply.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class stats_request(ofp_stats_request):
-    """
-    Wrapper class for stats_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_STATS_REQUEST=18)
-
-    Data members inherited from ofp_stats_request:
-    @arg type
-    @arg flags
-
-    """
-
-    def __init__(self):
-        ofp_stats_request.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_STATS_REQUEST
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_stats_request.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'stats_request (OFPT_STATS_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_stats_request.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class table_mod(ofp_table_mod):
-    """
-    Wrapper class for table_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (2)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_TABLE_MOD=17)
-
-    Data members inherited from ofp_table_mod:
-    @arg table_id
-    @arg config
-
-    """
-
-    def __init__(self):
-        ofp_table_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_TABLE_MOD
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_table_mod.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_table_mod.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_table_mod.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'table_mod (OFPT_TABLE_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_table_mod.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_table_mod.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-
-################################################################
-#
-# Stats request and reply subclass definitions
-#
-################################################################
-
-
-# Stats request bodies for desc and table stats are not defined in the
-# OpenFlow header;  We define them here.  They are empty classes, really
-
-class ofp_desc_stats_request(object):
-    """
-    Forced definition of ofp_desc_stats_request (empty class)
-    """
-    def __init__(self):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_desc_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_DESC_STATS_REQUEST_BYTES = 0
-
-class ofp_table_stats_request(object):
-    """
-    Forced definition of ofp_table_stats_request (empty class)
-    """
-    def __init__(self):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_table_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_TABLE_STATS_REQUEST_BYTES = 0
-
-class ofp_group_desc_stats_request(object):
-    """
-    Forced definition of ofp_group_desc_stats_request (empty class)
-    """
-    def __init__(self):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_group_desc_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_GROUP_DESC_STATS_REQUEST_BYTES = 0
-
-
-
-# Stats entries define the content of one element in a stats
-# reply for the indicated type; define _entry for consistency
-
-aggregate_stats_entry = ofp_aggregate_stats_reply
-desc_stats_entry = ofp_desc_stats
-port_stats_entry = ofp_port_stats
-queue_stats_entry = ofp_queue_stats
-table_stats_entry = ofp_table_stats
-group_stats_entry = ofp_group_stats
-group_desc_stats_entry = ofp_group_desc_stats
-
-
-#
-# Flow stats entry contains an action list of variable length, so
-# it is done by hand
-#
-
-class flow_stats_entry(ofp_flow_stats):
-    """
-    Special case flow stats entry to handle action list object
-    """
-    def __init__(self):
-        ofp_flow_stats.__init__(self)
-        self.instructions = instruction_list()
-
-    def pack(self, assertstruct=True):
-        self.length = len(self)
-        packed = ofp_flow_stats.pack(self, assertstruct)
-        packed += self.instructions.pack()
-        if len(packed) != self.length:
-            print("ERROR: flow_stats_entry pack length not equal",
-                  self.length, len(packed))
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = ofp_flow_stats.unpack(self, binary_string)
-        ai_len = self.length - OFP_FLOW_STATS_BYTES
-        if ai_len < 0:
-            print("ERROR: flow_stats_entry unpack length too small",
-                  self.length)
-        binary_string = self.instructions.unpack(binary_string, bytes=ai_len)
-        return binary_string
-
-    def __len__(self):
-        return OFP_FLOW_STATS_BYTES + len(self.instructions)
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_entry\n"
-        outstr += ofp_flow_stats.show(self, prefix + '  ')
-        outstr += self.instructions.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (ofp_flow_stats.__eq__(self, other) and 
-                self.instructions == other.instructions)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class aggregate_stats_request(ofp_stats_request, ofp_aggregate_stats_request):
-    """
-    Wrapper class for aggregate stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_aggregate_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_AGGREGATE
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_aggregate_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_aggregate_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking aggregate: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_AGGREGATE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "aggregate_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_aggregate_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_aggregate_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class aggregate_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for aggregate stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_AGGREGATE
-        # stats: Array of type aggregate_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = aggregate_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = aggregate_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking aggregate stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "aggregate_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class desc_stats_request(ofp_stats_request, ofp_desc_stats_request):
-    """
-    Wrapper class for desc stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_desc_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_DESC
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_desc_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_desc_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking desc: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_DESC_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "desc_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_desc_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_desc_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class desc_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for desc stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_DESC
-        # stats: Array of type desc_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = desc_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = desc_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking desc stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "desc_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_stats_request(ofp_stats_request, ofp_flow_stats_request):
-    """
-    Wrapper class for flow stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_flow_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_FLOW
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_flow_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_flow_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking flow: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_FLOW_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_flow_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_flow_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for flow stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_FLOW
-        # stats: Array of type flow_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = flow_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = flow_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking flow stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_stats_request(ofp_stats_request, ofp_port_stats_request):
-    """
-    Wrapper class for port stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_port_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_PORT
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_port_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_port_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking port: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_PORT_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_port_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_port_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for port stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_PORT
-        # stats: Array of type port_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = port_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = port_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking port stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_stats_request(ofp_stats_request, ofp_queue_stats_request):
-    """
-    Wrapper class for queue stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_queue_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_QUEUE
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_queue_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_queue_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking queue: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_QUEUE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_queue_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_queue_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for queue stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_QUEUE
-        # stats: Array of type queue_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = queue_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = queue_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking queue stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_stats_request(ofp_stats_request, ofp_group_stats_request):
-    """
-    Wrapper class for group stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_group_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_GROUP
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_group_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_group_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_GROUP_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_group_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_group_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for group stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_GROUP
-        # stats: Array of type group_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = group_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = group_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_desc_stats_request(ofp_stats_request, ofp_group_desc_stats_request):
-    """
-    Wrapper class for group_desc stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_group_desc_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_GROUP_DESC
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_group_desc_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_group_desc_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group_desc: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_GROUP_DESC_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_desc_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_group_desc_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_group_desc_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_desc_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for group_desc stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_GROUP_DESC
-        # stats: Array of type group_desc_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = group_desc_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = group_desc_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group_desc stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_desc_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_stats_request(ofp_stats_request, ofp_table_stats_request):
-    """
-    Wrapper class for table stats request message
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_table_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_TABLE
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_table_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_table_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking table: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_TABLE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_table_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_table_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for table stats reply
-    """
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_TABLE
-        # stats: Array of type table_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = table_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = table_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking table stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-# @todo Add buckets to group and group_desc stats obejcts"
-message_type_list = (
-    aggregate_stats_reply,
-    aggregate_stats_request,
-    bad_action_error_msg,
-    bad_request_error_msg,
-    barrier_reply,
-    barrier_request,
-    desc_stats_reply,
-    desc_stats_request,
-    echo_reply,
-    echo_request,
-    error,
-    experimenter,
-    features_reply,
-    features_request,
-    flow_mod,
-    flow_mod_failed_error_msg,
-    flow_removed,
-    flow_stats_reply,
-    flow_stats_request,
-    get_config_reply,
-    get_config_request,
-    group_desc_stats_request,
-    group_desc_stats_reply,
-    group_stats_request,
-    group_stats_reply,
-    group_mod,
-    group_mod_failed_error_msg,
-    hello,
-    hello_failed_error_msg,
-    packet_in,
-    packet_out,
-    port_mod,
-    port_mod_failed_error_msg,
-    port_stats_reply,
-    port_stats_request,
-    port_status,
-    queue_get_config_reply,
-    queue_get_config_request,
-    queue_op_failed_error_msg,
-    queue_stats_reply,
-    queue_stats_request,
-    set_config,
-    switch_config_failed_error_msg,
-    table_mod,
-    table_mod_failed_error_msg,
-    table_stats_reply,
-    table_stats_request,
-    )
-
diff --git a/src/python/of11/message_unittests.py b/src/python/of11/message_unittests.py
deleted file mode 100755
index 04b8679..0000000
--- a/src/python/of11/message_unittests.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/python 
-
-import unittest
-import message
-import action
-import instruction
-import cstruct as ofp
-
-class flow_stats_pack(unittest.TestCase):
-    def runTest(self):
-        msg = message.flow_stats_entry()
-        match = ofp.ofp_match()
-        match.wildcards &= ~ofp.OFPFW_IN_PORT
-        act = action.action_output()
-        act.port = 3
-        msg.match = match
-        pkt = msg.pack()
-        self.assertEqual(len(pkt), 136)
-        inst = instruction.instruction_apply_actions()
-        self.assertTrue(inst.actions.add(act), "Could not add action")
-        self.assertTrue(msg.instructions.add(inst), "Could not add instructions")
-        #self.assertTrue(msg.actions.add(act), "Could not add action")
-        pkt = msg.pack()
-        # 160 = 136 for flow_stats_entry and 24 for instruction_list
-        self.assertEqual(len(pkt), 160)
-        rep = message.flow_stats_reply()
-        self.assertEqual(len(rep.pack()),12)
-        rep.stats.append(msg)
-        self.assertEqual(len(rep.pack()),172)
-        
-
-        
-class match_pack(unittest.TestCase):
-    def runTest(self):
-        match = ofp.ofp_match()
-        self.assertEqual(len(match.pack()), 88)
-        
-        
-if __name__ == '__main__':
-    unittest.main()
diff --git a/src/python/of11/parse.py b/src/python/of11/parse.py
deleted file mode 100644
index dfe24c6..0000000
--- a/src/python/of11/parse.py
+++ /dev/null
@@ -1,231 +0,0 @@
-"""
-OpenFlow message parsing functions
-"""
-
-import logging
-import message
-import cstruct as ofp
-
-"""
-of_message.py
-Contains wrapper functions and classes for the of_message namespace
-that are generated by hand.  It includes the rest of the wrapper
-function information into the of_message namespace
-"""
-
-parse_logger = logging.getLogger("parse")
-#parse_logger.setLevel(logging.DEBUG)
-
-# These message types are subclassed
-msg_type_subclassed = [
-    ofp.OFPT_STATS_REQUEST,
-    ofp.OFPT_STATS_REPLY,
-    ofp.OFPT_ERROR
-]
-
-# Maps from sub-types to classes
-stats_reply_to_class_map = {
-    ofp.OFPST_DESC                      : message.desc_stats_reply,
-    ofp.OFPST_AGGREGATE                 : message.aggregate_stats_reply,
-    ofp.OFPST_FLOW                      : message.flow_stats_reply,
-    ofp.OFPST_TABLE                     : message.table_stats_reply,
-    ofp.OFPST_PORT                      : message.port_stats_reply,
-    ofp.OFPST_QUEUE                     : message.queue_stats_reply
-}
-
-stats_request_to_class_map = {
-    ofp.OFPST_DESC                      : message.desc_stats_request,
-    ofp.OFPST_AGGREGATE                 : message.aggregate_stats_request,
-    ofp.OFPST_FLOW                      : message.flow_stats_request,
-    ofp.OFPST_TABLE                     : message.table_stats_request,
-    ofp.OFPST_PORT                      : message.port_stats_request,
-    ofp.OFPST_QUEUE                     : message.queue_stats_request
-}
-
-error_to_class_map = {
-    ofp.OFPET_HELLO_FAILED              : message.hello_failed_error_msg,
-    ofp.OFPET_BAD_REQUEST               : message.bad_request_error_msg,
-    ofp.OFPET_BAD_ACTION                : message.bad_action_error_msg,
-    ofp.OFPET_FLOW_MOD_FAILED           : message.flow_mod_failed_error_msg,
-    ofp.OFPET_PORT_MOD_FAILED           : message.port_mod_failed_error_msg,
-    ofp.OFPET_QUEUE_OP_FAILED           : message.queue_op_failed_error_msg,
-    ofp.OFPET_TABLE_MOD_FAILED          : message.table_mod_failed_error_msg,
-    ofp.OFPET_QUEUE_OP_FAILED           : message.queue_op_failed_error_msg,
-    ofp.OFPET_SWITCH_CONFIG_FAILED      : message.switch_config_failed_error_msg
-}
-
-# Map from header type value to the underlieing message class
-msg_type_to_class_map = {
-    ofp.OFPT_HELLO                      : message.hello,
-    ofp.OFPT_ERROR                      : message.error,
-    ofp.OFPT_ECHO_REQUEST               : message.echo_request,
-    ofp.OFPT_ECHO_REPLY                 : message.echo_reply,
-    ofp.OFPT_EXPERIMENTER               : message.experimenter,
-    ofp.OFPT_FEATURES_REQUEST           : message.features_request,
-    ofp.OFPT_FEATURES_REPLY             : message.features_reply,
-    ofp.OFPT_GET_CONFIG_REQUEST         : message.get_config_request,
-    ofp.OFPT_GET_CONFIG_REPLY           : message.get_config_reply,
-    ofp.OFPT_SET_CONFIG                 : message.set_config,
-    ofp.OFPT_PACKET_IN                  : message.packet_in,
-    ofp.OFPT_FLOW_REMOVED               : message.flow_removed,
-    ofp.OFPT_PORT_STATUS                : message.port_status,
-    ofp.OFPT_PACKET_OUT                 : message.packet_out,
-    ofp.OFPT_FLOW_MOD                   : message.flow_mod,
-    ofp.OFPT_PORT_MOD                   : message.port_mod,
-    ofp.OFPT_TABLE_MOD                  : message.table_mod,
-    ofp.OFPT_STATS_REQUEST              : message.stats_request,
-    ofp.OFPT_STATS_REPLY                : message.stats_reply,
-    ofp.OFPT_BARRIER_REQUEST            : message.barrier_request,
-    ofp.OFPT_BARRIER_REPLY              : message.barrier_reply,
-    ofp.OFPT_QUEUE_GET_CONFIG_REQUEST   : message.queue_get_config_request,
-    ofp.OFPT_QUEUE_GET_CONFIG_REPLY     : message.queue_get_config_reply,
-}
-
-def _of_message_to_object(binary_string):
-    """
-    Map a binary string to the corresponding class.
-
-    Appropriately resolves subclasses
-    """
-    hdr = ofp.ofp_header()
-    hdr.unpack(binary_string)
-    # FIXME: Add error detection
-    if not hdr.type in msg_type_subclassed:
-        return msg_type_to_class_map[hdr.type]()
-    if hdr.type == ofp.OFPT_STATS_REQUEST:
-        sub_hdr = ofp.ofp_stats_request()
-        sub_hdr.unpack(binary_string[ofp.OFP_HEADER_BYTES:])
-        try:
-            obj = stats_request_to_class_map[sub_hdr.type]()
-        except LookupError:
-            obj = None
-        return obj
-    elif hdr.type == ofp.OFPT_STATS_REPLY:
-        sub_hdr = ofp.ofp_stats_reply()
-        sub_hdr.unpack(binary_string[ofp.OFP_HEADER_BYTES:])
-        try:
-            obj = stats_reply_to_class_map[sub_hdr.type]()
-        except LookupError:
-            obj = None
-        return obj
-    elif hdr.type == ofp.OFPT_ERROR:
-        sub_hdr = ofp.ofp_error_msg()
-        sub_hdr.unpack(binary_string[ofp.OFP_HEADER_BYTES:])
-        return error_to_class_map[sub_hdr.type]()
-    else:
-        parse_logger.error("Cannot parse pkt to message")
-        return None
-
-def of_message_parse(binary_string, raw=False):
-    """
-    Parse an OpenFlow packet
-
-    Parses a raw OpenFlow packet into a Python class, with class
-    members fully populated.
-
-    @param binary_string The packet (string) to be parsed
-    @param raw If true, interpret the packet as an L2 packet.  Not
-    yet supported.
-    @return An object of some message class or None if fails
-    Note that any data beyond that parsed is not returned
-
-    """
-
-    if raw:
-        parse_logger.error("raw packet message parsing not supported")
-        return None
-
-    obj = _of_message_to_object(binary_string)
-    if obj:
-        obj.unpack(binary_string)
-    return obj
-
-
-def of_header_parse(binary_string, raw=False):
-    """
-    Parse only the header from an OpenFlow packet
-
-    Parses the header from a raw OpenFlow packet into a
-    an ofp_header Python class.
-
-    @param binary_string The packet (string) to be parsed
-    @param raw If true, interpret the packet as an L2 packet.  Not
-    yet supported.
-    @return An ofp_header object
-
-    """
-
-    if raw:
-        parse_logger.error("raw packet message parsing not supported")
-        return None
-
-    hdr = ofp.ofp_header()
-    hdr.unpack(binary_string)
-
-    return hdr
-
-map_wc_field_to_match_member = {
-    'OFPFW_DL_VLAN'                 : 'dl_vlan',
-    'OFPFW_DL_SRC'                  : 'dl_src',
-    'OFPFW_DL_DST'                  : 'dl_dst',
-    'OFPFW_DL_TYPE'                 : 'dl_type',
-    'OFPFW_NW_PROTO'                : 'nw_proto',
-    'OFPFW_TP_SRC'                  : 'tp_src',
-    'OFPFW_TP_DST'                  : 'tp_dst',
-    'OFPFW_NW_SRC_SHIFT'            : 'nw_src_shift',
-    'OFPFW_NW_SRC_BITS'             : 'nw_src_bits',
-    'OFPFW_NW_SRC_MASK'             : 'nw_src_mask',
-    'OFPFW_NW_SRC_ALL'              : 'nw_src_all',
-    'OFPFW_NW_DST_SHIFT'            : 'nw_dst_shift',
-    'OFPFW_NW_DST_BITS'             : 'nw_dst_bits',
-    'OFPFW_NW_DST_MASK'             : 'nw_dst_mask',
-    'OFPFW_NW_DST_ALL'              : 'nw_dst_all',
-    'OFPFW_DL_VLAN_PCP'             : 'dl_vlan_pcp',
-    'OFPFW_NW_TOS'                  : 'nw_tos'
-}
-
-
-def parse_mac(mac_str):
-    """
-    Parse a MAC address
-
-    Parse a MAC address ':' separated string of hex digits to an
-    array of integer values.  '00:d0:05:5d:24:00' => [0, 208, 5, 93, 36, 0]
-    @param mac_str The string to convert
-    @return Array of 6 integer values
-    """
-    return map(lambda val:eval("0x" + val), mac_str.split(":"))
-
-def parse_ip(ip_str):
-    """
-    Parse an IP address
-
-    Parse an IP address '.' separated string of decimal digits to an
-    host ordered integer.  '172.24.74.77' => 
-    @param ip_str The string to convert
-    @return Integer value
-    """
-    array = map(lambda val:eval(val),ip_str.split("."))
-    val = 0
-    for a in array:
-        val <<= 8
-        val += a
-    return val
-
-def packet_to_flow_match(packet):
-    """
-    Create a flow match that matches packet with the given wildcards
-
-    @param packet The packet to use as a flow template
-    @param pkt_format Currently only L2 is supported.  Will indicate the 
-    overall packet type for parsing
-    @return An ofp_match object if successful.  None if format is not
-    recognized.  The wildcards of the match will be cleared for the
-    values extracted from the packet.
-
-    @todo check min length of packet
-    @todo Check if packet is other than L2 format
-    @todo Implement ICMP and ARP fields
-    """
-
-    return packet.parse()
diff --git a/src/python/of12/__init__.py b/src/python/of12/__init__.py
deleted file mode 100644
index 36dd8fa..0000000
--- a/src/python/of12/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Allow accessing constants through the top-level module
-from cstruct import *
-
-# Allow accessing submodules without additional imports
-import action
-import bucket
-import instruction
-import match
-import message
-import parse
diff --git a/src/python/of12/action.py b/src/python/of12/action.py
deleted file mode 100644
index 059e390..0000000
--- a/src/python/of12/action.py
+++ /dev/null
@@ -1,427 +0,0 @@
-
-# Python OpenFlow action wrapper classes
-
-from cstruct import *
-from match import roundup
-from match_list import match_list
-
-class pop_mpls(ofp_action_pop_mpls):
-    """
-    Wrapper class for pop_mpls action object
-
-    Data members inherited from ofp_action_pop_mpls:
-    @arg type
-    @arg len
-    @arg ethertype
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_pop_mpls.__init__(self)
-        self.type = OFPAT_POP_MPLS
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_pop_mpls\n"
-        outstr += ofp_action_pop_mpls.show(self, prefix)
-        return outstr
-
-
-class push_vlan(ofp_action_push):
-    """
-    Wrapper class for push_vlan action object
-
-    Data members inherited from ofp_action_push:
-    @arg type
-    @arg len
-    @arg ethertype
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_push.__init__(self)
-        self.type = OFPAT_PUSH_VLAN
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_push_vlan\n"
-        outstr += ofp_action_push.show(self, prefix)
-        return outstr
-
-
-class experimenter(ofp_action_experimenter_header):
-    """
-    Wrapper class for experimenter action object
-
-    Data members inherited from ofp_action_experimenter_header:
-    @arg type
-    @arg len
-    @arg experimenter
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_experimenter_header.__init__(self)
-        self.type = OFPAT_EXPERIMENTER
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_experimenter\n"
-        outstr += ofp_action_experimenter_header.show(self, prefix)
-        return outstr
-
-
-class dec_mpls_ttl(ofp_action_header):
-    """
-    Wrapper class for dec_mpls_ttl action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_DEC_MPLS_TTL
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_dec_mpls_ttl\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class set_nw_ttl(ofp_action_nw_ttl):
-    """
-    Wrapper class for set_nw_ttl action object
-
-    Data members inherited from ofp_action_nw_ttl:
-    @arg type
-    @arg len
-    @arg nw_ttl
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_nw_ttl.__init__(self)
-        self.type = OFPAT_SET_NW_TTL
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_nw_ttl\n"
-        outstr += ofp_action_nw_ttl.show(self, prefix)
-        return outstr
-
-
-class copy_ttl_in(ofp_action_header):
-    """
-    Wrapper class for copy_ttl_in action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_COPY_TTL_IN
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_copy_ttl_in\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class group(ofp_action_group):
-    """
-    Wrapper class for group action object
-
-    Data members inherited from ofp_action_group:
-    @arg type
-    @arg len
-    @arg group_id
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_group.__init__(self)
-        self.type = OFPAT_GROUP
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_group\n"
-        outstr += ofp_action_group.show(self, prefix)
-        return outstr
-    def __len__(self):
-        return roundup(4 + 4,8)
-
-
-class set_queue(ofp_action_set_queue):
-    """
-    Wrapper class for set_queue action object
-
-    Data members inherited from ofp_action_set_queue:
-    @arg type
-    @arg len
-    @arg queue_id
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_set_queue.__init__(self)
-        self.type = OFPAT_SET_QUEUE
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_queue\n"
-        outstr += ofp_action_set_queue.show(self, prefix)
-        return outstr
-
-
-class push_mpls(ofp_action_push):
-    """
-    Wrapper class for push_mpls action object
-
-    Data members inherited from ofp_action_push:
-    @arg type
-    @arg len
-    @arg ethertype
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_push.__init__(self)
-        self.type = OFPAT_PUSH_MPLS
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_push_mpls\n"
-        outstr += ofp_action_push.show(self, prefix)
-        return outstr
-
-
-class copy_ttl_out(ofp_action_header):
-    """
-    Wrapper class for copy_ttl_out action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_COPY_TTL_OUT
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_copy_ttl_out\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class set_field(ofp_action_set_field):
-    """
-    Wrapper class for set_field action object
-
-    Data members inherited from ofp_action_set_field:
-    @arg type
-    @arg len
-    @arg field
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_set_field.__init__(self)
-        self.type = OFPAT_SET_FIELD
-        self.len = self.__len__()
-        self.field = match_list()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-        
-    def pack(self):
-        packed = ""
-        if len(self.field) <= 4:
-            packed += ofp_action_set_field.pack()
-        else:
-            self.len = len(self)
-            packed += struct.pack("!HH", self.type, self.len)
-            packed += self.field.pack()
-            padding_size = roundup(len(self.field) -4,8) -  (len(self.field) -4)
-            if padding_size:
-                padding = [0] * padding_size
-                packed += struct.pack("!" + str(padding_size) + "B", *padding)
-        return packed
-    
-    def unpack(self, binary_string):
-        if len(binary_string) <= 8:
-            binary_string = ofp_action_set_field.unpack(self)
-        else: 
-            (self.type, self.len) = struct.unpack("!HH",  binary_string[0:4])
-            binary_string = binary_string[4:]
-            binary_string = self.field.unpack(binary_string, bytes = self.len - 4)
-            padding_size = roundup(len(self.field) -4,8) -  (len(self.field) -4) 
-            if padding_size:
-                binary_string = binary_string[padding_size:]
-        return binary_string
-        
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_field\n"
-        outstr += ofp_action_set_field.show(self, prefix)
-        return outstr
-    
-    def __len__(self):
-        return roundup(4 + len(self.field),8)
-         
-
-class set_mpls_ttl(ofp_action_mpls_ttl):
-    """
-    Wrapper class for set_mpls_ttl action object
-
-    Data members inherited from ofp_action_mpls_ttl:
-    @arg type
-    @arg len
-    @arg mpls_ttl
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_mpls_ttl.__init__(self)
-        self.type = OFPAT_SET_MPLS_TTL
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_set_mpls_ttl\n"
-        outstr += ofp_action_mpls_ttl.show(self, prefix)
-        return outstr
-
-
-class pop_vlan(ofp_action_header):
-    """
-    Wrapper class for pop_vlan action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_POP_VLAN
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_pop_vlan\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class dec_nw_ttl(ofp_action_header):
-    """
-    Wrapper class for dec_nw_ttl action object
-
-    Data members inherited from ofp_action_header:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_header.__init__(self)
-        self.type = OFPAT_DEC_NW_TTL
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_dec_nw_ttl\n"
-        outstr += ofp_action_header.show(self, prefix)
-        return outstr
-
-
-class output(ofp_action_output):
-    """
-    Wrapper class for output action object
-
-    Data members inherited from ofp_action_output:
-    @arg type
-    @arg len
-    @arg port
-    @arg max_len
-
-    """
-    def __init__(self, **kwargs):
-        ofp_action_output.__init__(self)
-        self.type = OFPAT_OUTPUT
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_output\n"
-        outstr += ofp_action_output.show(self, prefix)
-        return outstr
-
-action_class_list = (
-    copy_ttl_in,
-    copy_ttl_out,
-    dec_mpls_ttl,
-    dec_nw_ttl,
-    experimenter,
-    group,
-    output,
-    pop_mpls,
-    pop_vlan,
-    push_mpls,
-    push_vlan,
-    set_field,
-    set_mpls_ttl,
-    set_nw_ttl,
-    set_queue)
-
diff --git a/src/python/of12/action_list.py b/src/python/of12/action_list.py
deleted file mode 100644
index 78341e2..0000000
--- a/src/python/of12/action_list.py
+++ /dev/null
@@ -1,88 +0,0 @@
-"""
-OpenFlow action, instruction and bucket list classes
-"""
-
-from action import *
-from cstruct import ofp_header
-from base_list import ofp_base_list
-import copy
-
-action_object_map = {
-    OFPAT_OUTPUT                        : output,
-    OFPAT_SET_FIELD                     : set_field,
-    OFPAT_COPY_TTL_OUT                  : copy_ttl_out,
-    OFPAT_COPY_TTL_IN                   : copy_ttl_in,
-    OFPAT_SET_MPLS_TTL                  : set_mpls_ttl,
-    OFPAT_DEC_MPLS_TTL                  : dec_mpls_ttl,
-    OFPAT_PUSH_VLAN                     : push_vlan,
-    OFPAT_POP_VLAN                      : pop_vlan,
-    OFPAT_PUSH_MPLS                     : push_mpls,
-    OFPAT_POP_MPLS                      : pop_mpls,
-    OFPAT_SET_QUEUE                     : set_queue,
-    OFPAT_GROUP                         : group,
-    OFPAT_SET_NW_TTL                    : set_nw_ttl,
-    OFPAT_DEC_NW_TTL                    : dec_nw_ttl,
-    OFPAT_EXPERIMENTER                  : experimenter
-}
-
-class action_list(ofp_base_list):
-    """
-    Maintain a list of actions
-
-    Data members:
-    @arg actions: An array of action objects such as action_output, etc.
-
-    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, actions=None):
-        ofp_base_list.__init__(self)
-        self.actions = self.items
-        if actions:
-            self.actions.extend(actions)
-        self.name = "action"
-        self.class_list = action_class_list
-
-    def unpack(self, binary_string, bytes=None):
-        """
-        Unpack a list of actions
-        
-        Unpack actions 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 action list in bytes.  
-        Ignored if decode is True.  If 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 = ofp_action_header()
-            hdr.unpack(cur_string)
-            if hdr.len < OFP_ACTION_HEADER_BYTES:
-                print "ERROR: Action too short"
-                break
-            if not hdr.type in action_object_map.keys():
-                print "WARNING: Skipping unknown action ", hdr.type, hdr.len
-            else:
-                self.actions.append(action_object_map[hdr.type]())
-                self.actions[count].unpack(cur_string)
-                count += 1
-            cur_string = cur_string[hdr.len:]
-            bytes_done += hdr.len
-        return cur_string
-
diff --git a/src/python/of12/base_list.py b/src/python/of12/base_list.py
deleted file mode 100644
index 938c68e..0000000
--- a/src/python/of12/base_list.py
+++ /dev/null
@@ -1,158 +0,0 @@
-
-"""
-Base list class for inheritance.
-Most of the list stuff is common; unpacking is the only thing that
-is left pure virtual.
-"""
-
-import copy
-
-class ofp_base_list(object):
-    """
-    Container type to maintain a list of ofp objects
-
-    Data members:
-    @arg items An array of objects
-    @arg class_list A tuple of classes that may be added to the list;
-         If None, no checking is done
-    @arg name The name to use when displaying the list
-
-    Methods:
-    @arg pack Pack the structure into a string
-    @arg unpack Unpack a string to objects, with proper typing
-    @arg add Add an item to the list; you can directly access
-    the item member, but add will validate that the added object 
-    is of the right type.
-    @arg extend Add the items for another list to this list
-
-    """
-
-    def __init__(self):
-        self.items = []
-        self.class_list = None
-        self.name = "unspecified"
-
-    def pack(self):
-        """
-        Pack a list of items
-
-        Returns the packed string
-        """
-        packed = ""
-        for obj in self.items:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string, bytes=None):
-        """
-        Pure virtual function for a list of items
-
-        Unpack items 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 list in bytes.  
-        Ignored if decode is True.  If 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
-        """
-        pass
-
-    def add(self, item):
-        """
-        Add an item to a list
-
-        @param item The item to add
-        @return True if successful, False if not proper type object
-
-        """
-
-        # Note that the second arg of isinstance can be a list which
-        # checks that the type of item is in the list
-        if (self.class_list is not None) and \
-                not isinstance(item, tuple(self.class_list)):
-            return False
-
-        tmp = copy.deepcopy(item)
-        self.items.append(tmp)
-        return True
-
-    def remove_type(self, target):
-        """
-        Remove the first item on the list of the given type
-
-        @param target The type of item to search
-
-        @return The object removed, if any; otherwise None
-
-        """
-        for index in xrange(len(self.items)):
-            if self.items[index].type == target:
-                return self.items.pop(index)
-        return None
-
-    def find_type(self, target):
-        """
-        Find the first item on the list of the given type
-
-        @param target The type of item to search
-
-        @return The object with the matching type if any; otherwise None
-
-        """
-        for index in xrange(len(self.items)):
-            if self.items[index].type == target:
-                return self.items[index]
-        return None
-
-    def extend(self, other):
-        """
-        Add the items in other to this list
-
-        @param other An object of the same type of list whose
-        entries are to be merged into this list
-
-        @return True if successful.  If not successful, the list
-        may have been modified.
-
-        @todo Check if this is proper deep copy or not
-
-        """
-        for act in other.items:
-            if not self.add(act):
-                return False
-        return True
-
-    def __len__(self):
-        """
-        Length of the list packed as a string
-        """
-        length = 0
-        for item in self.items:
-            length += item.__len__()
-        return length
-
-    def __eq__(self, other):
-        if type(self) != type(other):
-            return False
-        if self.items != other.items:
-            return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    # Methods to make class iterable
-    def __iter__(self):
-        return self.items.__iter__()
-
-    def show(self, prefix=''):
-        outstr = prefix + self.name + "list with " + str(len(self.items)) + \
-            " items\n"
-        count = 0
-        for obj in self.items:
-            count += 1
-            outstr += prefix + " " + self.name + " " + str(count) + ": \n"
-            outstr += obj.show(prefix + '    ')
-        return outstr
diff --git a/src/python/of12/bucket.py b/src/python/of12/bucket.py
deleted file mode 100644
index 64caed1..0000000
--- a/src/python/of12/bucket.py
+++ /dev/null
@@ -1,42 +0,0 @@
-
-# Python OpenFlow bucket wrapper class
-
-from cstruct import ofp_bucket
-from action_list import action_list
-
-
-
-class bucket(ofp_bucket):
-    """
-    Wrapper class for bucket object
-
-    Data members inherited from ofp_bucket:
-    @arg len
-    @arg weight
-    @arg watch_port
-    @arg watch_group
-
-    """
-    def __init__(self):
-        ofp_bucket.__init__(self)
-        self.actions = action_list()
-        self.type = None
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "bucket\n"
-        outstr += ofp_bucket.show(self, prefix)
-        outstr += self.actions.show()
-        return outstr
-    def unpack(self, binary_string):
-        binary_string = ofp_bucket.unpack(self, binary_string)
-        self.actions = action_list()
-        return self.actions.unpack(binary_string)
-    def pack(self):
-        self.len = len(self)
-        packed = ""
-        packed += ofp_bucket.pack(self)
-        packed += self.actions.pack()
-        return packed
-    def __len__(self):
-        return ofp_bucket.__len__(self) + self.actions.__len__()
-
diff --git a/src/python/of12/bucket_list.py b/src/python/of12/bucket_list.py
deleted file mode 100644
index 33d9472..0000000
--- a/src/python/of12/bucket_list.py
+++ /dev/null
@@ -1,52 +0,0 @@
-
-from base_list import ofp_base_list
-from bucket import bucket
-
-class bucket_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.buckets = self.items
-        self.name = "buckets"
-        self.class_list = (bucket,)
-
-    def unpack(self, binary_string, bytes=None):
-        """
-        Unpack a list of buckets
-        
-        Unpack buckets 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
-        cur_string = binary_string
-        while bytes_done < bytes:
-            b = bucket()
-            cur_string = b.unpack(cur_string)
-            self.buckets.append(b)
-            bytes_done += len(b)
-        return cur_string
diff --git a/src/python/of12/class_maps.py b/src/python/of12/class_maps.py
deleted file mode 100644
index cd60deb..0000000
--- a/src/python/of12/class_maps.py
+++ /dev/null
@@ -1,346 +0,0 @@
-
-# Class to array member map
-class_to_members_map = {
-    'ofp_aggregate_stats_reply'     : [
-                                       'packet_count',
-                                       'byte_count',
-                                       'flow_count'
-                                      ],
-    'ofp_role_request'              : [
-                                       'role',
-                                       'generation_id'
-                                      ],
-    'ofp_table_stats'               : [
-                                       'table_id',
-                                       'name',
-                                       'match',
-                                       'wildcards',
-                                       'write_actions',
-                                       'apply_actions',
-                                       'write_setfields',
-                                       'apply_setfields',
-                                       'metadata_match',
-                                       'metadata_write',
-                                       'instructions',
-                                       'config',
-                                       'max_entries',
-                                       'active_count',
-                                       'lookup_count',
-                                       'matched_count'
-                                      ],
-    'ofp_table_mod'                 : [
-                                       'table_id',
-                                       'config'
-                                      ],
-    'ofp_group_stats'               : [
-                                       'length',
-                                       'group_id',
-                                       'ref_count',
-                                       'packet_count',
-                                       'byte_count'
-                                      ],
-    'ofp_instruction_actions'       : [
-                                       'type',
-                                       'len'
-                                      ],
-    'ofp_queue_stats'               : [
-                                       'port_no',
-                                       'queue_id',
-                                       'tx_bytes',
-                                       'tx_packets',
-                                       'tx_errors'
-                                      ],
-    'ofp_packet_in'                 : [
-                                       'buffer_id',
-                                       'total_len',
-                                       'reason',
-                                       'table_id',
-                                       'match'
-                                      ],
-    'ofp_error_experimenter_msg'    : [
-                                       'type',
-                                       'exp_type',
-                                       'experimenter'
-                                      ],
-    'ofp_bucket_counter'            : [
-                                       'packet_count',
-                                       'byte_count'
-                                      ],
-    'ofp_port_stats_request'        : [
-                                       'port_no'
-                                      ],
-    'ofp_stats_request'             : [
-                                       'type',
-                                       'flags'
-                                      ],
-    'ofp_instruction'               : [
-                                       'type',
-                                       'len'
-                                      ],
-    'ofp_group_stats_request'       : [
-                                       'group_id'
-                                      ],
-    'ofp_experimenter_header'       : [
-                                       'experimenter',
-                                       'exp_type'
-                                      ],
-    'ofp_aggregate_stats_request'   : [
-                                       'table_id',
-                                       'out_port',
-                                       'out_group',
-                                       'cookie',
-                                       'cookie_mask',
-                                       'match'
-                                      ],
-    'ofp_queue_get_config_request'  : [
-                                       'port'
-                                      ],
-    'ofp_action_nw_ttl'             : [
-                                       'type',
-                                       'len',
-                                       'nw_ttl'
-                                      ],
-    'ofp_port_status'               : [
-                                       'reason',
-                                       'desc'
-                                      ],
-    'ofp_action_header'             : [
-                                       'type',
-                                       'len'
-                                      ],
-    'ofp_port_mod'                  : [
-                                       'port_no',
-                                       'hw_addr',
-                                       'config',
-                                       'mask',
-                                       'advertise'
-                                      ],
-    'ofp_action_output'             : [
-                                       'type',
-                                       'len',
-                                       'port',
-                                       'max_len'
-                                      ],
-    'ofp_switch_config'             : [
-                                       'flags',
-                                       'miss_send_len'
-                                      ],
-    'ofp_queue_prop_experimenter'   : [
-                                       'prop_header',
-                                       'experimenter'
-                                      ],
-    'ofp_instruction_write_metadata' : [
-                                       'type',
-                                       'len',
-                                       'metadata',
-                                       'metadata_mask'
-                                      ],
-    'ofp_action_experimenter_header' : [
-                                       'type',
-                                       'len',
-                                       'experimenter'
-                                      ],
-    'ofp_queue_get_config_reply'    : [
-                                       'port'
-                                      ],
-    'ofp_oxm_experimenter_header'   : [
-                                       'oxm_header',
-                                       'experimenter'
-                                      ],
-    'ofp_action_set_queue'          : [
-                                       'type',
-                                       'len',
-                                       'queue_id'
-                                      ],
-    'ofp_action_set_field'          : [
-                                       'type',
-                                       'len',
-                                       'field'
-                                      ],
-    'ofp_flow_stats'                : [
-                                       'length',
-                                       'table_id',
-                                       'duration_sec',
-                                       'duration_nsec',
-                                       'priority',
-                                       'idle_timeout',
-                                       'hard_timeout',
-                                       'cookie',
-                                       'packet_count',
-                                       'byte_count',
-                                       'match'
-                                      ],
-    'ofp_flow_removed'              : [
-                                       'cookie',
-                                       'priority',
-                                       'reason',
-                                       'table_id',
-                                       'duration_sec',
-                                       'duration_nsec',
-                                       'idle_timeout',
-                                       'hard_timeout',
-                                       'packet_count',
-                                       'byte_count',
-                                       'match'
-                                      ],
-    'ofp_queue_prop_min_rate'       : [
-                                       'prop_header',
-                                       'rate'
-                                      ],
-    'ofp_header'                    : [
-                                       'version',
-                                       'type',
-                                       'length',
-                                       'xid'
-                                      ],
-    'ofp_stats_reply'               : [
-                                       'type',
-                                       'flags'
-                                      ],
-    'ofp_queue_stats_request'       : [
-                                       'port_no',
-                                       'queue_id'
-                                      ],
-    'ofp_group_features_stats'      : [
-                                       'types',
-                                       'capabilities',
-                                       'max_groups',
-                                       'actions'
-                                      ],
-    'ofp_group_mod'                 : [
-                                       'command',
-                                       'type',
-                                       'group_id'
-                                      ],
-    'ofp_port_stats'                : [
-                                       'port_no',
-                                       'rx_packets',
-                                       'tx_packets',
-                                       'rx_bytes',
-                                       'tx_bytes',
-                                       'rx_dropped',
-                                       'tx_dropped',
-                                       'rx_errors',
-                                       'tx_errors',
-                                       'rx_frame_err',
-                                       'rx_over_err',
-                                       'rx_crc_err',
-                                       'collisions'
-                                      ],
-    'ofp_packet_queue'              : [
-                                       'queue_id',
-                                       'port',
-                                       'len'
-                                      ],
-    'ofp_port'                      : [
-                                       'port_no',
-                                       'hw_addr',
-                                       'name',
-                                       'config',
-                                       'state',
-                                       'curr',
-                                       'advertised',
-                                       'supported',
-                                       'peer',
-                                       'curr_speed',
-                                       'max_speed'
-                                      ],
-    'ofp_switch_features'           : [
-                                       'datapath_id',
-                                       'n_buffers',
-                                       'n_tables',
-                                       'capabilities',
-                                       'reserved'
-                                      ],
-    'ofp_queue_prop_header'         : [
-                                       'property',
-                                       'len'
-                                      ],
-    'ofp_flow_stats_request'        : [
-                                       'table_id',
-                                       'out_port',
-                                       'out_group',
-                                       'cookie',
-                                       'cookie_mask',
-                                       'match'
-                                      ],
-    'ofp_bucket'                    : [
-                                       'len',
-                                       'weight',
-                                       'watch_port',
-                                       'watch_group'
-                                      ],
-    'ofp_action_pop_mpls'           : [
-                                       'type',
-                                       'len',
-                                       'ethertype'
-                                      ],
-    'ofp_match'                     : [
-                                       'type',
-                                       'length'
-                                      ],
-    'ofp_flow_mod'                  : [
-                                       'cookie',
-                                       'cookie_mask',
-                                       'table_id',
-                                       'command',
-                                       'idle_timeout',
-                                       'hard_timeout',
-                                       'priority',
-                                       'buffer_id',
-                                       'out_port',
-                                       'out_group',
-                                       'flags',
-                                       'match'
-                                      ],
-    'ofp_packet_out'                : [
-                                       'buffer_id',
-                                       'in_port',
-                                       'actions_len'
-                                      ],
-    'ofp_instruction_goto_table'    : [
-                                       'type',
-                                       'len',
-                                       'table_id'
-                                      ],
-    'ofp_queue_prop_max_rate'       : [
-                                       'prop_header',
-                                       'rate'
-                                      ],
-    'ofp_experimenter_stats_header' : [
-                                       'experimenter',
-                                       'exp_type'
-                                      ],
-    'ofp_action_group'              : [
-                                       'type',
-                                       'len',
-                                       'group_id'
-                                      ],
-    'ofp_desc_stats'                : [
-                                       'mfr_desc',
-                                       'hw_desc',
-                                       'sw_desc',
-                                       'serial_num',
-                                       'dp_desc'
-                                      ],
-    'ofp_action_push'               : [
-                                       'type',
-                                       'len',
-                                       'ethertype'
-                                      ],
-    'ofp_group_desc_stats'          : [
-                                       'length',
-                                       'type',
-                                       'group_id'
-                                      ],
-    'ofp_error_msg'                 : [
-                                       'type',
-                                       'code'
-                                      ],
-    'ofp_action_mpls_ttl'           : [
-                                       'type',
-                                       'len',
-                                       'mpls_ttl'
-                                      ],
-    '_ignore' : []
-}
diff --git a/src/python/of12/cstruct.py b/src/python/of12/cstruct.py
deleted file mode 100644
index 06f9ac9..0000000
--- a/src/python/of12/cstruct.py
+++ /dev/null
@@ -1,5922 +0,0 @@
-import struct
-
-# Structure definitions
-class ofp_hello(object):
-    """Automatically generated Python class for ofp_hello
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 0):
-            return binaryString
-        return binaryString[0:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 0
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        return outstr
-
-
-class ofp_aggregate_stats_reply(object):
-    """Automatically generated Python class for ofp_aggregate_stats_reply
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.packet_count = 0
-        self.byte_count = 0
-        self.flow_count = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QQL", self.packet_count, self.byte_count, self.flow_count)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!QQL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count, self.flow_count) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 20
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        if self.flow_count !=  other.flow_count: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        outstr += prefix + 'flow_count: ' + str(self.flow_count) + '\n'
-        return outstr
-
-
-class ofp_role_request(object):
-    """Automatically generated Python class for ofp_role_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.role = 0
-        self.pad= [0,0,0,0]
-        self.generation_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.role)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!Q", self.generation_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.role,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!Q'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.generation_id,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.role !=  other.role: return False
-        if self.pad !=  other.pad: return False
-        if self.generation_id !=  other.generation_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'role: ' + str(self.role) + '\n'
-        outstr += prefix + 'generation_id: ' + str(self.generation_id) + '\n'
-        return outstr
-
-
-class ofp_table_stats(object):
-    """Automatically generated Python class for ofp_table_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad= [0,0,0,0,0,0,0]
-        self.name= ""
-        self.match = 0
-        self.wildcards = 0
-        self.write_actions = 0
-        self.apply_actions = 0
-        self.write_setfields = 0
-        self.apply_setfields = 0
-        self.metadata_match = 0
-        self.metadata_write = 0
-        self.instructions = 0
-        self.config = 0
-        self.max_entries = 0
-        self.active_count = 0
-        self.lookup_count = 0
-        self.matched_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 7):
-            return (False, "self.pad is not of size 7 as expected.")
-        if(not isinstance(self.name, str)):
-            return (False, "self.name is not string as expected.")
-        if(len(self.name) > 32):
-            return (False, "self.name is not of size 32 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6])
-        packed += self.name.ljust(32,'\0')
-        packed += struct.pack("!QQLLQQQQLLLLQQ", self.match, self.wildcards, self.write_actions, self.apply_actions, self.write_setfields, self.apply_setfields, self.metadata_match, self.metadata_write, self.instructions, self.config, self.max_entries, self.active_count, self.lookup_count, self.matched_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 128):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6]) = struct.unpack(fmt, binaryString[start:end])
-        self.name = binaryString[8:40].replace("\0","")
-        fmt = '!QQLLQQQQLLLLQQ'
-        start = 40
-        end = start + struct.calcsize(fmt)
-        (self.match, self.wildcards, self.write_actions, self.apply_actions, self.write_setfields, self.apply_setfields, self.metadata_match, self.metadata_write, self.instructions, self.config, self.max_entries, self.active_count, self.lookup_count, self.matched_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[128:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 128
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.name !=  other.name: return False
-        if self.match !=  other.match: return False
-        if self.wildcards !=  other.wildcards: return False
-        if self.write_actions !=  other.write_actions: return False
-        if self.apply_actions !=  other.apply_actions: return False
-        if self.write_setfields !=  other.write_setfields: return False
-        if self.apply_setfields !=  other.apply_setfields: return False
-        if self.metadata_write !=  other.metadata_match: return False        
-        if self.metadata_write !=  other.metadata_write: return False
-        if self.instructions !=  other.instructions: return False
-        if self.config !=  other.config: return False
-        if self.max_entries !=  other.max_entries: return False
-        if self.active_count !=  other.active_count: return False
-        if self.lookup_count !=  other.lookup_count: return False
-        if self.matched_count !=  other.matched_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'name: ' + str(self.name) + '\n'
-        outstr += prefix + 'match: ' + str(self.match) + '\n'
-        outstr += prefix + 'wildcards: ' + str(self.wildcards) + '\n'
-        outstr += prefix + 'write_actions: ' + str(self.write_actions) + '\n'
-        outstr += prefix + 'apply_actions: ' + str(self.apply_actions) + '\n'
-        outstr += prefix + 'write_setfields: ' + str(self.write_setfields) + '\n'
-        outstr += prefix + 'apply_setfields: ' + str(self.apply_setfields) + '\n'
-        outstr += prefix + 'metadata_match: ' + str(self.metadata_match) + '\n'
-        outstr += prefix + 'metadata_write: ' + str(self.metadata_write) + '\n'
-        outstr += prefix + 'instructions: ' + str(self.instructions) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'max_entries: ' + str(self.max_entries) + '\n'
-        outstr += prefix + 'active_count: ' + str(self.active_count) + '\n'
-        outstr += prefix + 'lookup_count: ' + str(self.lookup_count) + '\n'
-        outstr += prefix + 'matched_count: ' + str(self.matched_count) + '\n'
-        return outstr
-
-
-class ofp_table_mod(object):
-    """Automatically generated Python class for ofp_table_mod
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad= [0,0,0]
-        self.config = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += struct.pack("!L", self.config)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!L'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.config,) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.config !=  other.config: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        return outstr
-
-
-class ofp_group_stats(object):
-    """Automatically generated Python class for ofp_group_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.length = 0
-        self.pad= [0,0]
-        self.group_id = 0
-        self.ref_count = 0
-        self.pad2= [0,0,0,0]
-        self.packet_count = 0
-        self.byte_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 4):
-            return (False, "self.pad2 is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!H", self.length)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        packed += struct.pack("!LL", self.group_id, self.ref_count)
-        packed += struct.pack("!BBBB", self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3])
-        packed += struct.pack("!QQ", self.packet_count, self.byte_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 32):
-            return binaryString
-        fmt = '!H'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.length,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 2
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.group_id, self.ref_count) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[32:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 32
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.length !=  other.length: return False
-        if self.pad !=  other.pad: return False
-        if self.group_id !=  other.group_id: return False
-        if self.ref_count !=  other.ref_count: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        outstr += prefix + 'ref_count: ' + str(self.ref_count) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        return outstr
-
-
-class ofp_instruction_actions(object):
-    """Automatically generated Python class for ofp_instruction_actions
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_queue_stats(object):
-    """Automatically generated Python class for ofp_queue_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.queue_id = 0
-        self.tx_bytes = 0
-        self.tx_packets = 0
-        self.tx_errors = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LLQQQ", self.port_no, self.queue_id, self.tx_bytes, self.tx_packets, self.tx_errors)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 32):
-            return binaryString
-        fmt = '!LLQQQ'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no, self.queue_id, self.tx_bytes, self.tx_packets, self.tx_errors) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[32:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 32
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.queue_id !=  other.queue_id: return False
-        if self.tx_bytes !=  other.tx_bytes: return False
-        if self.tx_packets !=  other.tx_packets: return False
-        if self.tx_errors !=  other.tx_errors: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        outstr += prefix + 'tx_bytes: ' + str(self.tx_bytes) + '\n'
-        outstr += prefix + 'tx_packets: ' + str(self.tx_packets) + '\n'
-        outstr += prefix + 'tx_errors: ' + str(self.tx_errors) + '\n'
-        return outstr
-
-
-class ofp_packet_in(object):
-    """Automatically generated Python class for ofp_packet_in
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.buffer_id = 0
-        self.total_len = 0
-        self.reason = 0
-        self.table_id = 0
-        self.match = ofp_match()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LHBB", self.buffer_id, self.total_len, self.reason, self.table_id)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 12):
-            return binaryString
-        fmt = '!LHBB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.buffer_id, self.total_len, self.reason, self.table_id) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[8:])
-        return binaryString[12:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 12
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.total_len !=  other.total_len: return False
-        if self.reason !=  other.reason: return False
-        if self.table_id !=  other.table_id: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'total_len: ' + str(self.total_len) + '\n'
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_error_experimenter_msg(object):
-    """Automatically generated Python class for ofp_error_experimenter_msg
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.exp_type = 0
-        self.experimenter = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.exp_type, self.experimenter)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.exp_type, self.experimenter) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.exp_type !=  other.exp_type: return False
-        if self.experimenter !=  other.experimenter: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'exp_type: ' + str(self.exp_type) + '\n'
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        return outstr
-
-
-class ofp_bucket_counter(object):
-    """Automatically generated Python class for ofp_bucket_counter
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.packet_count = 0
-        self.byte_count = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QQ", self.packet_count, self.byte_count)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!QQ'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        return outstr
-
-
-class ofp_port_stats_request(object):
-    """Automatically generated Python class for ofp_port_stats_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        return outstr
-
-
-class ofp_stats_request(object):
-    """Automatically generated Python class for ofp_stats_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.flags = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.flags)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.flags !=  other.flags: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        return outstr
-
-
-class ofp_instruction(object):
-    """Automatically generated Python class for ofp_instruction
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_group_stats_request(object):
-    """Automatically generated Python class for ofp_group_stats_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.group_id = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.group_id)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.group_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.group_id !=  other.group_id: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_experimenter_header(object):
-    """Automatically generated Python class for ofp_experimenter_header
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.experimenter = 0
-        self.exp_type = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LL", self.experimenter, self.exp_type)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.experimenter, self.exp_type) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.experimenter !=  other.experimenter: return False
-        if self.exp_type !=  other.exp_type: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        outstr += prefix + 'exp_type: ' + str(self.exp_type) + '\n'
-        return outstr
-
-
-class ofp_aggregate_stats_request(object):
-    """Automatically generated Python class for ofp_aggregate_stats_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad_asr= [0,0,0]
-        self.out_port = 0
-        self.out_group = 0
-        self.pad_asr2= [0,0,0,0]
-        self.cookie = 0
-        self.cookie_mask = 0
-        self.match = ofp_match()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad_asr, list)):
-            return (False, "self.pad_asr is not list as expected.")
-        if(len(self.pad_asr) != 3):
-            return (False, "self.pad_asr is not of size 3 as expected.")
-        if(not isinstance(self.pad_asr2, list)):
-            return (False, "self.pad_asr2 is not list as expected.")
-        if(len(self.pad_asr2) != 4):
-            return (False, "self.pad_asr2 is not of size 4 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBB", self.pad_asr[0], self.pad_asr[1], self.pad_asr[2])
-        packed += struct.pack("!LL", self.out_port, self.out_group)
-        packed += struct.pack("!BBBB", self.pad_asr2[0], self.pad_asr2[1], self.pad_asr2[2], self.pad_asr2[3])
-        packed += struct.pack("!QQ", self.cookie, self.cookie_mask)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 36):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad_asr[1], self.pad_asr[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.out_port, self.out_group) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad_asr2[1], self.pad_asr2[2], self.pad_asr2[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.cookie_mask) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[32:])
-        return binaryString[36:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 36
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.out_port !=  other.out_port: return False
-        if self.out_group !=  other.out_group: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.cookie !=  other.cookie: return False
-        if self.cookie_mask !=  other.cookie_mask: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        outstr += prefix + 'out_group: ' + str(self.out_group) + '\n'
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'cookie_mask: ' + str(self.cookie_mask) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_queue_get_config_request(object):
-    """Automatically generated Python class for ofp_queue_get_config_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port !=  other.port: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        return outstr
-
-
-class ofp_action_nw_ttl(object):
-    """Automatically generated Python class for ofp_action_nw_ttl
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.nw_ttl = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.nw_ttl)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.nw_ttl) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.nw_ttl !=  other.nw_ttl: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'nw_ttl: ' + str(self.nw_ttl) + '\n'
-        return outstr
-
-
-class ofp_port_status(object):
-    """Automatically generated Python class for ofp_port_status
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.reason = 0
-        self.pad= [0,0,0,0,0,0,0]
-        self.desc = ofp_port()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 7):
-            return (False, "self.pad is not of size 7 as expected.")
-        if(not isinstance(self.desc, ofp_port)):
-            return (False, "self.desc is not class ofp_port as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.reason)
-        packed += struct.pack("!BBBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6])
-        packed += self.desc.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 72):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.reason,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5], self.pad[6]) = struct.unpack(fmt, binaryString[start:end])
-        self.desc.unpack(binaryString[8:])
-        return binaryString[72:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 72
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.reason !=  other.reason: return False
-        if self.pad !=  other.pad: return False
-        if self.desc !=  other.desc: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'desc: \n' 
-        outstr += self.desc.show(prefix + '  ')
-        return outstr
-
-
-class ofp_action_header(object):
-    """Automatically generated Python class for ofp_action_header
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_port_mod(object):
-    """Automatically generated Python class for ofp_port_mod
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-        self.hw_addr= [0,0,0,0,0,0]
-        self.pad2= [0,0]
-        self.config = 0
-        self.mask = 0
-        self.advertise = 0
-        self.pad3= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        if(not isinstance(self.hw_addr, list)):
-            return (False, "self.hw_addr is not list as expected.")
-        if(len(self.hw_addr) != 6):
-            return (False, "self.hw_addr is not of size 6 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 2):
-            return (False, "self.pad2 is not of size 2 as expected.")
-        if(not isinstance(self.pad3, list)):
-            return (False, "self.pad3 is not list as expected.")
-        if(len(self.pad3) != 4):
-            return (False, "self.pad3 is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!BBBBBB", self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5])
-        packed += struct.pack("!BB", self.pad2[0], self.pad2[1])
-        packed += struct.pack("!LLL", self.config, self.mask, self.advertise)
-        packed += struct.pack("!BBBB", self.pad3[0], self.pad3[1], self.pad3[2], self.pad3[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 32):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 14
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LLL'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.config, self.mask, self.advertise) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 28
-        end = start + struct.calcsize(fmt)
-        (self.pad3[0], self.pad3[1], self.pad3[2], self.pad3[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[32:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 32
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.hw_addr !=  other.hw_addr: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.config !=  other.config: return False
-        if self.mask !=  other.mask: return False
-        if self.advertise !=  other.advertise: return False
-        if self.pad3 !=  other.pad3: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'hw_addr: ' + str(self.hw_addr) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'mask: ' + str(self.mask) + '\n'
-        outstr += prefix + 'advertise: ' + str(self.advertise) + '\n'
-        return outstr
-
-
-class ofp_action_output(object):
-    """Automatically generated Python class for ofp_action_output
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.port = 0
-        self.max_len = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHLH", self.type, self.len, self.port, self.max_len)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!HHLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.port, self.max_len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.port !=  other.port: return False
-        if self.max_len !=  other.max_len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        outstr += prefix + 'max_len: ' + str(self.max_len) + '\n'
-        return outstr
-
-
-class ofp_switch_config(object):
-    """Automatically generated Python class for ofp_switch_config
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.flags = 0
-        self.miss_send_len = 128
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.flags, self.miss_send_len)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.flags, self.miss_send_len) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.flags !=  other.flags: return False
-        if self.miss_send_len !=  other.miss_send_len: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        outstr += prefix + 'miss_send_len: ' + str(self.miss_send_len) + '\n'
-        return outstr
-
-
-class ofp_queue_prop_experimenter(object):
-    """Automatically generated Python class for ofp_queue_prop_experimenter
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.prop_header = ofp_queue_prop_header()
-        self.experimenter = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.prop_header, ofp_queue_prop_header)):
-            return (False, "self.prop_header is not class ofp_queue_prop_header as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.prop_header.pack()
-        packed += struct.pack("!L", self.experimenter)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        self.prop_header.unpack(binaryString[0:])
-        fmt = '!L'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.experimenter,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.prop_header !=  other.prop_header: return False
-        if self.experimenter !=  other.experimenter: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'prop_header: \n' 
-        outstr += self.prop_header.show(prefix + '  ')
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        return outstr
-
-
-class ofp_instruction_write_metadata(object):
-    """Automatically generated Python class for ofp_instruction_write_metadata
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-        self.metadata = 0
-        self.metadata_mask = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!QQ", self.metadata, self.metadata_mask)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.metadata, self.metadata_mask) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        if self.metadata !=  other.metadata: return False
-        if self.metadata_mask !=  other.metadata_mask: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'metadata: ' + str(self.metadata) + '\n'
-        outstr += prefix + 'metadata_mask: ' + str(self.metadata_mask) + '\n'
-        return outstr
-
-
-class ofp_action_experimenter_header(object):
-    """Automatically generated Python class for ofp_action_experimenter_header
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.experimenter = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.experimenter)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.experimenter) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.experimenter !=  other.experimenter: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        return outstr
-
-
-class ofp_queue_get_config_reply(object):
-    """Automatically generated Python class for ofp_queue_get_config_reply
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port !=  other.port: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        return outstr
-
-
-class ofp_oxm_experimenter_header(object):
-    """Automatically generated Python class for ofp_oxm_experimenter_header
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.oxm_header = 0
-        self.experimenter = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LL", self.oxm_header, self.experimenter)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.oxm_header, self.experimenter) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.oxm_header !=  other.oxm_header: return False
-        if self.experimenter !=  other.experimenter: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'oxm_header: ' + str(self.oxm_header) + '\n'
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        return outstr
-
-
-class ofp_action_set_queue(object):
-    """Automatically generated Python class for ofp_action_set_queue
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.queue_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.queue_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.queue_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.queue_id !=  other.queue_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        return outstr
-
-
-class ofp_action_set_field(object):
-    """Automatically generated Python class for ofp_action_set_field
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.field= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.field, list)):
-            return (False, "self.field is not list as expected.")
-        if(len(self.field) != 4):
-            return (False, "self.field is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.len)
-        packed += struct.pack("!BBBB", self.field[0], self.field[1], self.field[2], self.field[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.field[0], self.field[1], self.field[2], self.field[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.field !=  other.field: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'field: ' + str(self.field) + '\n'
-        return outstr
-
-
-class ofp_flow_stats(object):
-    """Automatically generated Python class for ofp_flow_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.length = 0
-        self.table_id = 0
-        self.pad = 0
-        self.duration_sec = 0
-        self.duration_nsec = 0
-        self.priority = 0x8000
-        self.idle_timeout = 0
-        self.hard_timeout = 0
-        self.pad2= [0,0,0,0,0,0]
-        self.cookie = 0
-        self.packet_count = 0
-        self.byte_count = 0
-        self.match = ofp_match()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 6):
-            return (False, "self.pad2 is not of size 6 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HBBLLHHH", self.length, self.table_id, self.pad, self.duration_sec, self.duration_nsec, self.priority, self.idle_timeout, self.hard_timeout)
-        packed += struct.pack("!BBBBBB", self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3], self.pad2[4], self.pad2[5])
-        packed += struct.pack("!QQQ", self.cookie, self.packet_count, self.byte_count)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 52):
-            return binaryString
-        fmt = '!HBBLLHHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.length, self.table_id, self.pad, self.duration_sec, self.duration_nsec, self.priority, self.idle_timeout, self.hard_timeout) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 18
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1], self.pad2[2], self.pad2[3], self.pad2[4], self.pad2[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQQ'
-        start = 24
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[48:])
-        return binaryString[52:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 52
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.length !=  other.length: return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        if self.duration_sec !=  other.duration_sec: return False
-        if self.duration_nsec !=  other.duration_nsec: return False
-        if self.priority !=  other.priority: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.hard_timeout !=  other.hard_timeout: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.cookie !=  other.cookie: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'duration_sec: ' + str(self.duration_sec) + '\n'
-        outstr += prefix + 'duration_nsec: ' + str(self.duration_nsec) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'hard_timeout: ' + str(self.hard_timeout) + '\n'
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_flow_removed(object):
-    """Automatically generated Python class for ofp_flow_removed
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.cookie = 0
-        self.priority = 0
-        self.reason = 0
-        self.table_id = 0
-        self.duration_sec = 0
-        self.duration_nsec = 0
-        self.idle_timeout = 0
-        self.hard_timeout = 0
-        self.packet_count = 0
-        self.byte_count = 0
-        self.match = ofp_match()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QHBBLLHHQQ", self.cookie, self.priority, self.reason, self.table_id, self.duration_sec, self.duration_nsec, self.idle_timeout, self.hard_timeout, self.packet_count, self.byte_count)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 44):
-            return binaryString
-        fmt = '!QHBBLLHHQQ'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.priority, self.reason, self.table_id, self.duration_sec, self.duration_nsec, self.idle_timeout, self.hard_timeout, self.packet_count, self.byte_count) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[40:])
-        return binaryString[44:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 44
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.cookie !=  other.cookie: return False
-        if self.priority !=  other.priority: return False
-        if self.reason !=  other.reason: return False
-        if self.table_id !=  other.table_id: return False
-        if self.duration_sec !=  other.duration_sec: return False
-        if self.duration_nsec !=  other.duration_nsec: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.hard_timeout !=  other.hard_timeout: return False
-        if self.packet_count !=  other.packet_count: return False
-        if self.byte_count !=  other.byte_count: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'reason: ' + str(self.reason) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'duration_sec: ' + str(self.duration_sec) + '\n'
-        outstr += prefix + 'duration_nsec: ' + str(self.duration_nsec) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'hard_timeout: ' + str(self.hard_timeout) + '\n'
-        outstr += prefix + 'packet_count: ' + str(self.packet_count) + '\n'
-        outstr += prefix + 'byte_count: ' + str(self.byte_count) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_queue_prop_min_rate(object):
-    """Automatically generated Python class for ofp_queue_prop_min_rate
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.prop_header = ofp_queue_prop_header()
-        self.rate = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.prop_header, ofp_queue_prop_header)):
-            return (False, "self.prop_header is not class ofp_queue_prop_header as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.prop_header.pack()
-        packed += struct.pack("!H", self.rate)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        self.prop_header.unpack(binaryString[0:])
-        fmt = '!H'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.rate,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.prop_header !=  other.prop_header: return False
-        if self.rate !=  other.rate: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'prop_header: \n' 
-        outstr += self.prop_header.show(prefix + '  ')
-        outstr += prefix + 'rate: ' + str(self.rate) + '\n'
-        return outstr
-
-
-class ofp_header(object):
-    """Automatically generated Python class for ofp_header
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.version = 0x03
-        self.type = 0
-        self.length = 0
-        self.xid = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if (not (self.type in ofp_type_map.keys())):
-            return (False, "type must have values from ofp_type_map.keys()")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!BBHL", self.version, self.type, self.length, self.xid)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!BBHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.version, self.type, self.length, self.xid) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.version !=  other.version: return False
-        if self.type !=  other.type: return False
-        if self.length !=  other.length: return False
-        if self.xid !=  other.xid: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'version: ' + str(self.version) + '\n'
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'xid: ' + str(self.xid) + '\n'
-        return outstr
-
-
-class ofp_stats_reply(object):
-    """Automatically generated Python class for ofp_stats_reply
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.flags = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.flags)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.flags !=  other.flags: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        return outstr
-
-
-class ofp_queue_stats_request(object):
-    """Automatically generated Python class for ofp_queue_stats_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.queue_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LL", self.port_no, self.queue_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no, self.queue_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.queue_id !=  other.queue_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        return outstr
-
-
-class ofp_group_features_stats(object):
-    """Automatically generated Python class for ofp_group_features_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.types = 0
-        self.capabilities = 0
-        self.max_groups= [0,0,0,0]
-        self.actions= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.max_groups, list)):
-            return (False, "self.max_groups is not list as expected.")
-        if(len(self.max_groups) != 4):
-            return (False, "self.max_groups is not of size 4 as expected.")
-        if(not isinstance(self.actions, list)):
-            return (False, "self.actions is not list as expected.")
-        if(len(self.actions) != 4):
-            return (False, "self.actions is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LL", self.types, self.capabilities)
-        packed += struct.pack("!LLLL", self.max_groups[0], self.max_groups[1], self.max_groups[2], self.max_groups[3])
-        packed += struct.pack("!LLLL", self.actions[0], self.actions[1], self.actions[2], self.actions[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 40):
-            return binaryString
-        fmt = '!LL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.types, self.capabilities) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!LLLL'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.max_groups[0], self.max_groups[1], self.max_groups[2], self.max_groups[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LLLL'
-        start = 24
-        end = start + struct.calcsize(fmt)
-        (self.actions[0], self.actions[1], self.actions[2], self.actions[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[40:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 40
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.types !=  other.types: return False
-        if self.capabilities !=  other.capabilities: return False
-        if self.max_groups !=  other.max_groups: return False
-        if self.actions !=  other.actions: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'types: ' + str(self.types) + '\n'
-        outstr += prefix + 'capabilities: ' + str(self.capabilities) + '\n'
-        outstr += prefix + 'max_groups: ' + str(self.max_groups) + '\n'
-        outstr += prefix + 'actions: ' + str(self.actions) + '\n'
-        return outstr
-
-
-class ofp_group_mod(object):
-    """Automatically generated Python class for ofp_group_mod
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.command = 0
-        self.type = 0
-        self.pad = 0
-        self.group_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HBBL", self.command, self.type, self.pad, self.group_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HBBL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.command, self.type, self.pad, self.group_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.command !=  other.command: return False
-        if self.type !=  other.type: return False
-        if self.pad !=  other.pad: return False
-        if self.group_id !=  other.group_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'command: ' + str(self.command) + '\n'
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_port_stats(object):
-    """Automatically generated Python class for ofp_port_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-        self.rx_packets = 0
-        self.tx_packets = 0
-        self.rx_bytes = 0
-        self.tx_bytes = 0
-        self.rx_dropped = 0
-        self.tx_dropped = 0
-        self.rx_errors = 0
-        self.tx_errors = 0
-        self.rx_frame_err = 0
-        self.rx_over_err = 0
-        self.rx_crc_err = 0
-        self.collisions = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!QQQQQQQQQQQQ", self.rx_packets, self.tx_packets, self.rx_bytes, self.tx_bytes, self.rx_dropped, self.tx_dropped, self.rx_errors, self.tx_errors, self.rx_frame_err, self.rx_over_err, self.rx_crc_err, self.collisions)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 104):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQQQQQQQQQQQ'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.rx_packets, self.tx_packets, self.rx_bytes, self.tx_bytes, self.rx_dropped, self.tx_dropped, self.rx_errors, self.tx_errors, self.rx_frame_err, self.rx_over_err, self.rx_crc_err, self.collisions) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[104:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 104
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.rx_packets !=  other.rx_packets: return False
-        if self.tx_packets !=  other.tx_packets: return False
-        if self.rx_bytes !=  other.rx_bytes: return False
-        if self.tx_bytes !=  other.tx_bytes: return False
-        if self.rx_dropped !=  other.rx_dropped: return False
-        if self.tx_dropped !=  other.tx_dropped: return False
-        if self.rx_errors !=  other.rx_errors: return False
-        if self.tx_errors !=  other.tx_errors: return False
-        if self.rx_frame_err !=  other.rx_frame_err: return False
-        if self.rx_over_err !=  other.rx_over_err: return False
-        if self.rx_crc_err !=  other.rx_crc_err: return False
-        if self.collisions !=  other.collisions: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'rx_packets: ' + str(self.rx_packets) + '\n'
-        outstr += prefix + 'tx_packets: ' + str(self.tx_packets) + '\n'
-        outstr += prefix + 'rx_bytes: ' + str(self.rx_bytes) + '\n'
-        outstr += prefix + 'tx_bytes: ' + str(self.tx_bytes) + '\n'
-        outstr += prefix + 'rx_dropped: ' + str(self.rx_dropped) + '\n'
-        outstr += prefix + 'tx_dropped: ' + str(self.tx_dropped) + '\n'
-        outstr += prefix + 'rx_errors: ' + str(self.rx_errors) + '\n'
-        outstr += prefix + 'tx_errors: ' + str(self.tx_errors) + '\n'
-        outstr += prefix + 'rx_frame_err: ' + str(self.rx_frame_err) + '\n'
-        outstr += prefix + 'rx_over_err: ' + str(self.rx_over_err) + '\n'
-        outstr += prefix + 'rx_crc_err: ' + str(self.rx_crc_err) + '\n'
-        outstr += prefix + 'collisions: ' + str(self.collisions) + '\n'
-        return outstr
-
-
-class ofp_packet_queue(object):
-    """Automatically generated Python class for ofp_packet_queue
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.queue_id = 0
-        self.port = 0
-        self.len = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LLH", self.queue_id, self.port, self.len)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!LLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.queue_id, self.port, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.queue_id !=  other.queue_id: return False
-        if self.port !=  other.port: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'queue_id: ' + str(self.queue_id) + '\n'
-        outstr += prefix + 'port: ' + str(self.port) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_port(object):
-    """Automatically generated Python class for ofp_port
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.port_no = 0
-        self.pad= [0,0,0,0]
-        self.hw_addr= [0,0,0,0,0,0]
-        self.pad2= [0,0]
-        self.name= ""
-        self.config = 0
-        self.state = 0
-        self.curr = 0
-        self.advertised = 0
-        self.supported = 0
-        self.peer = 0
-        self.curr_speed = 0
-        self.max_speed = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        if(not isinstance(self.hw_addr, list)):
-            return (False, "self.hw_addr is not list as expected.")
-        if(len(self.hw_addr) != 6):
-            return (False, "self.hw_addr is not of size 6 as expected.")
-        if(not isinstance(self.pad2, list)):
-            return (False, "self.pad2 is not list as expected.")
-        if(len(self.pad2) != 2):
-            return (False, "self.pad2 is not of size 2 as expected.")
-        if(not isinstance(self.name, str)):
-            return (False, "self.name is not string as expected.")
-        if(len(self.name) > 16):
-            return (False, "self.name is not of size 16 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!L", self.port_no)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        packed += struct.pack("!BBBBBB", self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5])
-        packed += struct.pack("!BB", self.pad2[0], self.pad2[1])
-        packed += self.name.ljust(16,'\0')
-        packed += struct.pack("!LLLLLLLL", self.config, self.state, self.curr, self.advertised, self.supported, self.peer, self.curr_speed, self.max_speed)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 64):
-            return binaryString
-        fmt = '!L'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.port_no,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.hw_addr[0], self.hw_addr[1], self.hw_addr[2], self.hw_addr[3], self.hw_addr[4], self.hw_addr[5]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BB'
-        start = 14
-        end = start + struct.calcsize(fmt)
-        (self.pad2[0], self.pad2[1]) = struct.unpack(fmt, binaryString[start:end])
-        self.name = binaryString[16:32].replace("\0","")
-        fmt = '!LLLLLLLL'
-        start = 32
-        end = start + struct.calcsize(fmt)
-        (self.config, self.state, self.curr, self.advertised, self.supported, self.peer, self.curr_speed, self.max_speed) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[64:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 64
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.port_no !=  other.port_no: return False
-        if self.pad !=  other.pad: return False
-        if self.hw_addr !=  other.hw_addr: return False
-        if self.pad2 !=  other.pad2: return False
-        if self.name !=  other.name: return False
-        if self.config !=  other.config: return False
-        if self.state !=  other.state: return False
-        if self.curr !=  other.curr: return False
-        if self.advertised !=  other.advertised: return False
-        if self.supported !=  other.supported: return False
-        if self.peer !=  other.peer: return False
-        if self.curr_speed !=  other.curr_speed: return False
-        if self.max_speed !=  other.max_speed: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'port_no: ' + str(self.port_no) + '\n'
-        outstr += prefix + 'hw_addr: ' + str(self.hw_addr) + '\n'
-        outstr += prefix + 'name: ' + str(self.name) + '\n'
-        outstr += prefix + 'config: ' + str(self.config) + '\n'
-        outstr += prefix + 'state: ' + str(self.state) + '\n'
-        outstr += prefix + 'curr: ' + str(self.curr) + '\n'
-        outstr += prefix + 'advertised: ' + str(self.advertised) + '\n'
-        outstr += prefix + 'supported: ' + str(self.supported) + '\n'
-        outstr += prefix + 'peer: ' + str(self.peer) + '\n'
-        outstr += prefix + 'curr_speed: ' + str(self.curr_speed) + '\n'
-        outstr += prefix + 'max_speed: ' + str(self.max_speed) + '\n'
-        return outstr
-
-
-class ofp_switch_features(object):
-    """Automatically generated Python class for ofp_switch_features
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.datapath_id = 0
-        self.n_buffers = 0
-        self.n_tables = 0
-        self.pad= [0,0,0]
-        self.capabilities = 0
-        self.reserved = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QLB", self.datapath_id, self.n_buffers, self.n_tables)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        packed += struct.pack("!LL", self.capabilities, self.reserved)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 24):
-            return binaryString
-        fmt = '!QLB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.datapath_id, self.n_buffers, self.n_tables) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 13
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.capabilities, self.reserved) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[24:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 24
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.datapath_id !=  other.datapath_id: return False
-        if self.n_buffers !=  other.n_buffers: return False
-        if self.n_tables !=  other.n_tables: return False
-        if self.pad !=  other.pad: return False
-        if self.capabilities !=  other.capabilities: return False
-        if self.reserved !=  other.reserved: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'datapath_id: ' + str(self.datapath_id) + '\n'
-        outstr += prefix + 'n_buffers: ' + str(self.n_buffers) + '\n'
-        outstr += prefix + 'n_tables: ' + str(self.n_tables) + '\n'
-        outstr += prefix + 'capabilities: ' + str(self.capabilities) + '\n'
-        outstr += prefix + 'reserved: ' + str(self.reserved) + '\n'
-        return outstr
-
-
-class ofp_queue_prop_header(object):
-    """Automatically generated Python class for ofp_queue_prop_header
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.property = 0
-        self.len = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.property, self.len)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.property, self.len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.property !=  other.property: return False
-        if self.len !=  other.len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'property: ' + str(self.property) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        return outstr
-
-
-class ofp_flow_stats_request(object):
-    """Automatically generated Python class for ofp_flow_stats_request
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.table_id = 0
-        self.pad_fstat= [0,0,0]
-        self.out_port = 0
-        self.out_group = 0
-        self.pad_fstat2= [0,0,0,0]
-        self.cookie = 0
-        self.cookie_mask = 0
-        self.match = ofp_match()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad_fstat is not list as expected.")
-        if(len(self.pad_fstat) != 3):
-            return (False, "self.pad_fstat is not of size 3 as expected.")
-        if(not isinstance(self.pad_fstat2, list)):
-            return (False, "self.pad_fstat2 is not list as expected.")
-        if(len(self.pad_fstat2) != 4):
-            return (False, "self.pad_ftsat2 is not of size 4 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!B", self.table_id)
-        packed += struct.pack("!BBB", self.pad_fstat[0], self.pad_fstat[1], self.pad_fstat[2])
-        packed += struct.pack("!LL", self.out_port, self.out_group)
-        packed += struct.pack("!BBBB", self.pad_fstat2[0], self.pad_fstat2[1], self.pad_fstat2[2], self.pad_fstat2[3])
-        packed += struct.pack("!QQ", self.cookie, self.cookie_mask)
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 36):
-            return binaryString
-        fmt = '!B'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.table_id,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBB'
-        start = 1
-        end = start + struct.calcsize(fmt)
-        (self.pad_fstat[0], self.pad_fstat[1], self.pad_fstat[2]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!LL'
-        start = 4
-        end = start + struct.calcsize(fmt)
-        (self.out_port, self.out_group) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad_fstat2[0], self.pad_fstat2[1], self.pad_fstat2[2], self.pad_fstat2[3]) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!QQ'
-        start = 16
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.cookie_mask) = struct.unpack(fmt,  binaryString[start:end])
-        self.match.unpack(binaryString[32:])
-        return binaryString[36:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 36
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad_fstat !=  other.pad_fstat: return False
-        if self.out_port !=  other.out_port: return False
-        if self.out_group !=  other.out_group: return False
-        if self.pad_fstat2 !=  other.pad_fstat2: return False
-        if self.cookie !=  other.cookie: return False
-        if self.cookie_mask !=  other.cookie_mask: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        outstr += prefix + 'out_group: ' + str(self.out_group) + '\n'
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'cookie_mask: ' + str(self.cookie_mask) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_bucket(object):
-    """Automatically generated Python class for ofp_bucket
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.len = 0
-        self.weight = 0
-        self.watch_port = 0
-        self.watch_group = 0
-        self.pad= [0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 4):
-            return (False, "self.pad is not of size 4 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHLL", self.len, self.weight, self.watch_port, self.watch_group)
-        packed += struct.pack("!BBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!HHLL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.len, self.weight, self.watch_port, self.watch_group) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBB'
-        start = 12
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.len !=  other.len: return False
-        if self.weight !=  other.weight: return False
-        if self.watch_port !=  other.watch_port: return False
-        if self.watch_group !=  other.watch_group: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'weight: ' + str(self.weight) + '\n'
-        outstr += prefix + 'watch_port: ' + str(self.watch_port) + '\n'
-        outstr += prefix + 'watch_group: ' + str(self.watch_group) + '\n'
-        return outstr
-
-
-class ofp_action_pop_mpls(object):
-    """Automatically generated Python class for ofp_action_pop_mpls
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.ethertype = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.ethertype)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.ethertype) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.ethertype !=  other.ethertype: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'ethertype: ' + str(self.ethertype) + '\n'
-        return outstr
-
-
-class ofp_match(object):
-    """Automatically generated Python class for ofp_match
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = OFPMT_OXM
-        #exclude padding bytes
-        self.length = OFP_MATCH_BYTES 
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.length)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.length) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.length !=  other.length: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        return outstr
-
-
-class ofp_flow_mod(object):
-    """Automatically generated Python class for ofp_flow_mod
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.cookie = 0
-        self.cookie_mask = 0
-        self.table_id = 0
-        self.command = 0
-        self.idle_timeout = 0
-        self.hard_timeout = 0
-        self.priority = 0x8000
-        self.buffer_id = 0
-        self.out_port = 0
-        self.out_group = 0
-        self.flags = 0
-        self.pad= [0,0]
-        self.match = ofp_match()
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        if(not isinstance(self.match, ofp_match)):
-            return (False, "self.match is not class ofp_match as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!QQBBHHHLLLH", self.cookie, self.cookie_mask, self.table_id, self.command, self.idle_timeout, self.hard_timeout, self.priority, self.buffer_id, self.out_port, self.out_group, self.flags)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        packed += self.match.pack()
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 44):
-            return binaryString
-        fmt = '!QQBBHHHLLLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.cookie, self.cookie_mask, self.table_id, self.command, self.idle_timeout, self.hard_timeout, self.priority, self.buffer_id, self.out_port, self.out_group, self.flags) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 38
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        self.match.unpack(binaryString[40:])
-        return binaryString[44:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 44
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.cookie !=  other.cookie: return False
-        if self.cookie_mask !=  other.cookie_mask: return False
-        if self.table_id !=  other.table_id: return False
-        if self.command !=  other.command: return False
-        if self.idle_timeout !=  other.idle_timeout: return False
-        if self.hard_timeout !=  other.hard_timeout: return False
-        if self.priority !=  other.priority: return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.out_port !=  other.out_port: return False
-        if self.out_group !=  other.out_group: return False
-        if self.flags !=  other.flags: return False
-        if self.pad !=  other.pad: return False
-        if self.match !=  other.match: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'cookie: ' + str(self.cookie) + '\n'
-        outstr += prefix + 'cookie_mask: ' + str(self.cookie_mask) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        outstr += prefix + 'command: ' + str(self.command) + '\n'
-        outstr += prefix + 'idle_timeout: ' + str(self.idle_timeout) + '\n'
-        outstr += prefix + 'hard_timeout: ' + str(self.hard_timeout) + '\n'
-        outstr += prefix + 'priority: ' + str(self.priority) + '\n'
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'out_port: ' + str(self.out_port) + '\n'
-        outstr += prefix + 'out_group: ' + str(self.out_group) + '\n'
-        outstr += prefix + 'flags: ' + str(self.flags) + '\n'
-        outstr += prefix + 'match: \n' 
-        outstr += self.match.show(prefix + '  ')
-        return outstr
-
-
-class ofp_packet_out(object):
-    """Automatically generated Python class for ofp_packet_out
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.buffer_id = 4294967295
-        self.in_port = 0
-        self.actions_len = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LLH", self.buffer_id, self.in_port, self.actions_len)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        fmt = '!LLH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.buffer_id, self.in_port, self.actions_len) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.buffer_id !=  other.buffer_id: return False
-        if self.in_port !=  other.in_port: return False
-        if self.actions_len !=  other.actions_len: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'buffer_id: ' + str(self.buffer_id) + '\n'
-        outstr += prefix + 'in_port: ' + str(self.in_port) + '\n'
-        outstr += prefix + 'actions_len: ' + str(self.actions_len) + '\n'
-        return outstr
-
-
-class ofp_instruction_goto_table(object):
-    """Automatically generated Python class for ofp_instruction_goto_table
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.table_id = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.table_id)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.table_id) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.table_id !=  other.table_id: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'table_id: ' + str(self.table_id) + '\n'
-        return outstr
-
-
-class ofp_queue_prop_max_rate(object):
-    """Automatically generated Python class for ofp_queue_prop_max_rate
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.prop_header = ofp_queue_prop_header()
-        self.rate = 0
-        self.pad= [0,0,0,0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.prop_header, ofp_queue_prop_header)):
-            return (False, "self.prop_header is not class ofp_queue_prop_header as expected.")
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 6):
-            return (False, "self.pad is not of size 6 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.prop_header.pack()
-        packed += struct.pack("!H", self.rate)
-        packed += struct.pack("!BBBBBB", self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 16):
-            return binaryString
-        self.prop_header.unpack(binaryString[0:])
-        fmt = '!H'
-        start = 8
-        end = start + struct.calcsize(fmt)
-        (self.rate,) = struct.unpack(fmt, binaryString[start:end])
-        fmt = '!BBBBBB'
-        start = 10
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2], self.pad[3], self.pad[4], self.pad[5]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[16:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 16
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.prop_header !=  other.prop_header: return False
-        if self.rate !=  other.rate: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'prop_header: \n' 
-        outstr += self.prop_header.show(prefix + '  ')
-        outstr += prefix + 'rate: ' + str(self.rate) + '\n'
-        return outstr
-
-
-class ofp_experimenter_stats_header(object):
-    """Automatically generated Python class for ofp_experimenter_stats_header
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.experimenter = 0
-        self.exp_type = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!LL", self.experimenter, self.exp_type)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!LL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.experimenter, self.exp_type) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.experimenter !=  other.experimenter: return False
-        if self.exp_type !=  other.exp_type: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'experimenter: ' + str(self.experimenter) + '\n'
-        outstr += prefix + 'exp_type: ' + str(self.exp_type) + '\n'
-        return outstr
-
-
-class ofp_action_group(object):
-    """Automatically generated Python class for ofp_action_group
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.group_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHL", self.type, self.len, self.group_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.group_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.group_id !=  other.group_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_desc_stats(object):
-    """Automatically generated Python class for ofp_desc_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.mfr_desc= ""
-        self.hw_desc= ""
-        self.sw_desc= ""
-        self.serial_num= ""
-        self.dp_desc= ""
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.mfr_desc, str)):
-            return (False, "self.mfr_desc is not string as expected.")
-        if(len(self.mfr_desc) > 256):
-            return (False, "self.mfr_desc is not of size 256 as expected.")
-        if(not isinstance(self.hw_desc, str)):
-            return (False, "self.hw_desc is not string as expected.")
-        if(len(self.hw_desc) > 256):
-            return (False, "self.hw_desc is not of size 256 as expected.")
-        if(not isinstance(self.sw_desc, str)):
-            return (False, "self.sw_desc is not string as expected.")
-        if(len(self.sw_desc) > 256):
-            return (False, "self.sw_desc is not of size 256 as expected.")
-        if(not isinstance(self.serial_num, str)):
-            return (False, "self.serial_num is not string as expected.")
-        if(len(self.serial_num) > 32):
-            return (False, "self.serial_num is not of size 32 as expected.")
-        if(not isinstance(self.dp_desc, str)):
-            return (False, "self.dp_desc is not string as expected.")
-        if(len(self.dp_desc) > 256):
-            return (False, "self.dp_desc is not of size 256 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += self.mfr_desc.ljust(256,'\0')
-        packed += self.hw_desc.ljust(256,'\0')
-        packed += self.sw_desc.ljust(256,'\0')
-        packed += self.serial_num.ljust(32,'\0')
-        packed += self.dp_desc.ljust(256,'\0')
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 1056):
-            return binaryString
-        self.mfr_desc = binaryString[0:256].replace("\0","")
-        self.hw_desc = binaryString[256:512].replace("\0","")
-        self.sw_desc = binaryString[512:768].replace("\0","")
-        self.serial_num = binaryString[768:800].replace("\0","")
-        self.dp_desc = binaryString[800:1056].replace("\0","")
-        return binaryString[1056:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 1056
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.mfr_desc !=  other.mfr_desc: return False
-        if self.hw_desc !=  other.hw_desc: return False
-        if self.sw_desc !=  other.sw_desc: return False
-        if self.serial_num !=  other.serial_num: return False
-        if self.dp_desc !=  other.dp_desc: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'mfr_desc: ' + str(self.mfr_desc) + '\n'
-        outstr += prefix + 'hw_desc: ' + str(self.hw_desc) + '\n'
-        outstr += prefix + 'sw_desc: ' + str(self.sw_desc) + '\n'
-        outstr += prefix + 'serial_num: ' + str(self.serial_num) + '\n'
-        outstr += prefix + 'dp_desc: ' + str(self.dp_desc) + '\n'
-        return outstr
-
-
-class ofp_action_push(object):
-    """Automatically generated Python class for ofp_action_push
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.ethertype = 0
-        self.pad= [0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 2):
-            return (False, "self.pad is not of size 2 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHH", self.type, self.len, self.ethertype)
-        packed += struct.pack("!BB", self.pad[0], self.pad[1])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.ethertype) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BB'
-        start = 6
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.ethertype !=  other.ethertype: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'ethertype: ' + str(self.ethertype) + '\n'
-        return outstr
-
-
-class ofp_group_desc_stats(object):
-    """Automatically generated Python class for ofp_group_desc_stats
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.length = 0
-        self.type = 0
-        self.pad = 0
-        self.group_id = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HBBL", self.length, self.type, self.pad, self.group_id)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HBBL'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.length, self.type, self.pad, self.group_id) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.length !=  other.length: return False
-        if self.type !=  other.type: return False
-        if self.pad !=  other.pad: return False
-        if self.group_id !=  other.group_id: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'length: ' + str(self.length) + '\n'
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'group_id: ' + str(self.group_id) + '\n'
-        return outstr
-
-
-class ofp_error_msg(object):
-    """Automatically generated Python class for ofp_error_msg
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.code = 0
-
-    def __assert(self):
-        """Sanity check
-        """
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HH", self.type, self.code)
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 4):
-            return binaryString
-        fmt = '!HH'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.code) = struct.unpack(fmt,  binaryString[start:end])
-        return binaryString[4:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 4
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.code !=  other.code: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'code: ' + str(self.code) + '\n'
-        return outstr
-
-
-class ofp_action_mpls_ttl(object):
-    """Automatically generated Python class for ofp_action_mpls_ttl
-
-    Date 2012-06-25
-    Created by of.pythonize.pythonizer
-    Core structure: Messages do not include ofp_header
-    Does not include var-length arrays
-    """
-    def __init__(self):
-        """Initialize
-        Declare members and default values
-        """
-        self.type = 0
-        self.len = 0
-        self.mpls_ttl = 0
-        self.pad= [0,0,0]
-
-    def __assert(self):
-        """Sanity check
-        """
-        if(not isinstance(self.pad, list)):
-            return (False, "self.pad is not list as expected.")
-        if(len(self.pad) != 3):
-            return (False, "self.pad is not of size 3 as expected.")
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        """Pack message
-        Packs empty array used as placeholder
-        """
-        if(assertstruct):
-            if(not self.__assert()[0]):
-                return None
-        packed = ""
-        packed += struct.pack("!HHB", self.type, self.len, self.mpls_ttl)
-        packed += struct.pack("!BBB", self.pad[0], self.pad[1], self.pad[2])
-        return packed
-
-    def unpack(self, binaryString):
-        """Unpack message
-        Do not unpack empty array used as placeholder
-        since they can contain heterogeneous type
-        """
-        if (len(binaryString) < 8):
-            return binaryString
-        fmt = '!HHB'
-        start = 0
-        end = start + struct.calcsize(fmt)
-        (self.type, self.len, self.mpls_ttl) = struct.unpack(fmt,  binaryString[start:end])
-        fmt = '!BBB'
-        start = 5
-        end = start + struct.calcsize(fmt)
-        (self.pad[0], self.pad[1], self.pad[2]) = struct.unpack(fmt, binaryString[start:end])
-        return binaryString[8:]
-
-    def __len__(self):
-        """Return length of message
-        """
-        l = 8
-        return l
-
-    def __eq__(self, other):
-        """Return True if self and other have same values
-        """
-        if type(self) != type(other): return False
-        if self.type !=  other.type: return False
-        if self.len !=  other.len: return False
-        if self.mpls_ttl !=  other.mpls_ttl: return False
-        if self.pad !=  other.pad: return False
-        return True
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-    def show(self, prefix=''):
-        """Generate string showing basic members of structure
-        """
-        outstr = ''
-        outstr += prefix + 'type: ' + str(self.type) + '\n'
-        outstr += prefix + 'len: ' + str(self.len) + '\n'
-        outstr += prefix + 'mpls_ttl: ' + str(self.mpls_ttl) + '\n'
-        return outstr
-
-
-# Enumerated type definitions
-ofp_error_type = ['OFPET_HELLO_FAILED', 'OFPET_BAD_REQUEST', 'OFPET_BAD_ACTION', 'OFPET_BAD_INSTRUCTION', 'OFPET_BAD_MATCH', 'OFPET_FLOW_MOD_FAILED', 'OFPET_GROUP_MOD_FAILED', 'OFPET_PORT_MOD_FAILED', 'OFPET_TABLE_MOD_FAILED', 'OFPET_QUEUE_OP_FAILED', 'OFPET_SWITCH_CONFIG_FAILED', 'OFPET_ROLE_REQUEST_FAILED', 'OFPET_EXPERIMENTER']
-OFPET_HELLO_FAILED                  = 0
-OFPET_BAD_REQUEST                   = 1
-OFPET_BAD_ACTION                    = 2
-OFPET_BAD_INSTRUCTION               = 3
-OFPET_BAD_MATCH                     = 4
-OFPET_FLOW_MOD_FAILED               = 5
-OFPET_GROUP_MOD_FAILED              = 6
-OFPET_PORT_MOD_FAILED               = 7
-OFPET_TABLE_MOD_FAILED              = 8
-OFPET_QUEUE_OP_FAILED               = 9
-OFPET_SWITCH_CONFIG_FAILED          = 10
-OFPET_ROLE_REQUEST_FAILED           = 11
-OFPET_EXPERIMENTER                  = 65535
-ofp_error_type_map = {
-    0                               : 'OFPET_HELLO_FAILED',
-    1                               : 'OFPET_BAD_REQUEST',
-    2                               : 'OFPET_BAD_ACTION',
-    3                               : 'OFPET_BAD_INSTRUCTION',
-    4                               : 'OFPET_BAD_MATCH',
-    5                               : 'OFPET_FLOW_MOD_FAILED',
-    6                               : 'OFPET_GROUP_MOD_FAILED',
-    7                               : 'OFPET_PORT_MOD_FAILED',
-    8                               : 'OFPET_TABLE_MOD_FAILED',
-    9                               : 'OFPET_QUEUE_OP_FAILED',
-    10                              : 'OFPET_SWITCH_CONFIG_FAILED',
-    11                              : 'OFPET_ROLE_REQUEST_FAILED',
-    65535                           : 'OFPET_EXPERIMENTER'
-}
-
-ofp_flow_mod_flags = ['OFPFF_SEND_FLOW_REM', 'OFPFF_CHECK_OVERLAP', 'OFPFF_RESET_COUNTS']
-OFPFF_SEND_FLOW_REM                 = 1
-OFPFF_CHECK_OVERLAP                 = 2
-OFPFF_RESET_COUNTS                  = 4
-ofp_flow_mod_flags_map = {
-    1                               : 'OFPFF_SEND_FLOW_REM',
-    2                               : 'OFPFF_CHECK_OVERLAP',
-    4                               : 'OFPFF_RESET_COUNTS'
-}
-
-ofp_controller_role = ['OFPCR_ROLE_NOCHANGE', 'OFPCR_ROLE_EQUAL', 'OFPCR_ROLE_MASTER', 'OFPCR_ROLE_SLAVE']
-OFPCR_ROLE_NOCHANGE                 = 0
-OFPCR_ROLE_EQUAL                    = 1
-OFPCR_ROLE_MASTER                   = 2
-OFPCR_ROLE_SLAVE                    = 3
-ofp_controller_role_map = {
-    0                               : 'OFPCR_ROLE_NOCHANGE',
-    1                               : 'OFPCR_ROLE_EQUAL',
-    2                               : 'OFPCR_ROLE_MASTER',
-    3                               : 'OFPCR_ROLE_SLAVE'
-}
-
-ofp_stats_reply_flags = ['OFPSF_REPLY_MORE']
-OFPSF_REPLY_MORE                    = 1
-ofp_stats_reply_flags_map = {
-    1                               : 'OFPSF_REPLY_MORE'
-}
-
-ofp_port_no = ['OFPP_MAX', 'OFPP_IN_PORT', 'OFPP_TABLE', 'OFPP_NORMAL', 'OFPP_FLOOD', 'OFPP_ALL', 'OFPP_CONTROLLER', 'OFPP_LOCAL', 'OFPP_ANY']
-OFPP_MAX                            = 4294967040
-OFPP_IN_PORT                        = 4294967288
-OFPP_TABLE                          = 4294967289
-OFPP_NORMAL                         = 4294967290
-OFPP_FLOOD                          = 4294967291
-OFPP_ALL                            = 4294967292
-OFPP_CONTROLLER                     = 4294967293
-OFPP_LOCAL                          = 4294967294
-OFPP_ANY                            = 4294967295
-ofp_port_no_map = {
-    4294967040                      : 'OFPP_MAX',
-    4294967288                      : 'OFPP_IN_PORT',
-    4294967289                      : 'OFPP_TABLE',
-    4294967290                      : 'OFPP_NORMAL',
-    4294967291                      : 'OFPP_FLOOD',
-    4294967292                      : 'OFPP_ALL',
-    4294967293                      : 'OFPP_CONTROLLER',
-    4294967294                      : 'OFPP_LOCAL',
-    4294967295                      : 'OFPP_ANY'
-}
-
-ofp_bad_request_code = ['OFPBRC_BAD_VERSION', 'OFPBRC_BAD_TYPE', 'OFPBRC_BAD_STAT', 'OFPBRC_BAD_EXPERIMENTER', 'OFPBRC_BAD_EXP_TYPE', 'OFPBRC_EPERM', 'OFPBRC_BAD_LEN', 'OFPBRC_BUFFER_EMPTY', 'OFPBRC_BUFFER_UNKNOWN', 'OFPBRC_BAD_TABLE_ID', 'OFPBRC_IS_SLAVE', 'OFPBRC_BAD_PORT', 'OFPBRC_BAD_PACKET']
-OFPBRC_BAD_VERSION                  = 0
-OFPBRC_BAD_TYPE                     = 1
-OFPBRC_BAD_STAT                     = 2
-OFPBRC_BAD_EXPERIMENTER             = 3
-OFPBRC_BAD_EXP_TYPE                 = 4
-OFPBRC_EPERM                        = 5
-OFPBRC_BAD_LEN                      = 6
-OFPBRC_BUFFER_EMPTY                 = 7
-OFPBRC_BUFFER_UNKNOWN               = 8
-OFPBRC_BAD_TABLE_ID                 = 9
-OFPBRC_IS_SLAVE                     = 10
-OFPBRC_BAD_PORT                     = 11
-OFPBRC_BAD_PACKET                   = 12
-ofp_bad_request_code_map = {
-    0                               : 'OFPBRC_BAD_VERSION',
-    1                               : 'OFPBRC_BAD_TYPE',
-    2                               : 'OFPBRC_BAD_STAT',
-    3                               : 'OFPBRC_BAD_EXPERIMENTER',
-    4                               : 'OFPBRC_BAD_EXP_TYPE',
-    5                               : 'OFPBRC_EPERM',
-    6                               : 'OFPBRC_BAD_LEN',
-    7                               : 'OFPBRC_BUFFER_EMPTY',
-    8                               : 'OFPBRC_BUFFER_UNKNOWN',
-    9                               : 'OFPBRC_BAD_TABLE_ID',
-    10                              : 'OFPBRC_IS_SLAVE',
-    11                              : 'OFPBRC_BAD_PORT',
-    12                              : 'OFPBRC_BAD_PACKET'
-}
-
-ofp_bad_instruction_code = ['OFPBIC_UNKNOWN_INST', 'OFPBIC_UNSUP_INST', 'OFPBIC_BAD_TABLE_ID', 'OFPBIC_UNSUP_METADATA', 'OFPBIC_UNSUP_METADATA_MASK', 'OFPBIC_BAD_EXPERIMENTER', 'OFPBIC_BAD_EXP_TYPE', 'OFPBIC_BAD_LEN', 'OFPBIC_EPERM']
-OFPBIC_UNKNOWN_INST                 = 0
-OFPBIC_UNSUP_INST                   = 1
-OFPBIC_BAD_TABLE_ID                 = 2
-OFPBIC_UNSUP_METADATA               = 3
-OFPBIC_UNSUP_METADATA_MASK          = 4
-OFPBIC_BAD_EXPERIMENTER             = 5
-OFPBIC_BAD_EXP_TYPE                 = 6
-OFPBIC_BAD_LEN                      = 7
-OFPBIC_EPERM                        = 8
-ofp_bad_instruction_code_map = {
-    0                               : 'OFPBIC_UNKNOWN_INST',
-    1                               : 'OFPBIC_UNSUP_INST',
-    2                               : 'OFPBIC_BAD_TABLE_ID',
-    3                               : 'OFPBIC_UNSUP_METADATA',
-    4                               : 'OFPBIC_UNSUP_METADATA_MASK',
-    5                               : 'OFPBIC_BAD_EXPERIMENTER',
-    6                               : 'OFPBIC_BAD_EXP_TYPE',
-    7                               : 'OFPBIC_BAD_LEN',
-    8                               : 'OFPBIC_EPERM'
-}
-
-ofp_port_config = ['OFPPC_PORT_DOWN', 'OFPPC_NO_RECV', 'OFPPC_NO_FWD', 'OFPPC_NO_PACKET_IN']
-OFPPC_PORT_DOWN                     = 1
-OFPPC_NO_RECV                       = 4
-OFPPC_NO_FWD                        = 32
-OFPPC_NO_PACKET_IN                  = 64
-ofp_port_config_map = {
-    1                               : 'OFPPC_PORT_DOWN',
-    4                               : 'OFPPC_NO_RECV',
-    32                              : 'OFPPC_NO_FWD',
-    64                              : 'OFPPC_NO_PACKET_IN'
-}
-
-ofp_port_state = ['OFPPS_LINK_DOWN', 'OFPPS_BLOCKED', 'OFPPS_LIVE']
-OFPPS_LINK_DOWN                     = 1
-OFPPS_BLOCKED                       = 2
-OFPPS_LIVE                          = 4
-ofp_port_state_map = {
-    1                               : 'OFPPS_LINK_DOWN',
-    2                               : 'OFPPS_BLOCKED',
-    4                               : 'OFPPS_LIVE'
-}
-
-ofp_config_flags = ['OFPC_FRAG_NORMAL', 'OFPC_FRAG_DROP', 'OFPC_FRAG_REASM', 'OFPC_FRAG_MASK', 'OFPC_INVALID_TTL_TO_CONTROLLER']
-OFPC_FRAG_NORMAL                    = 0
-OFPC_FRAG_DROP                      = 1
-OFPC_FRAG_REASM                     = 2
-OFPC_FRAG_MASK                      = 3
-OFPC_INVALID_TTL_TO_CONTROLLER      = 4
-ofp_config_flags_map = {
-    0                               : 'OFPC_FRAG_NORMAL',
-    1                               : 'OFPC_FRAG_DROP',
-    2                               : 'OFPC_FRAG_REASM',
-    3                               : 'OFPC_FRAG_MASK',
-    4                               : 'OFPC_INVALID_TTL_TO_CONTROLLER'
-}
-
-ofp_switch_config_failed_code = ['OFPSCFC_BAD_FLAGS', 'OFPSCFC_BAD_LEN', 'OFPQCFC_EPERM']
-OFPSCFC_BAD_FLAGS                   = 0
-OFPSCFC_BAD_LEN                     = 1
-OFPQCFC_EPERM                       = 2
-ofp_switch_config_failed_code_map = {
-    0                               : 'OFPSCFC_BAD_FLAGS',
-    1                               : 'OFPSCFC_BAD_LEN',
-    2                               : 'OFPQCFC_EPERM'
-}
-
-ofp_controller_max_len = ['OFPCML_MAX', 'OFPCML_NO_BUFFER']
-OFPCML_MAX                          = 65509
-OFPCML_NO_BUFFER                    = 65535
-ofp_controller_max_len_map = {
-    65509                           : 'OFPCML_MAX',
-    65535                           : 'OFPCML_NO_BUFFER'
-}
-
-ofp_role_request_failed_code = ['OFPRRFC_STALE', 'OFPRRFC_UNSUP', 'OFPRRFC_BAD_ROLE']
-OFPRRFC_STALE                       = 0
-OFPRRFC_UNSUP                       = 1
-OFPRRFC_BAD_ROLE                    = 2
-ofp_role_request_failed_code_map = {
-    0                               : 'OFPRRFC_STALE',
-    1                               : 'OFPRRFC_UNSUP',
-    2                               : 'OFPRRFC_BAD_ROLE'
-}
-
-ofp_capabilities = ['OFPC_FLOW_STATS', 'OFPC_TABLE_STATS', 'OFPC_PORT_STATS', 'OFPC_GROUP_STATS', 'OFPC_IP_REASM', 'OFPC_QUEUE_STATS', 'OFPC_PORT_BLOCKED']
-OFPC_FLOW_STATS                     = 1
-OFPC_TABLE_STATS                    = 2
-OFPC_PORT_STATS                     = 4
-OFPC_GROUP_STATS                    = 8
-OFPC_IP_REASM                       = 32
-OFPC_QUEUE_STATS                    = 64
-OFPC_PORT_BLOCKED                   = 256
-ofp_capabilities_map = {
-    1                               : 'OFPC_FLOW_STATS',
-    2                               : 'OFPC_TABLE_STATS',
-    4                               : 'OFPC_PORT_STATS',
-    8                               : 'OFPC_GROUP_STATS',
-    32                              : 'OFPC_IP_REASM',
-    64                              : 'OFPC_QUEUE_STATS',
-    256                             : 'OFPC_PORT_BLOCKED'
-}
-
-ofp_bad_match_code = ['OFPBMC_BAD_TYPE', 'OFPBMC_BAD_LEN', 'OFPBMC_BAD_TAG', 'OFPBMC_BAD_DL_ADDR_MASK', 'OFPBMC_BAD_NW_ADDR_MASK', 'OFPBMC_BAD_WILDCARDS', 'OFPBMC_BAD_FIELD', 'OFPBMC_BAD_VALUE', 'OFPBMC_BAD_MASK', 'OFPBMC_BAD_PREREQ', 'OFPBMC_DUP_FIELD', 'OFPBMC_EPERM']
-OFPBMC_BAD_TYPE                     = 0
-OFPBMC_BAD_LEN                      = 1
-OFPBMC_BAD_TAG                      = 2
-OFPBMC_BAD_DL_ADDR_MASK             = 3
-OFPBMC_BAD_NW_ADDR_MASK             = 4
-OFPBMC_BAD_WILDCARDS                = 5
-OFPBMC_BAD_FIELD                    = 6
-OFPBMC_BAD_VALUE                    = 7
-OFPBMC_BAD_MASK                     = 8
-OFPBMC_BAD_PREREQ                   = 9
-OFPBMC_DUP_FIELD                    = 10
-OFPBMC_EPERM                        = 11
-ofp_bad_match_code_map = {
-    0                               : 'OFPBMC_BAD_TYPE',
-    1                               : 'OFPBMC_BAD_LEN',
-    2                               : 'OFPBMC_BAD_TAG',
-    3                               : 'OFPBMC_BAD_DL_ADDR_MASK',
-    4                               : 'OFPBMC_BAD_NW_ADDR_MASK',
-    5                               : 'OFPBMC_BAD_WILDCARDS',
-    6                               : 'OFPBMC_BAD_FIELD',
-    7                               : 'OFPBMC_BAD_VALUE',
-    8                               : 'OFPBMC_BAD_MASK',
-    9                               : 'OFPBMC_BAD_PREREQ',
-    10                              : 'OFPBMC_DUP_FIELD',
-    11                              : 'OFPBMC_EPERM'
-}
-
-ofp_flow_removed_reason = ['OFPRR_IDLE_TIMEOUT', 'OFPRR_HARD_TIMEOUT', 'OFPRR_DELETE', 'OFPRR_GROUP_DELETE']
-OFPRR_IDLE_TIMEOUT                  = 0
-OFPRR_HARD_TIMEOUT                  = 1
-OFPRR_DELETE                        = 2
-OFPRR_GROUP_DELETE                  = 3
-ofp_flow_removed_reason_map = {
-    0                               : 'OFPRR_IDLE_TIMEOUT',
-    1                               : 'OFPRR_HARD_TIMEOUT',
-    2                               : 'OFPRR_DELETE',
-    3                               : 'OFPRR_GROUP_DELETE'
-}
-
-ofp_table_mod_failed_code = ['OFPTMFC_BAD_TABLE', 'OFPTMFC_BAD_CONFIG', 'OFPTMFC_EPERM']
-OFPTMFC_BAD_TABLE                   = 0
-OFPTMFC_BAD_CONFIG                  = 1
-OFPTMFC_EPERM                       = 2
-ofp_table_mod_failed_code_map = {
-    0                               : 'OFPTMFC_BAD_TABLE',
-    1                               : 'OFPTMFC_BAD_CONFIG',
-    2                               : 'OFPTMFC_EPERM'
-}
-
-ofp_queue_properties = ['OFPQT_MIN_RATE', 'OFPQT_MAX_RATE', 'OFPQT_EXPERIMENTER']
-OFPQT_MIN_RATE                      = 1
-OFPQT_MAX_RATE                      = 2
-OFPQT_EXPERIMENTER                  = 65535
-ofp_queue_properties_map = {
-    1                               : 'OFPQT_MIN_RATE',
-    2                               : 'OFPQT_MAX_RATE',
-    65535                           : 'OFPQT_EXPERIMENTER'
-}
-
-ofp_table = ['OFPTT_MAX', 'OFPTT_ALL']
-OFPTT_MAX                           = 254
-OFPTT_ALL                           = 255
-ofp_table_map = {
-    254                             : 'OFPTT_MAX',
-    255                             : 'OFPTT_ALL'
-}
-
-ofp_group = ['OFPG_MAX', 'OFPG_ALL', 'OFPG_ANY']
-OFPG_MAX                            = 4294967040
-OFPG_ALL                            = 4294967292
-OFPG_ANY                            = 4294967295
-ofp_group_map = {
-    4294967040                      : 'OFPG_MAX',
-    4294967292                      : 'OFPG_ALL',
-    4294967295                      : 'OFPG_ANY'
-}
-
-ofp_port_reason = ['OFPPR_ADD', 'OFPPR_DELETE', 'OFPPR_MODIFY']
-OFPPR_ADD                           = 0
-OFPPR_DELETE                        = 1
-OFPPR_MODIFY                        = 2
-ofp_port_reason_map = {
-    0                               : 'OFPPR_ADD',
-    1                               : 'OFPPR_DELETE',
-    2                               : 'OFPPR_MODIFY'
-}
-
-ofp_group_capabilities = ['OFPGFC_SELECT_WEIGHT', 'OFPGFC_SELECT_LIVENESS', 'OFPGFC_CHAINING', 'OFPGFC_CHAINING_CHECKS']
-OFPGFC_SELECT_WEIGHT                = 1
-OFPGFC_SELECT_LIVENESS              = 2
-OFPGFC_CHAINING                     = 4
-OFPGFC_CHAINING_CHECKS              = 8
-ofp_group_capabilities_map = {
-    1                               : 'OFPGFC_SELECT_WEIGHT',
-    2                               : 'OFPGFC_SELECT_LIVENESS',
-    4                               : 'OFPGFC_CHAINING',
-    8                               : 'OFPGFC_CHAINING_CHECKS'
-}
-
-ofp_table_config = ['OFPTC_TABLE_MISS_CONTROLLER', 'OFPTC_TABLE_MISS_CONTINUE', 'OFPTC_TABLE_MISS_DROP', 'OFPTC_TABLE_MISS_MASK']
-OFPTC_TABLE_MISS_CONTROLLER         = 0
-OFPTC_TABLE_MISS_CONTINUE           = 1
-OFPTC_TABLE_MISS_DROP               = 2
-OFPTC_TABLE_MISS_MASK               = 3
-ofp_table_config_map = {
-    0                               : 'OFPTC_TABLE_MISS_CONTROLLER',
-    1                               : 'OFPTC_TABLE_MISS_CONTINUE',
-    2                               : 'OFPTC_TABLE_MISS_DROP',
-    3                               : 'OFPTC_TABLE_MISS_MASK'
-}
-
-ofp_action_type = ['OFPAT_OUTPUT', 'OFPAT_COPY_TTL_OUT', 'OFPAT_COPY_TTL_IN', 'OFPAT_SET_MPLS_TTL', 'OFPAT_DEC_MPLS_TTL', 'OFPAT_PUSH_VLAN', 'OFPAT_POP_VLAN', 'OFPAT_PUSH_MPLS', 'OFPAT_POP_MPLS', 'OFPAT_SET_QUEUE', 'OFPAT_GROUP', 'OFPAT_SET_NW_TTL', 'OFPAT_DEC_NW_TTL', 'OFPAT_SET_FIELD', 'OFPAT_EXPERIMENTER']
-OFPAT_OUTPUT                        = 0
-OFPAT_COPY_TTL_OUT                  = 11
-OFPAT_COPY_TTL_IN                   = 12
-OFPAT_SET_MPLS_TTL                  = 15
-OFPAT_DEC_MPLS_TTL                  = 16
-OFPAT_PUSH_VLAN                     = 17
-OFPAT_POP_VLAN                      = 18
-OFPAT_PUSH_MPLS                     = 19
-OFPAT_POP_MPLS                      = 20
-OFPAT_SET_QUEUE                     = 21
-OFPAT_GROUP                         = 22
-OFPAT_SET_NW_TTL                    = 23
-OFPAT_DEC_NW_TTL                    = 24
-OFPAT_SET_FIELD                     = 25
-OFPAT_EXPERIMENTER                  = 65535
-ofp_action_type_map = {
-    0                               : 'OFPAT_OUTPUT',
-    11                              : 'OFPAT_COPY_TTL_OUT',
-    12                              : 'OFPAT_COPY_TTL_IN',
-    15                              : 'OFPAT_SET_MPLS_TTL',
-    16                              : 'OFPAT_DEC_MPLS_TTL',
-    17                              : 'OFPAT_PUSH_VLAN',
-    18                              : 'OFPAT_POP_VLAN',
-    19                              : 'OFPAT_PUSH_MPLS',
-    20                              : 'OFPAT_POP_MPLS',
-    21                              : 'OFPAT_SET_QUEUE',
-    22                              : 'OFPAT_GROUP',
-    23                              : 'OFPAT_SET_NW_TTL',
-    24                              : 'OFPAT_DEC_NW_TTL',
-    25                              : 'OFPAT_SET_FIELD',
-    65535                           : 'OFPAT_EXPERIMENTER'
-}
-
-ofp_flow_mod_command = ['OFPFC_ADD', 'OFPFC_MODIFY', 'OFPFC_MODIFY_STRICT', 'OFPFC_DELETE', 'OFPFC_DELETE_STRICT']
-OFPFC_ADD                           = 0
-OFPFC_MODIFY                        = 1
-OFPFC_MODIFY_STRICT                 = 2
-OFPFC_DELETE                        = 3
-OFPFC_DELETE_STRICT                 = 4
-ofp_flow_mod_command_map = {
-    0                               : 'OFPFC_ADD',
-    1                               : 'OFPFC_MODIFY',
-    2                               : 'OFPFC_MODIFY_STRICT',
-    3                               : 'OFPFC_DELETE',
-    4                               : 'OFPFC_DELETE_STRICT'
-}
-
-ofp_queue_op_failed_code = ['OFPQOFC_BAD_PORT', 'OFPQOFC_BAD_QUEUE', 'OFPQOFC_EPERM']
-OFPQOFC_BAD_PORT                    = 0
-OFPQOFC_BAD_QUEUE                   = 1
-OFPQOFC_EPERM                       = 2
-ofp_queue_op_failed_code_map = {
-    0                               : 'OFPQOFC_BAD_PORT',
-    1                               : 'OFPQOFC_BAD_QUEUE',
-    2                               : 'OFPQOFC_EPERM'
-}
-
-ofp_hello_failed_code = ['OFPHFC_INCOMPATIBLE', 'OFPHFC_EPERM']
-OFPHFC_INCOMPATIBLE                 = 0
-OFPHFC_EPERM                        = 1
-ofp_hello_failed_code_map = {
-    0                               : 'OFPHFC_INCOMPATIBLE',
-    1                               : 'OFPHFC_EPERM'
-}
-
-ofp_match_type = ['OFPMT_STANDARD', 'OFPMT_OXM']
-OFPMT_STANDARD                      = 0
-OFPMT_OXM                           = 1
-ofp_match_type_map = {
-    0                               : 'OFPMT_STANDARD',
-    1                               : 'OFPMT_OXM'
-}
-
-ofp_vlan_id = ['OFPVID_PRESENT', 'OFPVID_NONE']
-OFPVID_PRESENT                      = 4096
-OFPVID_NONE                         = 0
-ofp_vlan_id_map = {
-    4096                            : 'OFPVID_PRESENT',
-    0                               : 'OFPVID_NONE'
-}
-
-ofp_oxm_class = ['OFPXMC_NXM_0', 'OFPXMC_NXM_1', 'OFPXMC_OPENFLOW_BASIC', 'OFPXMC_EXPERIMENTER']
-OFPXMC_NXM_0                        = 0
-OFPXMC_NXM_1                        = 1
-OFPXMC_OPENFLOW_BASIC               = 32768
-OFPXMC_EXPERIMENTER                 = 65535
-ofp_oxm_class_map = {
-    0                               : 'OFPXMC_NXM_0',
-    1                               : 'OFPXMC_NXM_1',
-    32768                           : 'OFPXMC_OPENFLOW_BASIC',
-    65535                           : 'OFPXMC_EXPERIMENTER'
-}
-
-ofp_group_type = ['OFPGT_ALL', 'OFPGT_SELECT', 'OFPGT_INDIRECT', 'OFPGT_FF']
-OFPGT_ALL                           = 0
-OFPGT_SELECT                        = 1
-OFPGT_INDIRECT                      = 2
-OFPGT_FF                            = 3
-ofp_group_type_map = {
-    0                               : 'OFPGT_ALL',
-    1                               : 'OFPGT_SELECT',
-    2                               : 'OFPGT_INDIRECT',
-    3                               : 'OFPGT_FF'
-}
-
-ofp_instruction_type = ['OFPIT_GOTO_TABLE', 'OFPIT_WRITE_METADATA', 'OFPIT_WRITE_ACTIONS', 'OFPIT_APPLY_ACTIONS', 'OFPIT_CLEAR_ACTIONS', 'OFPIT_EXPERIMENTER']
-OFPIT_GOTO_TABLE                    = 1
-OFPIT_WRITE_METADATA                = 2
-OFPIT_WRITE_ACTIONS                 = 3
-OFPIT_APPLY_ACTIONS                 = 4
-OFPIT_CLEAR_ACTIONS                 = 5
-OFPIT_EXPERIMENTER                  = 65535
-ofp_instruction_type_map = {
-    1                               : 'OFPIT_GOTO_TABLE',
-    2                               : 'OFPIT_WRITE_METADATA',
-    3                               : 'OFPIT_WRITE_ACTIONS',
-    4                               : 'OFPIT_APPLY_ACTIONS',
-    5                               : 'OFPIT_CLEAR_ACTIONS',
-    65535                           : 'OFPIT_EXPERIMENTER'
-}
-
-ofp_bad_action_code = ['OFPBAC_BAD_TYPE', 'OFPBAC_BAD_LEN', 'OFPBAC_BAD_EXPERIMENTER', 'OFPBAC_BAD_EXP_TYPE', 'OFPBAC_BAD_OUT_PORT', 'OFPBAC_BAD_ARGUMENT', 'OFPBAC_EPERM', 'OFPBAC_TOO_MANY', 'OFPBAC_BAD_QUEUE', 'OFPBAC_BAD_OUT_GROUP', 'OFPBAC_MATCH_INCONSISTENT', 'OFPBAC_UNSUPPORTED_ORDER', 'OFPBAC_BAD_TAG', 'OFPBAC_BAD_SET_TYPE', 'OFPBAC_BAD_SET_LEN', 'OFPBAC_BAD_SET_ARGUMENT']
-OFPBAC_BAD_TYPE                     = 0
-OFPBAC_BAD_LEN                      = 1
-OFPBAC_BAD_EXPERIMENTER             = 2
-OFPBAC_BAD_EXP_TYPE                 = 3
-OFPBAC_BAD_OUT_PORT                 = 4
-OFPBAC_BAD_ARGUMENT                 = 5
-OFPBAC_EPERM                        = 6
-OFPBAC_TOO_MANY                     = 7
-OFPBAC_BAD_QUEUE                    = 8
-OFPBAC_BAD_OUT_GROUP                = 9
-OFPBAC_MATCH_INCONSISTENT           = 10
-OFPBAC_UNSUPPORTED_ORDER            = 11
-OFPBAC_BAD_TAG                      = 12
-OFPBAC_BAD_SET_TYPE                 = 13
-OFPBAC_BAD_SET_LEN                  = 14
-OFPBAC_BAD_SET_ARGUMENT             = 15
-ofp_bad_action_code_map = {
-    0                               : 'OFPBAC_BAD_TYPE',
-    1                               : 'OFPBAC_BAD_LEN',
-    2                               : 'OFPBAC_BAD_EXPERIMENTER',
-    3                               : 'OFPBAC_BAD_EXP_TYPE',
-    4                               : 'OFPBAC_BAD_OUT_PORT',
-    5                               : 'OFPBAC_BAD_ARGUMENT',
-    6                               : 'OFPBAC_EPERM',
-    7                               : 'OFPBAC_TOO_MANY',
-    8                               : 'OFPBAC_BAD_QUEUE',
-    9                               : 'OFPBAC_BAD_OUT_GROUP',
-    10                              : 'OFPBAC_MATCH_INCONSISTENT',
-    11                              : 'OFPBAC_UNSUPPORTED_ORDER',
-    12                              : 'OFPBAC_BAD_TAG',
-    13                              : 'OFPBAC_BAD_SET_TYPE',
-    14                              : 'OFPBAC_BAD_SET_LEN',
-    15                              : 'OFPBAC_BAD_SET_ARGUMENT'
-}
-
-oxm_ofb_match_fields = ['OFPXMT_OFB_IN_PORT', 'OFPXMT_OFB_IN_PHY_PORT', 'OFPXMT_OFB_METADATA', 'OFPXMT_OFB_ETH_DST', 'OFPXMT_OFB_ETH_SRC', 'OFPXMT_OFB_ETH_TYPE', 'OFPXMT_OFB_VLAN_VID', 'OFPXMT_OFB_VLAN_PCP', 'OFPXMT_OFB_IP_DSCP', 'OFPXMT_OFB_IP_ECN', 'OFPXMT_OFB_IP_PROTO', 'OFPXMT_OFB_IPV4_SRC', 'OFPXMT_OFB_IPV4_DST', 'OFPXMT_OFB_TCP_SRC', 'OFPXMT_OFB_TCP_DST', 'OFPXMT_OFB_UDP_SRC', 'OFPXMT_OFB_UDP_DST', 'OFPXMT_OFB_SCTP_SRC', 'OFPXMT_OFB_SCTP_DST', 'OFPXMT_OFB_ICMPV4_TYPE', 'OFPXMT_OFB_ICMPV4_CODE', 'OFPXMT_OFB_ARP_OP', 'OFPXMT_OFB_ARP_SPA', 'OFPXMT_OFB_ARP_TPA', 'OFPXMT_OFB_ARP_SHA', 'OFPXMT_OFB_ARP_THA', 'OFPXMT_OFB_IPV6_SRC', 'OFPXMT_OFB_IPV6_DST', 'OFPXMT_OFB_IPV6_FLABEL', 'OFPXMT_OFB_ICMPV6_TYPE', 'OFPXMT_OFB_ICMPV6_CODE', 'OFPXMT_OFB_IPV6_ND_TARGET', 'OFPXMT_OFB_IPV6_ND_SLL', 'OFPXMT_OFB_IPV6_ND_TLL', 'OFPXMT_OFB_MPLS_LABEL', 'OFPXMT_OFB_MPLS_TC']
-OFPXMT_OFB_IN_PORT                  = 0
-OFPXMT_OFB_IN_PHY_PORT              = 1
-OFPXMT_OFB_METADATA                 = 2
-OFPXMT_OFB_ETH_DST                  = 3
-OFPXMT_OFB_ETH_SRC                  = 4
-OFPXMT_OFB_ETH_TYPE                 = 5
-OFPXMT_OFB_VLAN_VID                 = 6
-OFPXMT_OFB_VLAN_PCP                 = 7
-OFPXMT_OFB_IP_DSCP                  = 8
-OFPXMT_OFB_IP_ECN                   = 9
-OFPXMT_OFB_IP_PROTO                 = 10
-OFPXMT_OFB_IPV4_SRC                 = 11
-OFPXMT_OFB_IPV4_DST                 = 12
-OFPXMT_OFB_TCP_SRC                  = 13
-OFPXMT_OFB_TCP_DST                  = 14
-OFPXMT_OFB_UDP_SRC                  = 15
-OFPXMT_OFB_UDP_DST                  = 16
-OFPXMT_OFB_SCTP_SRC                 = 17
-OFPXMT_OFB_SCTP_DST                 = 18
-OFPXMT_OFB_ICMPV4_TYPE              = 19
-OFPXMT_OFB_ICMPV4_CODE              = 20
-OFPXMT_OFB_ARP_OP                   = 21
-OFPXMT_OFB_ARP_SPA                  = 22
-OFPXMT_OFB_ARP_TPA                  = 23
-OFPXMT_OFB_ARP_SHA                  = 24
-OFPXMT_OFB_ARP_THA                  = 25
-OFPXMT_OFB_IPV6_SRC                 = 26
-OFPXMT_OFB_IPV6_DST                 = 27
-OFPXMT_OFB_IPV6_FLABEL              = 28
-OFPXMT_OFB_ICMPV6_TYPE              = 29
-OFPXMT_OFB_ICMPV6_CODE              = 30
-OFPXMT_OFB_IPV6_ND_TARGET           = 31
-OFPXMT_OFB_IPV6_ND_SLL              = 32
-OFPXMT_OFB_IPV6_ND_TLL              = 33
-OFPXMT_OFB_MPLS_LABEL               = 34
-OFPXMT_OFB_MPLS_TC                  = 35
-oxm_ofb_match_fields_map = {
-    0                               : 'OFPXMT_OFB_IN_PORT',
-    1                               : 'OFPXMT_OFB_IN_PHY_PORT',
-    2                               : 'OFPXMT_OFB_METADATA',
-    3                               : 'OFPXMT_OFB_ETH_DST',
-    4                               : 'OFPXMT_OFB_ETH_SRC',
-    5                               : 'OFPXMT_OFB_ETH_TYPE',
-    6                               : 'OFPXMT_OFB_VLAN_VID',
-    7                               : 'OFPXMT_OFB_VLAN_PCP',
-    8                               : 'OFPXMT_OFB_IP_DSCP',
-    9                               : 'OFPXMT_OFB_IP_ECN',
-    10                              : 'OFPXMT_OFB_IP_PROTO',
-    11                              : 'OFPXMT_OFB_IPV4_SRC',
-    12                              : 'OFPXMT_OFB_IPV4_DST',
-    13                              : 'OFPXMT_OFB_TCP_SRC',
-    14                              : 'OFPXMT_OFB_TCP_DST',
-    15                              : 'OFPXMT_OFB_UDP_SRC',
-    16                              : 'OFPXMT_OFB_UDP_DST',
-    17                              : 'OFPXMT_OFB_SCTP_SRC',
-    18                              : 'OFPXMT_OFB_SCTP_DST',
-    19                              : 'OFPXMT_OFB_ICMPV4_TYPE',
-    20                              : 'OFPXMT_OFB_ICMPV4_CODE',
-    21                              : 'OFPXMT_OFB_ARP_OP',
-    22                              : 'OFPXMT_OFB_ARP_SPA',
-    23                              : 'OFPXMT_OFB_ARP_TPA',
-    24                              : 'OFPXMT_OFB_ARP_SHA',
-    25                              : 'OFPXMT_OFB_ARP_THA',
-    26                              : 'OFPXMT_OFB_IPV6_SRC',
-    27                              : 'OFPXMT_OFB_IPV6_DST',
-    28                              : 'OFPXMT_OFB_IPV6_FLABEL',
-    29                              : 'OFPXMT_OFB_ICMPV6_TYPE',
-    30                              : 'OFPXMT_OFB_ICMPV6_CODE',
-    31                              : 'OFPXMT_OFB_IPV6_ND_TARGET',
-    32                              : 'OFPXMT_OFB_IPV6_ND_SLL',
-    33                              : 'OFPXMT_OFB_IPV6_ND_TLL',
-    34                              : 'OFPXMT_OFB_MPLS_LABEL',
-    35                              : 'OFPXMT_OFB_MPLS_TC'
-}
-
-ofp_flow_mod_failed_code = ['OFPFMFC_UNKNOWN', 'OFPFMFC_TABLE_FULL', 'OFPFMFC_BAD_TABLE_ID', 'OFPFMFC_OVERLAP', 'OFPFMFC_EPERM', 'OFPFMFC_BAD_TIMEOUT', 'OFPFMFC_BAD_COMMAND', 'OFPFMFC_BAD_FLAGS']
-OFPFMFC_UNKNOWN                     = 0
-OFPFMFC_TABLE_FULL                  = 1
-OFPFMFC_BAD_TABLE_ID                = 2
-OFPFMFC_OVERLAP                     = 3
-OFPFMFC_EPERM                       = 4
-OFPFMFC_BAD_TIMEOUT                 = 5
-OFPFMFC_BAD_COMMAND                 = 6
-OFPFMFC_BAD_FLAGS                   = 7
-ofp_flow_mod_failed_code_map = {
-    0                               : 'OFPFMFC_UNKNOWN',
-    1                               : 'OFPFMFC_TABLE_FULL',
-    2                               : 'OFPFMFC_BAD_TABLE_ID',
-    3                               : 'OFPFMFC_OVERLAP',
-    4                               : 'OFPFMFC_EPERM',
-    5                               : 'OFPFMFC_BAD_TIMEOUT',
-    6                               : 'OFPFMFC_BAD_COMMAND',
-    7                               : 'OFPFMFC_BAD_FLAGS'
-}
-
-ofp_port_mod_failed_code = ['OFPPMFC_BAD_PORT', 'OFPPMFC_BAD_HW_ADDR', 'OFPPMFC_BAD_CONFIG', 'OFPPMFC_BAD_ADVERTISE', 'OFPPMFC_EPERM']
-OFPPMFC_BAD_PORT                    = 0
-OFPPMFC_BAD_HW_ADDR                 = 1
-OFPPMFC_BAD_CONFIG                  = 2
-OFPPMFC_BAD_ADVERTISE               = 3
-OFPPMFC_EPERM                       = 4
-ofp_port_mod_failed_code_map = {
-    0                               : 'OFPPMFC_BAD_PORT',
-    1                               : 'OFPPMFC_BAD_HW_ADDR',
-    2                               : 'OFPPMFC_BAD_CONFIG',
-    3                               : 'OFPPMFC_BAD_ADVERTISE',
-    4                               : 'OFPPMFC_EPERM'
-}
-
-ofp_type = ['OFPT_HELLO', 'OFPT_ERROR', 'OFPT_ECHO_REQUEST', 'OFPT_ECHO_REPLY', 'OFPT_EXPERIMENTER', 'OFPT_FEATURES_REQUEST', 'OFPT_FEATURES_REPLY', 'OFPT_GET_CONFIG_REQUEST', 'OFPT_GET_CONFIG_REPLY', 'OFPT_SET_CONFIG', 'OFPT_PACKET_IN', 'OFPT_FLOW_REMOVED', 'OFPT_PORT_STATUS', 'OFPT_PACKET_OUT', 'OFPT_FLOW_MOD', 'OFPT_GROUP_MOD', 'OFPT_PORT_MOD', 'OFPT_TABLE_MOD', 'OFPT_STATS_REQUEST', 'OFPT_STATS_REPLY', 'OFPT_BARRIER_REQUEST', 'OFPT_BARRIER_REPLY', 'OFPT_QUEUE_GET_CONFIG_REQUEST', 'OFPT_QUEUE_GET_CONFIG_REPLY', 'OFPT_ROLE_REQUEST', 'OFPT_ROLE_REPLY']
-OFPT_HELLO                          = 0
-OFPT_ERROR                          = 1
-OFPT_ECHO_REQUEST                   = 2
-OFPT_ECHO_REPLY                     = 3
-OFPT_EXPERIMENTER                   = 4
-OFPT_FEATURES_REQUEST               = 5
-OFPT_FEATURES_REPLY                 = 6
-OFPT_GET_CONFIG_REQUEST             = 7
-OFPT_GET_CONFIG_REPLY               = 8
-OFPT_SET_CONFIG                     = 9
-OFPT_PACKET_IN                      = 10
-OFPT_FLOW_REMOVED                   = 11
-OFPT_PORT_STATUS                    = 12
-OFPT_PACKET_OUT                     = 13
-OFPT_FLOW_MOD                       = 14
-OFPT_GROUP_MOD                      = 15
-OFPT_PORT_MOD                       = 16
-OFPT_TABLE_MOD                      = 17
-OFPT_STATS_REQUEST                  = 18
-OFPT_STATS_REPLY                    = 19
-OFPT_BARRIER_REQUEST                = 20
-OFPT_BARRIER_REPLY                  = 21
-OFPT_QUEUE_GET_CONFIG_REQUEST       = 22
-OFPT_QUEUE_GET_CONFIG_REPLY         = 23
-OFPT_ROLE_REQUEST                   = 24
-OFPT_ROLE_REPLY                     = 25
-ofp_type_map = {
-    0                               : 'OFPT_HELLO',
-    1                               : 'OFPT_ERROR',
-    2                               : 'OFPT_ECHO_REQUEST',
-    3                               : 'OFPT_ECHO_REPLY',
-    4                               : 'OFPT_EXPERIMENTER',
-    5                               : 'OFPT_FEATURES_REQUEST',
-    6                               : 'OFPT_FEATURES_REPLY',
-    7                               : 'OFPT_GET_CONFIG_REQUEST',
-    8                               : 'OFPT_GET_CONFIG_REPLY',
-    9                               : 'OFPT_SET_CONFIG',
-    10                              : 'OFPT_PACKET_IN',
-    11                              : 'OFPT_FLOW_REMOVED',
-    12                              : 'OFPT_PORT_STATUS',
-    13                              : 'OFPT_PACKET_OUT',
-    14                              : 'OFPT_FLOW_MOD',
-    15                              : 'OFPT_GROUP_MOD',
-    16                              : 'OFPT_PORT_MOD',
-    17                              : 'OFPT_TABLE_MOD',
-    18                              : 'OFPT_STATS_REQUEST',
-    19                              : 'OFPT_STATS_REPLY',
-    20                              : 'OFPT_BARRIER_REQUEST',
-    21                              : 'OFPT_BARRIER_REPLY',
-    22                              : 'OFPT_QUEUE_GET_CONFIG_REQUEST',
-    23                              : 'OFPT_QUEUE_GET_CONFIG_REPLY',
-    24                              : 'OFPT_ROLE_REQUEST',
-    25                              : 'OFPT_ROLE_REPLY'
-}
-
-ofp_packet_in_reason = ['OFPR_NO_MATCH', 'OFPR_ACTION', 'OFPR_INVALID_TTL']
-OFPR_NO_MATCH                       = 0
-OFPR_ACTION                         = 1
-OFPR_INVALID_TTL                    = 2
-ofp_packet_in_reason_map = {
-    0                               : 'OFPR_NO_MATCH',
-    1                               : 'OFPR_ACTION',
-    2                               : 'OFPR_INVALID_TTL'
-}
-
-ofp_stats_types = ['OFPST_DESC', 'OFPST_FLOW', 'OFPST_AGGREGATE', 'OFPST_TABLE', 'OFPST_PORT', 'OFPST_QUEUE', 'OFPST_GROUP', 'OFPST_GROUP_DESC', 'OFPST_GROUP_FEATURES', 'OFPST_EXPERIMENTER']
-OFPST_DESC                          = 0
-OFPST_FLOW                          = 1
-OFPST_AGGREGATE                     = 2
-OFPST_TABLE                         = 3
-OFPST_PORT                          = 4
-OFPST_QUEUE                         = 5
-OFPST_GROUP                         = 6
-OFPST_GROUP_DESC                    = 7
-OFPST_GROUP_FEATURES                = 8
-OFPST_EXPERIMENTER                  = 65535
-ofp_stats_types_map = {
-    0                               : 'OFPST_DESC',
-    1                               : 'OFPST_FLOW',
-    2                               : 'OFPST_AGGREGATE',
-    3                               : 'OFPST_TABLE',
-    4                               : 'OFPST_PORT',
-    5                               : 'OFPST_QUEUE',
-    6                               : 'OFPST_GROUP',
-    7                               : 'OFPST_GROUP_DESC',
-    8                               : 'OFPST_GROUP_FEATURES',
-    65535                           : 'OFPST_EXPERIMENTER'
-}
-
-ofp_group_mod_command = ['OFPGC_ADD', 'OFPGC_MODIFY', 'OFPGC_DELETE']
-OFPGC_ADD                           = 0
-OFPGC_MODIFY                        = 1
-OFPGC_DELETE                        = 2
-ofp_group_mod_command_map = {
-    0                               : 'OFPGC_ADD',
-    1                               : 'OFPGC_MODIFY',
-    2                               : 'OFPGC_DELETE'
-}
-
-ofp_port_features = ['OFPPF_10MB_HD', 'OFPPF_10MB_FD', 'OFPPF_100MB_HD', 'OFPPF_100MB_FD', 'OFPPF_1GB_HD', 'OFPPF_1GB_FD', 'OFPPF_10GB_FD', 'OFPPF_40GB_FD', 'OFPPF_100GB_FD', 'OFPPF_1TB_FD', 'OFPPF_OTHER', 'OFPPF_COPPER', 'OFPPF_FIBER', 'OFPPF_AUTONEG', 'OFPPF_PAUSE', 'OFPPF_PAUSE_ASYM']
-OFPPF_10MB_HD                       = 1
-OFPPF_10MB_FD                       = 2
-OFPPF_100MB_HD                      = 4
-OFPPF_100MB_FD                      = 8
-OFPPF_1GB_HD                        = 16
-OFPPF_1GB_FD                        = 32
-OFPPF_10GB_FD                       = 64
-OFPPF_40GB_FD                       = 128
-OFPPF_100GB_FD                      = 256
-OFPPF_1TB_FD                        = 512
-OFPPF_OTHER                         = 1024
-OFPPF_COPPER                        = 2048
-OFPPF_FIBER                         = 4096
-OFPPF_AUTONEG                       = 8192
-OFPPF_PAUSE                         = 16384
-OFPPF_PAUSE_ASYM                    = 32768
-ofp_port_features_map = {
-    1                               : 'OFPPF_10MB_HD',
-    2                               : 'OFPPF_10MB_FD',
-    4                               : 'OFPPF_100MB_HD',
-    8                               : 'OFPPF_100MB_FD',
-    16                              : 'OFPPF_1GB_HD',
-    32                              : 'OFPPF_1GB_FD',
-    64                              : 'OFPPF_10GB_FD',
-    128                             : 'OFPPF_40GB_FD',
-    256                             : 'OFPPF_100GB_FD',
-    512                             : 'OFPPF_1TB_FD',
-    1024                            : 'OFPPF_OTHER',
-    2048                            : 'OFPPF_COPPER',
-    4096                            : 'OFPPF_FIBER',
-    8192                            : 'OFPPF_AUTONEG',
-    16384                           : 'OFPPF_PAUSE',
-    32768                           : 'OFPPF_PAUSE_ASYM'
-}
-
-ofp_group_mod_failed_code = ['OFPGMFC_GROUP_EXISTS', 'OFPGMFC_INVALID_GROUP', 'OFPGMFC_OUT_OF_GROUPS', 'OFPGMFC_OUT_OF_BUCKETS', 'OFPGMFC_CHAINING_UNSUPPORTED', 'OFPGMFC_WATCH_UNSUPPORTED', 'OFPGMFC_LOOP', 'OFPGMFC_UNKNOWN_GROUP', 'OFPGMFC_CHAINED_GROUP', 'OFPGMFC_BAD_TYPE', 'OFPGMFC_BAD_COMMAND', 'OFPGMFC_BAD_BUCKET', 'OFPGMFC_BAD_WATCH', 'OFPGMFC_EPERM']
-OFPGMFC_GROUP_EXISTS                = 0
-OFPGMFC_INVALID_GROUP               = 1
-OFPGMFC_OUT_OF_GROUPS               = 3
-OFPGMFC_OUT_OF_BUCKETS              = 4
-OFPGMFC_CHAINING_UNSUPPORTED        = 5
-OFPGMFC_WATCH_UNSUPPORTED           = 6
-OFPGMFC_LOOP                        = 7
-OFPGMFC_UNKNOWN_GROUP               = 8
-OFPGMFC_CHAINED_GROUP               = 9
-OFPGMFC_BAD_TYPE                    = 10
-OFPGMFC_BAD_COMMAND                 = 11
-OFPGMFC_BAD_BUCKET                  = 12
-OFPGMFC_BAD_WATCH                   = 13
-OFPGMFC_EPERM                       = 14
-ofp_group_mod_failed_code_map = {
-    0                               : 'OFPGMFC_GROUP_EXISTS',
-    1                               : 'OFPGMFC_INVALID_GROUP',
-    3                               : 'OFPGMFC_OUT_OF_GROUPS',
-    4                               : 'OFPGMFC_OUT_OF_BUCKETS',
-    5                               : 'OFPGMFC_CHAINING_UNSUPPORTED',
-    6                               : 'OFPGMFC_WATCH_UNSUPPORTED',
-    7                               : 'OFPGMFC_LOOP',
-    8                               : 'OFPGMFC_UNKNOWN_GROUP',
-    9                               : 'OFPGMFC_CHAINED_GROUP',
-    10                              : 'OFPGMFC_BAD_TYPE',
-    11                              : 'OFPGMFC_BAD_COMMAND',
-    12                              : 'OFPGMFC_BAD_BUCKET',
-    13                              : 'OFPGMFC_BAD_WATCH',
-    14                              : 'OFPGMFC_EPERM'
-}
-
-# Values from macro definitions
-OFP_ETH_ALEN = 6
-OFP_MAX_PORT_NAME_LEN = 16
-OFP_TCP_PORT = 6633
-OFP_FLOW_PERMANENT = 0
-OFPQ_MIN_RATE_UNCFG = 0xffff
-OFPQ_ALL = 0xffffffff
-OFP_VERSION = 0x03
-OFP_MAX_TABLE_NAME_LEN = 32
-OFP_DEFAULT_PRIORITY = 0x8000
-OFP_NO_BUFFER = 0xffffffff
-OFP_SSL_PORT = 6633
-OFP_DEFAULT_MISS_SEND_LEN = 128
-DESC_STR_LEN = 256
-SERIAL_NUM_LEN = 32
-
-# Basic structure size definitions.
-# Does not include ofp_header members.
-# Does not include variable length arrays.
-OFP_ACTION_EXPERIMENTER_HEADER_BYTES = 8
-OFP_ACTION_GROUP_BYTES = 8
-OFP_ACTION_HEADER_BYTES = 8
-OFP_ACTION_MPLS_TTL_BYTES = 8
-OFP_ACTION_NW_TTL_BYTES = 8
-OFP_ACTION_OUTPUT_BYTES = 16
-OFP_ACTION_POP_MPLS_BYTES = 8
-OFP_ACTION_PUSH_BYTES = 8
-OFP_ACTION_SET_FIELD_BYTES = 8
-OFP_ACTION_SET_QUEUE_BYTES = 8
-OFP_AGGREGATE_STATS_REPLY_BYTES = 24
-OFP_AGGREGATE_STATS_REQUEST_BYTES = 36
-OFP_BUCKET_BYTES = 16
-OFP_BUCKET_COUNTER_BYTES = 16
-OFP_DESC_STATS_BYTES = 1056
-OFP_ERROR_EXPERIMENTER_MSG_BYTES = 8
-OFP_ERROR_MSG_BYTES = 4
-OFP_EXPERIMENTER_HEADER_BYTES = 8
-OFP_EXPERIMENTER_STATS_HEADER_BYTES = 8
-OFP_FLOW_MOD_BYTES = 44
-OFP_FLOW_REMOVED_BYTES = 44
-OFP_FLOW_STATS_BYTES = 52
-OFP_FLOW_STATS_REQUEST_BYTES = 36
-OFP_GROUP_DESC_STATS_BYTES = 8
-OFP_GROUP_FEATURES_STATS_BYTES = 40
-OFP_GROUP_MOD_BYTES = 8
-OFP_GROUP_STATS_BYTES = 32
-OFP_GROUP_STATS_REQUEST_BYTES = 8
-OFP_HEADER_BYTES = 8
-OFP_HELLO_BYTES = 0
-OFP_INSTRUCTION_BYTES = 8
-OFP_INSTRUCTION_ACTIONS_BYTES = 8
-OFP_INSTRUCTION_GOTO_TABLE_BYTES = 8
-OFP_INSTRUCTION_WRITE_METADATA_BYTES = 24
-OFP_MATCH_BYTES = 4
-OFP_OXM_EXPERIMENTER_HEADER_BYTES = 8
-OFP_PACKET_IN_BYTES = 12
-OFP_PACKET_OUT_BYTES = 16
-OFP_PACKET_QUEUE_BYTES = 16
-OFP_PORT_BYTES = 64
-OFP_PORT_MOD_BYTES = 32
-OFP_PORT_STATS_BYTES = 104
-OFP_PORT_STATS_REQUEST_BYTES = 8
-OFP_PORT_STATUS_BYTES = 72
-OFP_QUEUE_GET_CONFIG_REPLY_BYTES = 8
-OFP_QUEUE_GET_CONFIG_REQUEST_BYTES = 8
-OFP_QUEUE_PROP_EXPERIMENTER_BYTES = 16
-OFP_QUEUE_PROP_HEADER_BYTES = 8
-OFP_QUEUE_PROP_MAX_RATE_BYTES = 16
-OFP_QUEUE_PROP_MIN_RATE_BYTES = 16
-OFP_QUEUE_STATS_BYTES = 32
-OFP_QUEUE_STATS_REQUEST_BYTES = 8
-OFP_ROLE_REQUEST_BYTES = 16
-OFP_STATS_REPLY_BYTES = 8
-OFP_STATS_REQUEST_BYTES = 8
-OFP_SWITCH_CONFIG_BYTES = 4
-OFP_SWITCH_FEATURES_BYTES = 24
-OFP_TABLE_MOD_BYTES = 8
-OFP_TABLE_STATS_BYTES = 128
-
diff --git a/src/python/of12/error.py b/src/python/of12/error.py
deleted file mode 100644
index 0a1244a..0000000
--- a/src/python/of12/error.py
+++ /dev/null
@@ -1,556 +0,0 @@
-
-# Python OpenFlow error wrapper classes
-
-from cstruct import *
-
-
-
-class hello_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for hello_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_HELLO_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "hello_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_request_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_request error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_REQUEST
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_request_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_action_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_action error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_ACTION
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_action_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_instruction_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_instruction error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_INSTRUCTION
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_instruction_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class bad_match_error_msg(ofp_error_msg):
-    """
-    Wrapper class for bad_match error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_BAD_MATCH
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "bad_match_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for flow_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_FLOW_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for group_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_GROUP_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for port_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_PORT_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_mod_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for table_mod_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_TABLE_MOD_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_mod_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_op_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for queue_op_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_QUEUE_OP_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_op_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class switch_config_failed_error_msg(ofp_error_msg):
-    """
-    Wrapper class for switch_config_failed error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    """
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = OFPET_SWITCH_CONFIG_FAILED
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "switch_config_failed_error_msg\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
diff --git a/src/python/of12/instruction.py b/src/python/of12/instruction.py
deleted file mode 100644
index a945525..0000000
--- a/src/python/of12/instruction.py
+++ /dev/null
@@ -1,143 +0,0 @@
-
-# Python OpenFlow instruction wrapper classes
-
-from cstruct import *
-from action_list import action_list
-
-
-
-class instruction_write_metadata(ofp_instruction_write_metadata):
-    """
-    Wrapper class for write_metadata instruction object
-
-    Data members inherited from ofp_instruction_write_metadata:
-    @arg type
-    @arg len
-    @arg metadata
-    @arg metadata_mask
-
-    """
-    def __init__(self):
-        ofp_instruction_write_metadata.__init__(self)
-        self.type = OFPIT_WRITE_METADATA
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_write_metadata\n"
-        outstr += ofp_instruction_write_metadata.show(self, prefix)
-        return outstr
-
-
-class instruction_goto_table(ofp_instruction_goto_table):
-    """
-    Wrapper class for goto_table instruction object
-
-    Data members inherited from ofp_instruction_goto_table:
-    @arg type
-    @arg len
-    @arg table_id
-
-    """
-    def __init__(self):
-        ofp_instruction_goto_table.__init__(self)
-        self.type = OFPIT_GOTO_TABLE
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_goto_table\n"
-        outstr += ofp_instruction_goto_table.show(self, prefix)
-        return outstr
-
-
-class instruction_write_actions(ofp_instruction_actions):
-    """
-    Wrapper class for write_actions instruction object
-
-    Data members inherited from ofp_instruction_actions:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_instruction_actions.__init__(self)
-        self.type = OFPIT_WRITE_ACTIONS
-        self.actions = action_list()
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_write_actions\n"
-        outstr += ofp_instruction_actions.show(self, prefix)
-        outstr += self.actions.show(prefix)
-        return outstr
-    def unpack(self, binary_string):
-        binary_string = ofp_instruction_actions.unpack(self, binary_string)
-        bytes = self.len - OFP_INSTRUCTION_ACTIONS_BYTES
-        self.actions = action_list()
-        binary_string = self.actions.unpack(binary_string, bytes=bytes)
-        return binary_string
-    def pack(self):
-        self.len = self.__len__()
-        packed = ""
-        packed += ofp_instruction_actions.pack(self)
-        packed += self.actions.pack()
-        return packed
-    def __len__(self):
-        return ofp_instruction_actions.__len__(self) + self.actions.__len__()
-
-
-class instruction_apply_actions(ofp_instruction_actions):
-    """
-    Wrapper class for apply_actions instruction object
-
-    Data members inherited from ofp_instruction_actions:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_instruction_actions.__init__(self)
-        self.type = OFPIT_APPLY_ACTIONS
-        self.actions = action_list()
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_apply_actions\n"
-        outstr += ofp_instruction_actions.show(self, prefix)
-        outstr += self.actions.show(prefix)
-        return outstr
-    def unpack(self, binary_string):
-        binary_string = ofp_instruction_actions.unpack(self, binary_string)
-        bytes = self.len - OFP_INSTRUCTION_ACTIONS_BYTES
-        self.actions = action_list()
-        binary_string = self.actions.unpack(binary_string, bytes=bytes)
-        return binary_string
-    def pack(self):
-        self.len = self.__len__()
-        packed = ""
-        packed += ofp_instruction_actions.pack(self)
-        packed += self.actions.pack()
-        return packed
-    def __len__(self):
-        return ofp_instruction_actions.__len__(self) + self.actions.__len__()
-
-
-class instruction_clear_actions(ofp_instruction):
-    """
-    Wrapper class for clear_actions instruction object
-
-    Data members inherited from ofp_instruction:
-    @arg type
-    @arg len
-
-    """
-    def __init__(self):
-        ofp_instruction.__init__(self)
-        self.type = OFPIT_CLEAR_ACTIONS
-        self.len = self.__len__()
-    def show(self, prefix=''):
-        outstr = prefix + "instruction_clear_actions\n"
-        outstr += ofp_instruction.show(self, prefix)
-        return outstr
-
-instruction_class_list = (
-    instruction_apply_actions,
-    instruction_clear_actions,
-    instruction_goto_table,
-    instruction_write_actions,
-    instruction_write_metadata)
diff --git a/src/python/of12/instruction_list.py b/src/python/of12/instruction_list.py
deleted file mode 100644
index 7b03fbf..0000000
--- a/src/python/of12/instruction_list.py
+++ /dev/null
@@ -1,96 +0,0 @@
-"""
-OpenFlow instruction list class
-"""
-
-import action as action
-import instruction as 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,       
-}
-
-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()))
-        
diff --git a/src/python/of12/match.py b/src/python/of12/match.py
deleted file mode 100644
index c732467..0000000
--- a/src/python/of12/match.py
+++ /dev/null
@@ -1,893 +0,0 @@
-
-# Python OpenFlow instruction wrapper classes
-
-import struct
-import ipaddr
-import socket
-from cstruct import *
-
-
-class oxm_tlv(object):
-    def __init__(self, field, hasmask, length, value, mask=None, 
-        class_ = 0x8000):
-        self.class_ = class_
-        self.field = field
-        self.hasmask = hasmask
-        self.length = length
-        self.value = value
-        self.mask = mask
-    
-    def __eq__(self, other):        
-        return (self.class_ == other.class_ and self.field == other.field 
-                  and self.hasmask == other.hasmask and 
-                  self.length == other.length and self.value == other.value and
-                  self.mask == self.mask)
-
-    def pack(self, assertstruct=True):
-        
-        packed = ""
-        packed += struct.pack("!I", ((self.class_ << 16) | (self.field << 9) | 
-            (self.hasmask << 8) | self.length))
-        if self.length == 1:
-            packed += struct.pack("B", self.value)
-            if self.hasmask:
-                packed += struct.pack("B", self.mask)
-        elif self.length == 2 or (self.length == 4 and self.hasmask == True):
-            packed += struct.pack("!H", self.value)
-            if self.hasmask:
-                packed += struct.pack("!H", self.mask)
-        elif self.length == 4 or (self.length == 8 and self.hasmask == True):
-            packed += struct.pack("!I", self.value)
-            if self.hasmask:
-                packed += struct.pack("!I", self.mask)
-        elif self.length == 6 or self.length == 12:
-            packed += struct.pack("!BBBBBB", self.value[0],self.value[1],
-                self.value[2],self.value[3],self.value[4],self.value[5])
-            if self.hasmask:
-                packed += struct.pack("!BBBBBB", self.mask[0],self.mask[1],
-                    self.mask[2],self.mask[3],self.mask[4],self.mask[5])
-        elif self.length == 8 or (self.length == 16 and self.hasmask == True):
-            packed += struct.pack("!Q", self.value)
-            if self.hasmask:
-                packed += struct.pack("!Q", self.mask)
-        elif self.length == 16 or self.length == 32:
-            packed += self.value.packed
-            if self.hasmask:
-                packed += self.mask.packed
-        return packed
-    
-    def __len__(self):
-        return self.length + 4
-    
-    def show(self, prefix=''):
-        return "\n".join(
-#        ("oxm_tlv_class=" + hex(self.class_),
-        (prefix + "oxm_tlv_class=" + hex(self.class_),
-         prefix + "oxm_tlv_field=" + str(self.field),
-         prefix +"oxm_tlv_hasmask=" + str(bool(self.hasmask)),
-         prefix +"oxm_tlv_length: " + str(self.length) + "\n",))
-        
-
-    subclasses = {}
-
-    def set_value(self, value):
-        self.value = value
-
-    def set_hasmask(self, hasmask):
-        self.hasmask = hasmask
-
-    def set_mask(self, mask):
-        self.mask = mask
-
-    @staticmethod
-    def factory():
-        for subclass in oxm_tlv.__subclasses__():
-            obj = subclass()
-            oxm_tlv.subclasses[obj.field] = subclass
-   
-    @staticmethod
-    def create(field):
-        return oxm_tlv.subclasses[field]()
-
-
-
-def roundup (x,y): 
-    return (((x) + ((y) - 1)) / (y) * (y))
-
-class in_port(oxm_tlv):
-    """
-    Wrapper class for in_port match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_IN_PORT , hasmask, 4, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = in_port\n"
-        outstr += oxm_tlv.show(self, prefix) 
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-
-class in_phy_port(oxm_tlv):
-    """
-    Wrapper class for in_phy_port match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self,OFPXMT_OFB_IN_PHY_PORT, hasmask, 4, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = in_phy_port\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-
-class metadata(oxm_tlv):
-    """
-    Wrapper class for metadata match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, mask =None):
-        if mask == None:
-            oxm_tlv.__init__(self, OFPXMT_OFB_METADATA, False, 8, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_METADATA, True, 16, value, mask)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = metadata\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-class eth_dst(oxm_tlv):
-    """
-    Wrapper class for eth_dst match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, mask=None):
-        if mask == None:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ETH_DST, False, 6, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ETH_DST, True, 12, value, mask)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = eth_dst\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + ":".join(["%.2x" %x 
-            for x in self.value]) +"\n"
-        return outstr
-  
-class eth_src(oxm_tlv):
-    """
-    Wrapper class for eth_src match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ETH_SRC, hasmask, 6, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ETH_SRC, hasmask, 12, 
-                value, mask)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = eth_src\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + ":".join(["%.2x" %x 
-            for x in self.value]) +"\n"
-        return outstr
-
-class eth_type(oxm_tlv):
-    """
-    Wrapper class for eth_type match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_ETH_TYPE, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = eth_type\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + hex(self.value) +"\n"
-        return outstr
-
-class vlan_vid(oxm_tlv):
-    """
-    Wrapper class for vlan_vid match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_VLAN_VID, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = vlan_vid\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-class vlan_pcp(oxm_tlv):
-    """
-    Wrapper class for vlan_pcp match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_VLAN_PCP, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = vlan_pcp\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-        
-class ip_dscp(oxm_tlv):
-    """
-    Wrapper class for ip_dscp match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_IP_DSCP, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = ip_dscp\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-class ip_ecn(oxm_tlv):
-    """
-    Wrapper class for ip_dscp match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_IP_ECN, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = ip_ecn\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"        
-        return outstr
-
-class ip_proto(oxm_tlv):
-    """
-    Wrapper class for ip_proto match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_IP_PROTO, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = ip_proto\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-class ipv4_src(oxm_tlv):
-    """
-    Wrapper class for ipv4_src match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_SRC, hasmask, 4, value)
-        else: 
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_SRC, hasmask, 4, value, mask)
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv4_src\n"
-        outstr += oxm_tlv.show(self, prefix)
-        #Value can be a long int or a string        
-        try:
-            addr = ipaddr.IPv4Address(self.value)
-        except ValueError:
-            addr = ipaddr.IPv4Address(int(self.value, 16))
-        outstr += prefix + "value = " + str(addr) +"\n"
-        return outstr
-
-class ipv4_dst(oxm_tlv):
-    """
-    Wrapper class for ipv4_dst match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_DST, hasmask, 4, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_DST, hasmask, 4, value, mask)
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv4_dst\n"
-        outstr += oxm_tlv.show(self, prefix)
-        #Value can be a long int or a string
-        #try:
-        addr = ipaddr.IPv4Address(self.value)
-        #except ValueError:
-         #   addr = ipaddr.IPv4Address(int(self.value, 16))
-        outstr += prefix + "value = " + str(addr) +"\n"
-        return outstr
-        
-class tcp_src(oxm_tlv):
-    """
-    Wrapper class for tcp_src match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_TCP_SRC, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = tcp_src\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-class tcp_dst(oxm_tlv):
-    """
-    Wrapper class for tcp_src match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_TCP_DST, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = tcp_dst\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr      
-
-class udp_src(oxm_tlv):
-    """
-    Wrapper class for udp_src match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_UDP_SRC, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = udp_src\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr   
-        
-class udp_dst(oxm_tlv):
-    """
-    Wrapper class for udp_dst match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_UDP_DST, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = udp_dst\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr 
-        
-class sctp_src(oxm_tlv):
-    """
-    Wrapper class for sctp_src match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_SCTP_SRC, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = sctp_src\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr  
-
-
-class sctp_dst(oxm_tlv):
-    """
-    Wrapper class for sctp_dst match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_SCTP_DST, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = sctp_dst\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr         
-  
-class icmpv4_type(oxm_tlv):
-    """
-    Wrapper class for icmpv4_type match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV4_TYPE, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = icmpv4_type\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr          
-
-class icmpv4_code(oxm_tlv):
-    """
-    Wrapper class for icmpv4_code match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV4_CODE, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = icmpv4_code\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outs
-        
-class arp_op(oxm_tlv):
-    """
-    Wrapper class for arp_op match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_ARP_OP, hasmask, 2, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = arp_op\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outs
-
-class arp_spa(oxm_tlv):
-    """
-    Wrapper class for arp_spa match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SPA, hasmask, 4, value)
-        else: 
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SPA, hasmask, 4, value, mask)
-    def show(self, prefix=''):
-        outstr = prefix + "name = arp_spa\n"
-        #Value can be a long int or a string        
-        try:
-            addr = ipaddr.IPv4Address(self.value)
-        except ValueError:
-            addr = ipaddr.IPv4Address(int(self.value, 16))        
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(addr) +"\n"        
-        return outstr
-        
-class arp_tpa(oxm_tlv):
-    """
-    Wrapper class for arp_tpa match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_TPA, hasmask, 4, value)
-        else: 
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_TPA, hasmask, 4, value, mask)
-    def show(self, prefix=''):
-        outstr = prefix + "name = arp_tpa\n"
-        #Value can be a long int or a string        
-        try:
-            addr = ipaddr.IPv4Address(self.value)
-        except ValueError:
-            addr = ipaddr.IPv4Address(int(self.value, 16))
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + ":".join(["%.2x" %x 
-            for x in self.value]) +"\n"                           
-        return outstr
-
-
-class arp_sha(oxm_tlv):
-    """
-    Wrapper class for arp_sha match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SHA, hasmask, 6, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SHA, hasmask, 12, value)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = arp_sha\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + ":".join(["%.2x" %x 
-            for x in self.value]) +"\n"        
-        return outstr
- 
-class arp_tha(oxm_tlv):
-    """
-    Wrapper class for arp_tha match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_THA, hasmask, 6, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_ARP_THA, hasmask, 12, value)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = arp_tha\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-        
-class ipv6_src(oxm_tlv):
-    """
-    Wrapper class for ipv6_src match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_SRC, False, 16, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_SRC, True, 32, value)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv6_src\n"
-        try:
-            addr = ipaddr.IPv6Address(self.value)
-        except ValueError:
-            addr = ipaddr.IPv6Address(int(self.value, 16))             
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(addr) +"\n"        
-        return outstr
-        
-class ipv6_dst(oxm_tlv):
-    """
-    Wrapper class for ipv6_dst match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_DST, False, 16, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_DST, True, 32, value)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv6_dst\n"
-        try:
-            addr = ipaddr.IPv6Address(self.value)
-        except ValueError:
-            addr = ipaddr.IPv6Address(int(self.value, 16))             
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(addr) +"\n"        
-        return outstr
- 
-class ipv6_flabel(oxm_tlv):
-    """
-    Wrapper class for ipv6_flabel match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        if not hasmask:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_FLABEL, hasmask, 4, value)
-        else:
-            oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_FLABEL, hasmask, 8, value)            
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv6_flabel\n"
-        outstr += oxm_tlv.show(self, prefix)
-        return outstr
-
-class icmpv6_type(oxm_tlv):
-    """
-    Wrapper class for icmpv6_type match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV6_TYPE, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = icmpv6_type\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr          
-
-class icmpv6_code(oxm_tlv):
-    """
-    Wrapper class for icmpv6_code match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV6_CODE, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = icmpv6_code\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outs
-
-class ipv6_nd_target(oxm_tlv):
-    """
-    Wrapper class for ipv6_nd_target match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_ND_TARGET, hasmask, 16, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv6_nd_target\n"
-        try:
-            addr = ipaddr.IPv6Address(self.value)
-        except ValueError:
-            addr = ipaddr.IPv6Address(int(self.value, 16))             
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(addr) +"\n"    
-        return outstr
-        
-class ipv6_nd_sll(oxm_tlv):
-    """
-    Wrapper class for ipv6_nd_sll match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_ND_SLL, hasmask, 6, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv6_nd_sll\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-class ipv6_nd_tll(oxm_tlv):
-    """
-    Wrapper class for ipv6_nd_tll match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_ND_TLL, hasmask, 6, value)          
-    def show(self, prefix=''):
-        outstr = prefix + "name = ipv6_nd_tll\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-class mpls_label(oxm_tlv):
-    """
-    Wrapper class for mpls_label match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_MPLS_LABEL, hasmask, 4, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = mpls_label\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-        
-class mpls_tc(oxm_tlv):
-    """
-    Wrapper class for mpls_ltc match object
-
-    Data members inherited from oxm_tlv:
-    @arg class
-    @arg field
-    @arg hasmask
-    @arg body
-
-    """
-    def __init__(self, value=None, hasmask=False):
-        oxm_tlv.__init__(self, OFPXMT_OFB_MPLS_TC, hasmask, 1, value)
-    def show(self, prefix=''):
-        outstr = prefix + "name = mpls_tc\n"
-        outstr += oxm_tlv.show(self, prefix)
-        outstr += prefix + "value = " + str(self.value) +"\n"
-        return outstr
-
-match_class_list = (
-    in_port,
-    in_phy_port,
-    metadata,
-    eth_dst,
-    eth_src,
-    eth_type,
-    vlan_vid,
-    vlan_pcp,
-    ip_dscp,
-    ip_ecn,
-    ip_proto,
-    ipv4_src,
-    ipv4_dst,
-    tcp_src,
-    tcp_dst,
-    udp_src,
-    udp_dst,
-    sctp_src,
-    sctp_dst,
-    icmpv4_type,
-    icmpv4_code,
-    arp_op,
-    arp_spa,
-    arp_tpa,
-    arp_sha,
-    arp_tha,
-    ipv6_src,
-    ipv6_dst,
-    ipv6_flabel,
-    icmpv6_type,
-    icmpv6_code,
-    ipv6_nd_target,
-    ipv6_nd_sll,
-    ipv6_nd_tll,
-    mpls_label,
-    mpls_tc)
diff --git a/src/python/of12/match_list.py b/src/python/of12/match_list.py
deleted file mode 100644
index 7a50c75..0000000
--- a/src/python/of12/match_list.py
+++ /dev/null
@@ -1,90 +0,0 @@
-import struct
-import binascii
-import match as match
-from match import oxm_tlv 
-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 __eq__(self, other):
-        self.tlvs.sort(key=lambda x: x.field); 
-        other.tlvs.sort(key=lambda x: x.field);
-        return self.tlvs == other.tlvs
-
-    def unpack(self, binary_string, bytes=None):
-        oxm_tlv.factory()
-        if bytes <= 4:
-            return binary_string[4:]
-        if bytes == None:
-            bytes = len(binary_string)
-        offset = 0
-        cur_string = binary_string
-        part = lambda: cur_string[read+4:read+4+oxm_length]
-        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
-
-            if oxm_length == 1:
-                if oxm_hasmask:
-                    value, mask = struct.unpack("BB", part())[:2]
-                else: 
-                    value = struct.unpack("!B", part())[0]
-                    mask = None
-            elif  oxm_length == 2 or (oxm_length == 4 and oxm_hasmask == True):
-                if oxm_hasmask:
-                    value, mask = struct.unpack("!HH", part())[:2]
-                else:
-                    value = struct.unpack("!H", part())[0]
-                    mask = None    
-            elif oxm_length == 4 or (oxm_length == 8 and oxm_hasmask == True):
-                if oxm_hasmask:
-                    value, mask = struct.unpack("!II", part())[:2]
-                else: 
-                    value = struct.unpack("!I", part())[0]
-                    mask = None
-            elif oxm_length == 6 or oxm_length == 12:
-                if oxm_hasmask:
-                    data = struct.unpack("!12B", part())[0]
-                    value, mask = data[:6], data[6:]
-                else:
-                    value =  list(struct.unpack("!6B", part()))
-                    mask = None
-            elif oxm_length == 8 or (oxm_length == 16 and oxm_hasmask == True):
-                if oxm_hasmask:
-                    value, mask = struct.unpack("!QQ", part())[0]
-                else: 
-                    value = struct.unpack("!Q", part())[0]
-                    mask = None
-            elif oxm_length == 16 or oxm_length == 32:
-                if oxm_hasmask:
-                    data =  struct.unpack("!32s", part())[0]
-                    value, mask = data[:16], data[16:]
-                else:
-                    value =  struct.unpack("!16s", part())[0]
-                    mask = None             
-          
-            oxm = oxm_tlv.create(oxm_field)
-            oxm.set_hasmask(oxm_hasmask)
-            oxm.set_value(value)
-            oxm.set_mask(mask)
-            self.tlvs.append(oxm)
-            read = 4 + oxm_length
-            offset += read
-            cur_string = cur_string[read:]   
-        return cur_string
diff --git a/src/python/of12/message.py b/src/python/of12/message.py
deleted file mode 100644
index b8fb9b8..0000000
--- a/src/python/of12/message.py
+++ /dev/null
@@ -1,4015 +0,0 @@
-
-# Python OpenFlow message wrapper classes
-
-from cstruct import *
-from match import oxm_tlv
-from match import roundup
-from match_list import match_list
-from action_list import action_list
-from instruction_list import instruction_list
-from bucket_list import bucket_list
-from error import *
-
-# Define templates for documentation
-class ofp_template_msg(object):
-    """
-    Sample base class for template_msg; normally auto generated
-    This class should live in the of_header name space and provides the
-    base class for this type of message.  It will be wrapped for the
-    high level API.
-
-    """
-    def __init__(self, **kwargs):
-        """
-        Constructor for base class
-
-        """
-        self.header = ofp_header()
-        # Additional base data members declared here
-
-    # Normally will define pack, unpack, __len__ functions
-
-class template_msg(ofp_template_msg):
-    """
-    Sample class wrapper for template_msg
-    This class should live in the of_message name space and provides the
-    high level API for an OpenFlow message object.  These objects must
-    implement the functions indicated in this template.
-
-    """
-    def __init__(self, **kwargs):
-        """
-        Constructor
-        Must set the header type value appropriately for the message
-
-        """
-
-        ##@var header
-        # OpenFlow message header: length, version, xid, type
-        ofp_template_msg.__init__(self)
-        self.header = ofp_header()
-        # For a real message, will be set to an integer
-        self.header.type = "TEMPLATE_MSG_VALUE"
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        pass
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-
-        @return Typically returns the remainder of binary_string that
-        was not parsed.  May give a warning if that string is non-empty
-
-        """
-        pass
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        pass
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-        pass
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        pass
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        pass
-
-
-################################################################
-#
-# OpenFlow Message Definitions
-#
-################################################################
-
-class barrier_reply(object):
-    """
-    Wrapper class for barrier_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_BARRIER_REPLY=21)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_BARRIER_REPLY
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'barrier_reply (OFPT_BARRIER_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class barrier_request(object):
-    """
-    Wrapper class for barrier_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_BARRIER_REQUEST=20)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_BARRIER_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'barrier_request (OFPT_BARRIER_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class echo_reply(object):
-    """
-    Wrapper class for echo_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ECHO_REPLY=3)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_ECHO_REPLY
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'echo_reply (OFPT_ECHO_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class echo_request(object):
-    """
-    Wrapper class for echo_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ECHO_REQUEST=2)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_ECHO_REQUEST
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'echo_request (OFPT_ECHO_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class error(ofp_error_msg):
-    """
-    Wrapper class for error
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ERROR=1)
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_error_msg.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'error (OFPT_ERROR)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_error_msg.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class experimenter(ofp_experimenter_header):
-    """
-    Wrapper class for experimenter
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_EXPERIMENTER=4)
-
-    Data members inherited from ofp_experimenter_header:
-    @arg experimenter
-    @arg exp_type
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_experimenter_header.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_EXPERIMENTER
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_experimenter_header.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_experimenter_header.unpack(self, binary_string)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_experimenter_header.__len__(self)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'experimenter (OFPT_EXPERIMENTER)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_experimenter_header.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_experimenter_header.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class features_reply(ofp_switch_features):
-    """
-    Wrapper class for features_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FEATURES_REPLY=6)
-
-    Data members inherited from ofp_switch_features:
-    @arg datapath_id
-    @arg n_buffers
-    @arg n_tables
-    @arg capabilities
-    @arg reserved
-    @arg ports: Variable length array of TBD
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_switch_features.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FEATURES_REPLY
-        self.ports = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_features.pack(self)
-        for obj in self.ports:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_features.unpack(self, binary_string)
-        while len(binary_string) >= OFP_PORT_BYTES:
-            new_port = ofp_port()
-            binary_string = new_port.unpack(binary_string)
-            self.ports.append(new_port)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_features.__len__(self)
-        for obj in self.ports:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'features_reply (OFPT_FEATURES_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_features.show(self, prefix)
-        outstr += prefix + "Array ports\n"
-        for obj in self.ports:
-            outstr += obj.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_features.__eq__(self, other): return False
-        if self.ports != other.ports: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class features_request(object):
-    """
-    Wrapper class for features_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FEATURES_REQUEST=5)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_FEATURES_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'features_request (OFPT_FEATURES_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class flow_mod(ofp_flow_mod):
-    """
-    Wrapper class for flow_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FLOW_MOD=14)
-
-    Data members inherited from ofp_flow_mod:
-    @arg cookie
-    @arg cookie_mask
-    @arg table_id
-    @arg command
-    @arg idle_timeout
-    @arg hard_timeout
-    @arg priority
-    @arg buffer_id
-    @arg out_port
-    @arg out_group
-    @arg flags
-    @arg match
-    @arg instructions: Object of type instruction_list
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_flow_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FLOW_MOD
-        self.buffer_id = 0xffffffff   #no buffer
-        self.out_port = OFPP_ANY
-        self.out_group = OFPG_ANY
-        self.match_fields = match_list()
-        self.instructions = instruction_list()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        if not len(self.match_fields):
-            tlv_pad = oxm_tlv(0,0,0,0,0,0)
-            self.match_fields.tlvs.append(tlv_pad)
-        else:
-            if len(self.match_fields) > 4:
-                self.match.length +=  len(self.match_fields)
-        packed = self.header.pack() 
-        packed += ofp_flow_mod.pack(self)
-        self.match_fields.tlvs.sort(key=lambda x : x.field)
-        packed += self.match_fields.pack()
-        padding_size = roundup( len(self.match) + len(self.match_fields),8) - (len(self.match) + len(self.match_fields))
-        padding = [0] * padding_size
-        if padding_size:
-            packed += struct.pack("!" + str(padding_size) + "B", *padding)
-        packed += self.instructions.pack()
-        return packed
-
-
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_flow_mod.unpack(self, binary_string)
-        binary_string = self.match_fields.unpack(binary_string, bytes = self.match.length - 4)
-        padding = roundup(OFP_FLOW_MOD_BYTES + len(self.match_fields),8) - (OFP_FLOW_MOD_BYTES + len(self.match_fields))
-        if padding:
-            binary_string = binary_string[padding:]
-        ai_len = self.length - roundup(OFP_FLOW_MOD_BYTES + len(self.match_fields),8)
-        binary_string = self.instructions.unpack(binary_string, bytes=ai_len)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_flow_mod.__len__(self)
-        length = roundup(length + len(self.match_fields), 8)
-        length += len(self.instructions)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'flow_mod (OFPT_FLOW_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_flow_mod.show(self, prefix)
-        outstr += self.match_fields.show(prefix + '  ')
-        outstr += prefix + "List instructions\n"
-        outstr += self.instructions.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_flow_mod.__eq__(self, other): return False
-        if self.match_fields != other.match_fields: return False
-        if self.instructions != other.instructions: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class flow_removed(ofp_flow_removed):
-    """
-    Wrapper class for flow_removed
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_FLOW_REMOVED=11)
-
-    Data members inherited from ofp_flow_removed:
-    @arg cookie
-    @arg priority
-    @arg reason
-    @arg table_id
-    @arg duration_sec
-    @arg duration_nsec
-    @arg idle_timeout
-    @arg hard_timeout
-    @arg packet_count
-    @arg byte_count
-    @arg match
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_flow_removed.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_FLOW_REMOVED
-        self.match_fields = match_list()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        if not len(self.match_fields):
-            tlv_pad = oxm_tlv(0,0,0,0,0,0)
-            self.match.length += 4
-            self.match_fields.tlvs.append(tlv_pad)
-        else:
-            if len(self.match_fields) > 4:
-                self.match.length +=  len(self.match_fields)
-        packed = self.header.pack()
-        packed += ofp_flow_removed.pack(self)
-        packed += self.match_fields.pack()
-        padding_size = roundup( len(self.match) + len(self.match_fields),8) - (len(self.match) + len(self.match_fields))
-        padding = [0] * padding_size
-        if padding_size:
-            packed += struct.pack("!" + str(padding_size) + "B", *padding)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_flow_removed.unpack(self, binary_string)
-        binary_string = self.match_fields.unpack(binary_string, bytes = self.match.length - 4)
-        padding = roundup(OFP_FLOW_REMOVED_BYTES + len(self.match_fields),8) - (OFP_FLOW_REMOVED_BYTES + len(self.match_fields))
-        if padding:
-            binary_string = binary_string[padding:]
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-        length += roundup(ofp_flow_removed.__len__(self) + len(self.match_fields),8)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'flow_removed (OFPT_FLOW_REMOVED)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_flow_removed.show(self, prefix)
-        outstr += self.match_fields.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-        if not ofp_flow_removed.__eq__(self, other): return False
-        if self.match_fields != other.match_fields: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class get_config_reply(ofp_switch_config):
-    """
-    Wrapper class for get_config_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GET_CONFIG_REPLY=8)
-
-    Data members inherited from ofp_switch_config:
-    @arg flags
-    @arg miss_send_len
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_switch_config.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_GET_CONFIG_REPLY
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_config.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_config.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_config.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'get_config_reply (OFPT_GET_CONFIG_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_config.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_config.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class get_config_request(object):
-    """
-    Wrapper class for get_config_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GET_CONFIG_REQUEST=7)
-
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_GET_CONFIG_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'get_config_request (OFPT_GET_CONFIG_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class group_mod(ofp_group_mod):
-    """
-    Wrapper class for group_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_GROUP_MOD=15)
-
-    Data members inherited from ofp_group_mod:
-    @arg command
-    @arg type
-    @arg group_id
-    @arg buckets: Object of type bucket_list
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_group_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_GROUP_MOD
-        self.buckets = bucket_list()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_group_mod.pack(self)
-        packed += self.buckets.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_group_mod.unpack(self, binary_string)
-        binary_string = self.buckets.unpack(binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_group_mod.__len__(self)
-        length += len(self.buckets)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'group_mod (OFPT_GROUP_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_group_mod.show(self, prefix)
-        outstr += prefix + "List buckets\n"
-        outstr += self.buckets.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_group_mod.__eq__(self, other): return False
-        if self.buckets != other.buckets: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class hello(object):
-    """
-    Wrapper class for hello
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_HELLO=0)
-
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        self.header.type = OFPT_HELLO
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'hello (OFPT_HELLO)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class packet_in(ofp_packet_in):
-    """
-    Wrapper class for packet_in
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PACKET_IN=10)
-
-    Data members inherited from ofp_packet_in:
-    @arg buffer_id
-    @arg total_len
-    @arg reason
-    @arg table_id
-    @arg match
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_packet_in.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PACKET_IN
-        self.match_fields =  match_list()
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        if len(self.match_fields) < 4:
-            tlv_pad = oxm_tlv(0,0,0,0,0,0)
-            self.match.length += 4
-            self.match_fields.tlvs.append(tlv_pad)
-        else:
-            if len(self.match_fields) > 4:
-                self.match.length +=  len(self.match_fields)
-        packed = self.header.pack()
-        packed += ofp_packet_in.pack(self)
-        packed += self.match_fields.pack()
-        padding_size = roundup( len(self.match) + len(self.match_fields),8) - (len(self.match) + len(self.match_fields))
-        padding = [0] * padding_size
-        if padding_size:
-            packed += struct.pack("!" + str(padding_size) + "B", *padding)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_packet_in.unpack(self, binary_string)
-        binary_string = self.match_fields.unpack(binary_string, bytes = self.match.length - 4)
-        padding = roundup(OFP_PACKET_IN_BYTES + len(self.match_fields),8) - (OFP_PACKET_IN_BYTES + len(self.match_fields))
-        if padding:
-            binary_string = binary_string[padding:]
-        binary_string = binary_string[2:]
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += roundup(ofp_packet_in.__len__(self) + len(self.match_fields),8)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'packet_in (OFPT_PACKET_IN)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_packet_in.show(self, prefix)
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_packet_in.__eq__(self, other): return False
-        if self.data != other.data: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class packet_out(ofp_packet_out):
-    """
-    Wrapper class for packet_out
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PACKET_OUT=13)
-
-    Data members inherited from ofp_packet_out:
-    @arg buffer_id
-    @arg in_port
-    @arg actions_len
-    @arg actions: Object of type action_list
-    @arg data: Binary string following message members
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_packet_out.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PACKET_OUT
-        self.actions = []
-        self.data = ""
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-        self.actions = action_list(self.actions)
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        self.actions_len = len(self.actions)
-        packed += ofp_packet_out.pack(self)
-        packed += self.actions.pack()
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_packet_out.unpack(self, binary_string)
-        binary_string = self.actions.unpack(binary_string, bytes=self.actions_len)
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_packet_out.__len__(self)
-        length += len(self.actions)
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'packet_out (OFPT_PACKET_OUT)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_packet_out.show(self, prefix)
-        outstr += prefix + "List actions\n"
-        outstr += self.actions.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        ##@todo Fix this circular reference
-        # if len(self.data) > 0:
-            # obj = of_message_parse(self.data)
-            # if obj != None:
-                # outstr += obj.show(prefix)
-            # else:
-                # outstr += prefix + "Unable to parse data\n"
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_packet_out.__eq__(self, other): return False
-        if self.data != other.data: return False
-        if self.actions != other.actions: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class port_mod(ofp_port_mod):
-    """
-    Wrapper class for port_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PORT_MOD=16)
-
-    Data members inherited from ofp_port_mod:
-    @arg port_no
-    @arg hw_addr
-    @arg config
-    @arg mask
-    @arg advertise
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_port_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PORT_MOD
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_port_mod.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_port_mod.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_port_mod.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'port_mod (OFPT_PORT_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_port_mod.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_port_mod.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class port_status(ofp_port_status):
-    """
-    Wrapper class for port_status
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_PORT_STATUS=12)
-
-    Data members inherited from ofp_port_status:
-    @arg reason
-    @arg desc
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_port_status.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_PORT_STATUS
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_port_status.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_port_status.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_port_status.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'port_status (OFPT_PORT_STATUS)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_port_status.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_port_status.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class queue_get_config_reply(ofp_queue_get_config_reply):
-    """
-    Wrapper class for queue_get_config_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_QUEUE_GET_CONFIG_REPLY=23)
-
-    Data members inherited from ofp_queue_get_config_reply:
-    @arg port
-    @arg queues: Variable length array of TBD
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_queue_get_config_reply.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_QUEUE_GET_CONFIG_REPLY
-        self.queues = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_queue_get_config_reply.pack(self)
-        for obj in self.queues:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_queue_get_config_reply.unpack(self, binary_string)
-        for obj in self.queues:
-            binary_string = obj.unpack(binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_queue_get_config_reply.__len__(self)
-        for obj in self.queues:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'queue_get_config_reply (OFPT_QUEUE_GET_CONFIG_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_queue_get_config_reply.show(self, prefix)
-        outstr += prefix + "Array queues\n"
-        for obj in self.queues:
-            outstr += obj.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_queue_get_config_reply.__eq__(self, other): return False
-        if self.queues != other.queues: return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class queue_get_config_request(ofp_queue_get_config_request):
-    """
-    Wrapper class for queue_get_config_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_QUEUE_GET_CONFIG_REQUEST=22)
-
-    Data members inherited from ofp_queue_get_config_request:
-    @arg port
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_queue_get_config_request.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_QUEUE_GET_CONFIG_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_queue_get_config_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_queue_get_config_request.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_queue_get_config_request.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'queue_get_config_request (OFPT_QUEUE_GET_CONFIG_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_queue_get_config_request.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_queue_get_config_request.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class set_config(ofp_switch_config):
-    """
-    Wrapper class for set_config
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_SET_CONFIG=9)
-
-    Data members inherited from ofp_switch_config:
-    @arg flags
-    @arg miss_send_len
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_switch_config.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_SET_CONFIG
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_switch_config.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_switch_config.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_switch_config.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'set_config (OFPT_SET_CONFIG)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_switch_config.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_switch_config.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for stats_reply
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_STATS_REPLY=19)
-
-    Data members inherited from ofp_stats_reply:
-    @arg type
-    @arg flags
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_stats_reply.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_STATS_REPLY
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_stats_reply.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_stats_reply.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'stats_reply (OFPT_STATS_REPLY)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_stats_reply.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class stats_request(ofp_stats_request):
-    """
-    Wrapper class for stats_request
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_STATS_REQUEST=18)
-
-    Data members inherited from ofp_stats_request:
-    @arg type
-    @arg flags
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_stats_request.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_STATS_REQUEST
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_stats_request.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'stats_request (OFPT_STATS_REQUEST)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_stats_request.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-class table_mod(ofp_table_mod):
-    """
-    Wrapper class for table_mod
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (3)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_TABLE_MOD=17)
-
-    Data members inherited from ofp_table_mod:
-    @arg table_id
-    @arg config
-
-    """
-
-    def __init__(self, **kwargs):
-        ofp_table_mod.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_TABLE_MOD
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-
-    def pack(self):
-        """
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack()
-
-        packed += ofp_table_mod.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        binary_string = ofp_table_mod.unpack(self, binary_string)
-        # Fixme: If no self.data, add check for data remaining
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += ofp_table_mod.__len__(self)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'table_mod (OFPT_TABLE_MOD)\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_table_mod.show(self, prefix)
-        return outstr
-
-    def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if not ofp_table_mod.__eq__(self, other): return False
-        return True
-
-    def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
-        return not self.__eq__(other)
-    
-
-
-################################################################
-#
-# Stats request and reply subclass definitions
-#
-################################################################
-
-
-# Stats request bodies for desc and table stats are not defined in the
-# OpenFlow header;  We define them here.  They are empty classes, really
-
-class ofp_desc_stats_request(object):
-    """
-    Forced definition of ofp_desc_stats_request (empty class)
-    """
-    def __init__(self, **kwargs):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_desc_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_DESC_STATS_REQUEST_BYTES = 0
-
-class ofp_table_stats_request(object):
-    """
-    Forced definition of ofp_table_stats_request (empty class)
-    """
-    def __init__(self, **kwargs):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_table_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_TABLE_STATS_REQUEST_BYTES = 0
-
-class ofp_group_desc_stats_request(object):
-    """
-    Forced definition of ofp_group_desc_stats_request (empty class)
-    """
-    def __init__(self, **kwargs):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_group_desc_stats_request (empty)\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_GROUP_DESC_STATS_REQUEST_BYTES = 0
-
-
-
-# Stats entries define the content of one element in a stats
-# reply for the indicated type; define _entry for consistency
-
-aggregate_stats_entry = ofp_aggregate_stats_reply
-desc_stats_entry = ofp_desc_stats
-port_stats_entry = ofp_port_stats
-queue_stats_entry = ofp_queue_stats
-table_stats_entry = ofp_table_stats
-group_stats_entry = ofp_group_stats
-group_desc_stats_entry = ofp_group_desc_stats
-
-
-#
-# Flow stats entry contains an action list of variable length, so
-# it is done by hand
-#
-
-class flow_stats_entry(ofp_flow_stats):
-    """
-    Special case flow stats entry to handle action list object
-    """
-    def __init__(self, **kwargs):
-        ofp_flow_stats.__init__(self)
-        self.match_fields = match_list()
-        self.instructions = instruction_list()
-
-    def pack(self, assertstruct=True):
-        self.length = len(self)
-        if not len(self.match_fields):
-            tlv_pad = oxm_tlv(0,0,0,0,0,0)
-            self.match.length += 4
-            self.match_fields.tlvs.append(tlv_pad)
-        else:
-            if len(self.match_fields) > 4:
-                self.match.length +=  len(self.match_fields)      
-        packed = ofp_flow_stats.pack(self, assertstruct)
-        packed += self.match_fields.pack()
-        padding_size = roundup(len(self.match) + len(self.match_fields),8) - (len(self.match) + len(self.match_fields))
-        padding = [0] * padding_size
-        if padding_size:
-            packed += struct.pack("!" + str(padding_size) + "B", *padding)
-        packed += self.instructions.pack()
-        if len(packed) != self.length:
-            print("ERROR: flow_stats_entry pack length not equal",
-                  self.length, len(packed))
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = ofp_flow_stats.unpack(self, binary_string)
-        binary_string = self.match_fields.unpack(binary_string, bytes = self.match.length - 4)
-        padding = roundup((OFP_FLOW_STATS_BYTES -4) + self.match.length,8) - ((OFP_FLOW_STATS_BYTES - 4) + self.match.length)
-        if padding:
-            binary_string = binary_string[padding:]
-        ai_len = self.length - roundup(OFP_FLOW_STATS_BYTES + len(self.match_fields),8)
-        if ai_len < 0:
-            print("ERROR: flow_stats_entry unpack length too small",
-                  self.length)
-        binary_string = self.instructions.unpack(binary_string, bytes=ai_len)
-        return binary_string
-
-    def __len__(self):
-        return roundup(OFP_FLOW_STATS_BYTES + len(self.match_fields),8) + len(self.instructions)
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_entry\n"
-        outstr += ofp_flow_stats.show(self, prefix + '  ')
-        outstr += self.match_fields.show(prefix + '  ')
-        outstr += self.instructions.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (ofp_flow_stats.__eq__(self, other) and 
-                self.instructions == other.instructions)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class aggregate_stats_request(ofp_stats_request, ofp_aggregate_stats_request):
-    """
-    Wrapper class for aggregate stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_aggregate_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_AGGREGATE
-        self.match_fields = match_list()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-        
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        if not len(self.match_fields):
-            tlv_pad = oxm_tlv(0,0,0,0,0,0)
-            self.match.length += 4
-            self.match_fields.tlvs.append(tlv_pad)
-        else:
-            if len(self.match_fields) > 4:
-                self.match.length +=  len(self.match_fields)      
-        packed += ofp_aggregate_stats_request.pack(self, assertstruct)
-        packed += self.match_fields.pack()
-        padding_size = roundup(len(self.match) + len(self.match_fields),8) - (len(self.match) + len(self.match_fields))
-        padding = [0] * padding_size
-        
-        if padding_size:
-            packed += struct.pack("!" + str(padding_size) + "B", *padding)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_aggregate_stats_request.unpack(self, binary_string)
-        binary_string = self.match_fields.unpack(binary_string, bytes = self.match.length - 4)
-        padding = roundup(OFP_AGGREGATE_STATS_REQUEST_BYTES + len(self.match_fields),8) - (OFP_AGGREGATE_STATS_REQUEST_BYTES + len(self.match_fields))
-        if padding:
-            binary_string = binary_string[padding:]
-        if len(binary_string) != 0:
-            print "ERROR unpacking flow: extra data"
-        return binary_string
-    
-    
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REQUEST_BYTES + \
-                     OFP_AGGREGATE_STATS_REQUEST_BYTES
-        if not len(self.match_fields):
-            return length + 4            
-        else:
-            return  roundup(length + len(self.match_fields),8) 
-
-    def show(self, prefix=''):
-        outstr = prefix + "aggregate_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_aggregate_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_aggregate_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class aggregate_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for aggregate stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_AGGREGATE
-        # stats: Array of type aggregate_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = aggregate_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = aggregate_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking aggregate stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "aggregate_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class desc_stats_request(ofp_stats_request, ofp_desc_stats_request):
-    """
-    Wrapper class for desc stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_desc_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_DESC
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_desc_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_desc_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking desc: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_DESC_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "desc_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_desc_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_desc_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class desc_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for desc stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_DESC
-        # stats: Array of type desc_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = desc_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = desc_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking desc stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "desc_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_stats_request(ofp_stats_request, ofp_flow_stats_request):
-    """
-    Wrapper class for flow stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_flow_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_FLOW
-        self.match_fields = match_list()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        if not len(self.match_fields):
-            tlv_pad = oxm_tlv(0,0,0,0,0,0)
-            self.match.length += 4
-            self.match_fields.tlvs.append(tlv_pad)
-        else:
-            if len(self.match_fields) > 4:
-                self.match.length +=  len(self.match_fields)       
-        packed += ofp_flow_stats_request.pack(self)
-        packed += self.match_fields.pack()
-        padding_size = roundup(len(self.match) + len(self.match_fields),8) - (len(self.match) + len(self.match_fields))
-        padding = [0] * padding_size
-        if padding_size:
-            packed += struct.pack("!" + str(padding_size) + "B", *padding)  
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_flow_stats_request.unpack(self, binary_string)
-        binary_string = self.match_fields.unpack(binary_string, bytes = self.match.length - 4)
-        padding = roundup(OFP_FLOW_STATS_REQUEST_BYTES + len(self.match_fields),8) - (OFP_FLOW_STATS_REQUEST_BYTES + len(self.match_fields))
-        if padding:
-            binary_string = binary_string[padding:]
-        if len(binary_string) != 0:
-            print "ERROR unpacking flow: extra data"
-        return binary_string
-
-    def __len__(self):
-            length = len(self.header) + OFP_STATS_REQUEST_BYTES + \
-                     OFP_FLOW_STATS_REQUEST_BYTES
-            if not len(self.match_fields):
-               return length + 4            
-            else:
-               return  roundup(length + len(self.match_fields),8) 
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_flow_stats_request.show(self)
-        outstr += self.match_fields.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_flow_stats_request.__eq__(self, other) and
-                self.match_fields != other.match_fields)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class flow_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for flow stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_FLOW
-        # stats: Array of type flow_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = flow_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = flow_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking flow stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_stats_request(ofp_stats_request, ofp_port_stats_request):
-    """
-    Wrapper class for port stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_port_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_PORT
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_port_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_port_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking port: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_PORT_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_port_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_port_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class port_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for port stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_PORT
-        # stats: Array of type port_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = port_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = port_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking port stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "port_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_stats_request(ofp_stats_request, ofp_queue_stats_request):
-    """
-    Wrapper class for queue stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_queue_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_QUEUE
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_queue_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_queue_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking queue: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_QUEUE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_queue_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_queue_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class queue_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for queue stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_QUEUE
-        # stats: Array of type queue_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = queue_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = queue_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking queue stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "queue_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_stats_request(ofp_stats_request, ofp_group_stats_request):
-    """
-    Wrapper class for group stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_group_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_GROUP
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_group_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_group_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_GROUP_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_group_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_group_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for group stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_GROUP
-        # stats: Array of type group_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = group_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = group_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_desc_stats_request(ofp_stats_request, ofp_group_desc_stats_request):
-    """
-    Wrapper class for group_desc stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_group_desc_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_GROUP_DESC
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_group_desc_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_group_desc_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group_desc: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_GROUP_DESC_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_desc_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_group_desc_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_group_desc_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class group_desc_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for group_desc stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_GROUP_DESC
-        # stats: Array of type group_desc_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = group_desc_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = group_desc_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking group_desc stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "group_desc_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_stats_request(ofp_stats_request, ofp_table_stats_request):
-    """
-    Wrapper class for table stats request message
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_table_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = OFPST_TABLE
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_table_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_table_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking table: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \
-               OFP_TABLE_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_stats_request\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_table_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_table_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-class table_stats_reply(ofp_stats_reply):
-    """
-    Wrapper class for table stats reply
-    """
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = OFPST_TABLE
-        # stats: Array of type table_stats_entry
-        self.stats = []
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = table_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = table_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking table stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "table_stats_reply\n"
-        outstr += prefix + "ofp header:\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-
-
-# @todo Add buckets to group and group_desc stats obejcts"
-message_type_list = (
-    aggregate_stats_reply,
-    aggregate_stats_request,
-    bad_action_error_msg,
-    bad_request_error_msg,
-    barrier_reply,
-    barrier_request,
-    desc_stats_reply,
-    desc_stats_request,
-    echo_reply,
-    echo_request,
-    error,
-    experimenter,
-    features_reply,
-    features_request,
-    flow_mod,
-    flow_mod_failed_error_msg,
-    flow_removed,
-    flow_stats_reply,
-    flow_stats_request,
-    get_config_reply,
-    get_config_request,
-    group_desc_stats_request,
-    group_desc_stats_reply,
-    group_stats_request,
-    group_stats_reply,
-    group_mod,
-    group_mod_failed_error_msg,
-    hello,
-    hello_failed_error_msg,
-    packet_in,
-    packet_out,
-    port_mod,
-    port_mod_failed_error_msg,
-    port_stats_reply,
-    port_stats_request,
-    port_status,
-    queue_get_config_reply,
-    queue_get_config_request,
-    queue_op_failed_error_msg,
-    queue_stats_reply,
-    queue_stats_request,
-    set_config,
-    switch_config_failed_error_msg,
-    table_mod,
-    table_mod_failed_error_msg,
-    table_stats_reply,
-    table_stats_request,
-    )
-
diff --git a/src/python/of12/parse.py b/src/python/of12/parse.py
deleted file mode 100644
index 6374a75..0000000
--- a/src/python/of12/parse.py
+++ /dev/null
@@ -1,333 +0,0 @@
-"""
-OpenFlow message parsing functions
-"""
-
-import sys
-import logging
-import message
-from match_list import match_list
-import match
-#from error import *
-#from action import *
-#from action_list import action_list
-import cstruct as ofp
-
-try:
-    logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
-    from scapy.all import *
-    from oftest.mpls import *
-except ImportError:
-    sys.exit("Need to install scapy for packet parsing")
-
-"""
-of_message.py
-Contains wrapper functions and classes for the of_message namespace
-that are generated by hand.  It includes the rest of the wrapper
-function information into the of_message namespace
-"""
-
-parse_logger = logging.getLogger("parse")
-#parse_logger.setLevel(logging.DEBUG)
-
-# These message types are subclassed
-msg_type_subclassed = [
-    ofp.OFPT_STATS_REQUEST,
-    ofp.OFPT_STATS_REPLY,
-    ofp.OFPT_ERROR
-]
-
-# Maps from sub-types to classes
-stats_reply_to_class_map = {
-    ofp.OFPST_DESC                      : message.desc_stats_reply,
-    ofp.OFPST_FLOW                      : message.flow_stats_reply,
-    ofp.OFPST_AGGREGATE                 : message.aggregate_stats_reply,
-    ofp.OFPST_TABLE                     : message.table_stats_reply,
-    ofp.OFPST_PORT                      : message.port_stats_reply,
-    ofp.OFPST_QUEUE                     : message.queue_stats_reply,
-    ofp.OFPST_GROUP                     : message.group_stats_reply,
-    ofp.OFPST_GROUP_DESC                : message.group_desc_stats_reply
-#    ofp.OFPST_EXPERIMENTER
-}
-
-stats_request_to_class_map = {
-    ofp.OFPST_DESC                      : message.desc_stats_request,
-    ofp.OFPST_FLOW                      : message.flow_stats_request,
-    ofp.OFPST_AGGREGATE                 : message.aggregate_stats_request,
-    ofp.OFPST_TABLE                     : message.table_stats_request,
-    ofp.OFPST_PORT                      : message.port_stats_request,
-    ofp.OFPST_QUEUE                     : message.queue_stats_request,
-    ofp.OFPST_GROUP                     : message.group_stats_request,
-    ofp.OFPST_GROUP_DESC                : message.group_desc_stats_request
-#    ofp.OFPST_EXPERIMENTER
-}
-
-error_to_class_map = {
-    ofp.OFPET_HELLO_FAILED              : message.hello_failed_error_msg,
-    ofp.OFPET_BAD_REQUEST               : message.bad_request_error_msg,
-    ofp.OFPET_BAD_ACTION                : message.bad_action_error_msg,
-    ofp.OFPET_BAD_INSTRUCTION           : message.bad_instruction_error_msg,
-    ofp.OFPET_BAD_MATCH                 : message.bad_match_error_msg,
-    ofp.OFPET_FLOW_MOD_FAILED           : message.flow_mod_failed_error_msg,
-    ofp.OFPET_GROUP_MOD_FAILED          : message.group_mod_failed_error_msg,
-    ofp.OFPET_PORT_MOD_FAILED           : message.port_mod_failed_error_msg,
-    ofp.OFPET_TABLE_MOD_FAILED          : message.table_mod_failed_error_msg,
-    ofp.OFPET_QUEUE_OP_FAILED           : message.queue_op_failed_error_msg,
-    ofp.OFPET_SWITCH_CONFIG_FAILED      : message.switch_config_failed_error_msg
-}
-
-# Map from header type value to the underlieing message class
-msg_type_to_class_map = {
-    ofp.OFPT_HELLO                      : message.hello,
-    ofp.OFPT_ERROR                      : message.error,
-    ofp.OFPT_ECHO_REQUEST               : message.echo_request,
-    ofp.OFPT_ECHO_REPLY                 : message.echo_reply,
-    ofp.OFPT_EXPERIMENTER               : message.experimenter,
-    ofp.OFPT_FEATURES_REQUEST           : message.features_request,
-    ofp.OFPT_FEATURES_REPLY             : message.features_reply,
-    ofp.OFPT_GET_CONFIG_REQUEST         : message.get_config_request,
-    ofp.OFPT_GET_CONFIG_REPLY           : message.get_config_reply,
-    ofp.OFPT_SET_CONFIG                 : message.set_config,
-    ofp.OFPT_PACKET_IN                  : message.packet_in,
-    ofp.OFPT_FLOW_REMOVED               : message.flow_removed,
-    ofp.OFPT_PORT_STATUS                : message.port_status,
-    ofp.OFPT_PACKET_OUT                 : message.packet_out,
-    ofp.OFPT_FLOW_MOD                   : message.flow_mod,
-    ofp.OFPT_GROUP_MOD                  : message.group_mod,
-    ofp.OFPT_PORT_MOD                   : message.port_mod,
-    ofp.OFPT_TABLE_MOD                  : message.table_mod,
-    ofp.OFPT_STATS_REQUEST              : message.stats_request,
-    ofp.OFPT_STATS_REPLY                : message.stats_reply,
-    ofp.OFPT_BARRIER_REQUEST            : message.barrier_request,
-    ofp.OFPT_BARRIER_REPLY              : message.barrier_reply,
-    ofp.OFPT_QUEUE_GET_CONFIG_REQUEST   : message.queue_get_config_request,
-    ofp.OFPT_QUEUE_GET_CONFIG_REPLY     : message.queue_get_config_reply,
-}
-
-def _of_message_to_object(binary_string):
-    """
-    Map a binary string to the corresponding class.
-
-    Appropriately resolves subclasses
-    """
-    hdr = ofp.ofp_header()
-    hdr.unpack(binary_string)
-    # FIXME: Add error detection
-    if not hdr.type in msg_type_subclassed:
-        return msg_type_to_class_map[hdr.type]()
-    if hdr.type == ofp.OFPT_STATS_REQUEST:
-        sub_hdr = ofp.ofp_stats_request()
-        sub_hdr.unpack(binary_string[ofp.OFP_HEADER_BYTES:])
-        try:
-            obj = stats_request_to_class_map[sub_hdr.type]()
-        except LookupError:
-            obj = None
-        return obj
-    elif hdr.type == ofp.OFPT_STATS_REPLY:
-        sub_hdr = ofp.ofp_stats_reply()
-        sub_hdr.unpack(binary_string[ofp.OFP_HEADER_BYTES:])
-        try:
-            obj = stats_reply_to_class_map[sub_hdr.type]()
-        except LookupError:
-            obj = None
-        return obj
-    elif hdr.type == ofp.OFPT_ERROR:
-        sub_hdr = ofp.ofp_error_msg()
-        sub_hdr.unpack(binary_string[ofp.OFP_HEADER_BYTES:])
-        return error_to_class_map[sub_hdr.type]()
-    else:
-        parse_logger.error("Cannot parse pkt to message")
-        return None
-
-def of_message_parse(binary_string, raw=False):
-    """
-    Parse an OpenFlow packet
-
-    Parses a raw OpenFlow packet into a Python class, with class
-    members fully populated.
-
-    @param binary_string The packet (string) to be parsed
-    @param raw If true, interpret the packet as an L2 packet.  Not
-    yet supported.
-    @return An object of some message class or None if fails
-    Note that any data beyond that parsed is not returned
-
-    """
-
-    if raw:
-        parse_logger.error("raw packet message parsing not supported")
-        return None
-
-    obj = _of_message_to_object(binary_string)
-    if obj:
-        obj.unpack(binary_string)
-    return obj
-
-
-def of_header_parse(binary_string, raw=False):
-    """
-    Parse only the header from an OpenFlow packet
-
-    Parses the header from a raw OpenFlow packet into a
-    an ofp_header Python class.
-
-    @param binary_string The packet (string) to be parsed
-    @param raw If true, interpret the packet as an L2 packet.  Not
-    yet supported.
-    @return An ofp_header object
-
-    """
-
-    if raw:
-        parse_logger.error("raw packet message parsing not supported")
-        return None
-
-    hdr = ofp.ofp_header()
-    hdr.unpack(binary_string)
-
-    return hdr
-
-map_wc_field_to_match_member = {
-    'OFPFW_DL_VLAN'                 : 'dl_vlan',
-    'OFPFW_DL_SRC'                  : 'dl_src',
-    'OFPFW_DL_DST'                  : 'dl_dst',
-    'OFPFW_DL_TYPE'                 : 'dl_type',
-    'OFPFW_NW_PROTO'                : 'nw_proto',
-    'OFPFW_TP_SRC'                  : 'tp_src',
-    'OFPFW_TP_DST'                  : 'tp_dst',
-    'OFPFW_NW_SRC_SHIFT'            : 'nw_src_shift',
-    'OFPFW_NW_SRC_BITS'             : 'nw_src_bits',
-    'OFPFW_NW_SRC_MASK'             : 'nw_src_mask',
-    'OFPFW_NW_SRC_ALL'              : 'nw_src_all',
-    'OFPFW_NW_DST_SHIFT'            : 'nw_dst_shift',
-    'OFPFW_NW_DST_BITS'             : 'nw_dst_bits',
-    'OFPFW_NW_DST_MASK'             : 'nw_dst_mask',
-    'OFPFW_NW_DST_ALL'              : 'nw_dst_all',
-    'OFPFW_DL_VLAN_PCP'             : 'dl_vlan_pcp',
-    'OFPFW_NW_TOS'                  : 'nw_tos'
-}
-
-
-def parse_mac(mac_str):
-    """
-    Parse a MAC address
-
-    Parse a MAC address ':' separated string of hex digits to an
-    array of integer values.  '00:d0:05:5d:24:00' => [0, 208, 5, 93, 36, 0]
-    @param mac_str The string to convert
-    @return Array of 6 integer values
-    """
-    return map(lambda val:eval("0x" + val), mac_str.split(":"))
-
-def parse_ip(ip_str):
-    """
-    Parse an IP address
-
-    Parse an IP address '.' separated string of decimal digits to an
-    host ordered integer.  '172.24.74.77' => 
-    @param ip_str The string to convert
-    @return Integer value
-    """
-    array = map(lambda val:eval(val),ip_str.split("."))
-    val = 0
-    for a in array:
-        val <<= 8
-        val += a
-    return val
-
-def packet_to_flow_match(packet):
-    """
-    Create a flow match that matches packet with the given wildcards
-
-    @param packet The packet to use as a flow template
-    @param pkt_format Currently only L2 is supported.  Will indicate the 
-    overall packet type for parsing
-    @return An ofp_match object if successful.  None if format is not
-    recognized.  The wildcards of the match will be cleared for the
-    values extracted from the packet.
-
-    @todo check min length of packet
-    @todo Check if packet is other than L2 format
-    @todo implement other fields covered by OpenFlow 1.2 
-    """
-    match_ls = match_list()
-    
-    if Ether in packet:
-        ether = packet[Ether]
-        eth_type = match.eth_type(ether.type)
-        eth_dst = match.eth_dst(parse_mac(ether.dst))
-        eth_src = match.eth_src(parse_mac(ether.src))
-        match_ls.add(eth_type)
-        match_ls.add(eth_dst)
-        match_ls.add(eth_src)
-    else:
-        return match_ls
-
-    if Dot1Q in packet:
-        #TODO: nicer way to get last vlan tag?
-        vlan = packet[Dot1Q:0]
-        vlan_vid = match.vlan_vid(vlan.vlan)
-        vlan_pcp = match.vlan_pcp(vlan.prio)
-        match_ls.add(vlan_vid)
-        match_ls.add(vlan_pcp)
-        vlan_pl = vlan.payload
-        while vlan_pl is not None and vlan_pl.name == Dot1Q.name:
-            vlan = vlan_pl
-            vlan_pl = vlan.payload
-        #We need to overwrite the already
-        # inserted eth_type    
-        eth_index = match.tlvs.index()
-        eth_type = match.eth_type(vlan.type)
-        match_ls.tlvs.insert(vlan.type,eth_index)
-    #TODO ARP
-
-    if MPLS in packet:
-        mpls = packet[MPLS:0]
-        mpls_label = match.mpls_label(mpls.label)
-        mpls_tc =  match.mpls_tc(mpls.cos)
-        match_ls.add(mpls_label)
-        match_ls.add(mpls_tc)
-        return match_ls
-
-    if IP in packet:
-        ip = packet[IP]
-        ipv4_src = match.ipv4_src(parse_ip(ip.src))
-        ipv4_dst = match.ipv4_dst(parse_ip(ip.dst))
-        ip_dscp =  match.ip_dscp(ip.tos >> 2) 
-        ip_ecn =   match.ip_ecn(ip.tos & 0x03)
-        match_ls.add(ipv4_src)
-        match_ls.add(ipv4_dst)
-        match_ls.add(ip_dscp)
-        match_ls.add(ip_ecn)
-    else:
-        return match_ls
-    
-    if TCP in packet:
-        tcp = packet[TCP]
-        ip_proto = match.ip_proto(6)
-        tcp_src = match.tcp_src(tcp.sport)
-        tcp_dst = match.tcp_dst(tcp.dport)
-        match_ls.add(ip_proto)
-        match_ls.add(tcp_src)
-        match_ls.add(tcp_dst)
-        return match_ls
-
-    if UDP in packet:
-        udp = packet[UDP]
-        ip_proto = match.ip_proto(17)
-        udp_src = match.tcp_src(udp.sport)
-        udp_dst = match.tcp_dst(udp.dport)
-        match_ls.add(ip_proto)
-        match_ls.add(udp_src)
-        match_ls.add(udp_dst)        
-        return match_ls
-
-    if ICMP in packet:
-        icmp = packet[ICMP]
-        ip_proto = match.ip_proto(1)
-        icmp_type = match.icmp_type(icmp.type)
-        icmp_code = match.icmp_code(icmp.code)
-        match_ls.add(icmp_type)
-        match_ls.add(icmp_code)        
-        return match_ls
-
-    return match_ls
diff --git a/src/python/oftest/__init__.py b/src/python/oftest/__init__.py
index 65a5648..9199b1a 100644
--- a/src/python/oftest/__init__.py
+++ b/src/python/oftest/__init__.py
@@ -8,9 +8,3 @@
 # Global DataPlane instance used by all tests.
 # Populated by oft.
 dataplane_instance = None
-
-# Alias of10 modules into oftest namespace for backwards compatbility
-import of10
-from of10 import *
-for modname in of10.__all__:
-    sys.modules["oftest." + modname] = sys.modules["of10." + modname]
diff --git a/src/python/oftest/base_tests.py b/src/python/oftest/base_tests.py
index 5c6c9cf..9d905f9 100644
--- a/src/python/oftest/base_tests.py
+++ b/src/python/oftest/base_tests.py
@@ -44,7 +44,7 @@
             reply, pkt = self.controller.transact(request)
             self.assertTrue(reply is not None,
                             "Did not complete features_request for handshake")
-            if reply.header.version == 1:
+            if reply.version == 1:
                 self.supported_actions = reply.actions
                 logging.info("Supported actions: " + hex(self.supported_actions))
         except:
diff --git a/src/python/oftest/controller.py b/src/python/oftest/controller.py
index 4d44c14..41ac927 100644
--- a/src/python/oftest/controller.py
+++ b/src/python/oftest/controller.py
@@ -167,6 +167,8 @@
         Currently filters packet in messages
         @return Boolean, True if packet should be dropped
         """
+        # XXX didn't actually check for packet-in...
+        return False
         # Add check for packet in and rate limit
         if self.filter_packet_in:
             # If we were dropping packets, report number dropped
@@ -203,37 +205,34 @@
         # Process each of the OF msgs inside the pkt
         offset = 0
         while offset < len(pkt):
+            if offset + 8 > len(pkt):
+                break
+
             # Parse the header to get type
-            hdr = ofp.parse.of_header_parse(pkt[offset:])
-            if not hdr or hdr.length == 0:
-                self.logger.error("Could not parse header")
-                self.logger.error("pkt len %d." % len(pkt))
-                if hdr:
-                    self.logger.error("hdr len %d." % hdr.length)
-                self.logger.error("%s" % hex_dump_buffer(pkt[:200]))
-                self.shutdown()
-                return
+            hdr_version, hdr_type, hdr_length, hdr_xid = ofp.message.parse_header(pkt[offset:])
 
             # Extract the raw message bytes
-            if (offset + hdr.length) > len(pkt):
+            if (offset + hdr_length) > len(pkt):
                 break
-            rawmsg = pkt[offset : offset + hdr.length]
-            offset += hdr.length
+            rawmsg = pkt[offset : offset + hdr_length]
+            offset += hdr_length
 
-            if self.filter_packet(rawmsg, hdr):
-                continue
+            #if self.filter_packet(rawmsg, hdr):
+            #    continue
 
-            self.logger.debug("Msg in: buf len %d. hdr.type %s. hdr.len %d hdr.version %d hdr.xid %d" %
-                              (len(pkt), ofp.cstruct.ofp_type_map[hdr.type], hdr.length, hdr.version, hdr.xid))
-            if hdr.version < ofp.cstruct.OFP_VERSION:
+            self.logger.debug("Msg in: version %d type %s (%d) len %d xid %d",
+                              hdr_version,
+                              ofp.ofp_type_map.get(hdr_type, "unknown"), hdr_type,
+                              hdr_length, hdr_version)
+            if hdr_version < ofp.OFP_VERSION:
                 self.logger.error("Switch only supports up to OpenFlow version %d (OFTest version is %d)",
-                                  hdr.version, ofp.cstruct.OFP_VERSION)
+                                  hdr_version, ofp.OFP_VERSION)
                 print "Switch only supports up to OpenFlow version %d (OFTest version is %d)" % \
-                    (hdr.version, ofp.cstruct.OFP_VERSION)
+                    (hdr_version, ofp.OFP_VERSION)
                 self.disconnect()
                 return
 
-            msg = ofp.parse.of_message_parse(rawmsg)
+            msg = ofp.message.parse_message(rawmsg)
             if not msg:
                 self.parse_errors += 1
                 self.logger.warn("Could not parse message")
@@ -242,8 +241,8 @@
             with self.sync:
                 # Check if transaction is waiting
                 with self.xid_cv:
-                    if self.xid and hdr.xid == self.xid:
-                        self.logger.debug("Matched expected XID " + str(hdr.xid))
+                    if self.xid and hdr_xid == self.xid:
+                        self.logger.debug("Matched expected XID " + str(hdr_xid))
                         self.xid_response = (msg, rawmsg)
                         self.xid = None
                         self.xid_cv.notify()
@@ -251,29 +250,29 @@
 
                 # Check if keep alive is set; if so, respond to echo requests
                 if self.keep_alive:
-                    if hdr.type == ofp.cstruct.OFPT_ECHO_REQUEST:
+                    if hdr_type == ofp.OFPT_ECHO_REQUEST:
                         self.logger.debug("Responding to echo request")
                         rep = ofp.message.echo_reply()
-                        rep.header.xid = hdr.xid
+                        rep.xid = hdr_xid
                         # Ignoring additional data
-                        self.message_send(rep.pack(), zero_xid=True)
+                        self.message_send(rep.pack())
                         continue
 
                 # Log error messages
-                if hdr.type == ofp.OFPT_ERROR:
-                    if msg.type in ofp.ofp_error_type_map:
-                        type_str = ofp.ofp_error_type_map[msg.type]
-                        if msg.type == ofp.OFPET_HELLO_FAILED:
+                if hdr_type == ofp.OFPT_ERROR:
+                    if msg.err_type in ofp.ofp_error_type_map:
+                        type_str = ofp.ofp_error_type_map[msg.err_type]
+                        if msg.err_type == ofp.OFPET_HELLO_FAILED:
                             code_map = ofp.ofp_hello_failed_code_map
-                        elif msg.type == ofp.OFPET_BAD_REQUEST:
+                        elif msg.err_type == ofp.OFPET_BAD_REQUEST:
                             code_map = ofp.ofp_bad_request_code_map
-                        elif msg.type == ofp.OFPET_BAD_ACTION:
+                        elif msg.err_type == ofp.OFPET_BAD_ACTION:
                             code_map = ofp.ofp_bad_action_code_map
-                        elif msg.type == ofp.OFPET_FLOW_MOD_FAILED:
+                        elif msg.err_type == ofp.OFPET_FLOW_MOD_FAILED:
                             code_map = ofp.ofp_flow_mod_failed_code_map
-                        elif msg.type == ofp.OFPET_PORT_MOD_FAILED:
+                        elif msg.err_type == ofp.OFPET_PORT_MOD_FAILED:
                             code_map = ofp.ofp_port_mod_failed_code_map
-                        elif msg.type == ofp.OFPET_QUEUE_OP_FAILED:
+                        elif msg.err_type == ofp.OFPET_QUEUE_OP_FAILED:
                             code_map = ofp.ofp_queue_op_failed_code_map
                         else:
                             code_map = None
@@ -284,19 +283,22 @@
                             code_str = "unknown"
                     else:
                         type_str = "unknown"
+                        code_str = "unknown"
                     self.logger.warn("Received error message: xid=%d type=%s (%d) code=%s (%d)",
-                                     hdr.xid, type_str, msg.type, code_str, msg.code)
+                                     hdr_xid, type_str, msg.err_type, code_str, msg.code)
 
                 # Now check for message handlers; preference is given to
                 # handlers for a specific packet
                 handled = False
-                if hdr.type in self.handlers.keys():
-                    handled = self.handlers[hdr.type](self, msg, rawmsg)
+                if hdr_type in self.handlers.keys():
+                    handled = self.handlers[hdr_type](self, msg, rawmsg)
                 if not handled and ("all" in self.handlers.keys()):
                     handled = self.handlers["all"](self, msg, rawmsg)
 
                 if not handled: # Not handled, enqueue
-                    self.logger.debug("Enqueuing pkt type " + ofp.cstruct.ofp_type_map[hdr.type])
+                    self.logger.debug("Enqueuing pkt type %s (%d)",
+                                      ofp.ofp_type_map.get(hdr_type, "unknown"),
+                                      hdr_type)
                     with self.packets_cv:
                         if len(self.packets) >= self.max_pkts:
                             self.packets.pop(0)
@@ -576,8 +578,10 @@
         If an error occurs, (None, None) is returned
         """
 
+        exp_msg_str = ofp.ofp_type_map.get(exp_msg, "unknown (%d)" % exp_msg)
+
         if exp_msg is not None:
-            self.logger.debug("Poll for %s" % ofp.cstruct.ofp_type_map[exp_msg])
+            self.logger.debug("Poll for %s", exp_msg_str)
         else:
             self.logger.debug("Poll for any OF message")
 
@@ -589,11 +593,11 @@
                     (msg, pkt) = self.packets.pop(0)
                     return (msg, pkt)
                 else:
-                    self.logger.debug("Looking for %s" % ofp.cstruct.ofp_type_map[exp_msg])
+                    self.logger.debug("Looking for %s", exp_msg_str)
                     for i in range(len(self.packets)):
                         msg = self.packets[i][0]
-                        self.logger.debug("Checking packets[%d] (%s)" % (i, ofp.cstruct.ofp_type_map[msg.header.type]))
-                        if msg.header.type == exp_msg:
+                        self.logger.debug("Checking packets[%d] (%s)", i, exp_msg_str)
+                        if msg.type == exp_msg:
                             (msg, pkt) = self.packets.pop(i)
                             return (msg, pkt)
             # Not found
@@ -610,7 +614,7 @@
         else:
             return (None, None)
 
-    def transact(self, msg, timeout=-1, zero_xid=False):
+    def transact(self, msg, timeout=-1):
         """
         Run a message transaction with the switch
 
@@ -620,27 +624,23 @@
 
         @param msg The message object to send; must not be a string
         @param timeout The timeout in seconds; if -1 use default.
-        @param zero_xid Normally, if the XID is 0 an XID will be generated
-        for the message.  Set zero_xid to override this behavior
-        @return The matching message object or None if unsuccessful
-
         """
 
-        if not zero_xid and msg.header.xid == 0:
-            msg.header.xid = ofutils.gen_xid()
+        if msg.xid == None:
+            msg.xid = ofutils.gen_xid()
 
-        self.logger.debug("Running transaction %d" % msg.header.xid)
+        self.logger.debug("Running transaction %d" % msg.xid)
 
         with self.xid_cv:
             if self.xid:
                 self.logger.error("Can only run one transaction at a time")
                 return (None, None)
 
-            self.xid = msg.header.xid
+            self.xid = msg.xid
             self.xid_response = None
             self.message_send(msg.pack())
 
-            self.logger.debug("Waiting for transaction %d" % msg.header.xid)
+            self.logger.debug("Waiting for transaction %d" % msg.xid)
             ofutils.timed_wait(self.xid_cv, lambda: self.xid_response, timeout=timeout)
 
             if self.xid_response:
@@ -653,16 +653,12 @@
             self.logger.warning("No response for xid " + str(self.xid))
         return (resp, pkt)
 
-    def message_send(self, msg, zero_xid=False):
+    def message_send(self, msg):
         """
         Send the message to the switch
 
         @param msg A string or OpenFlow message object to be forwarded to
         the switch.
-        @param zero_xid If msg is an OpenFlow object (not a string) and if
-        the XID in the header is 0, then an XID will be generated
-        for the message.  Set zero_xid to override this behavior (and keep an
-        existing 0 xid)
         """
 
         if not self.switch_socket:
@@ -670,8 +666,8 @@
             raise Exception("no socket")
         #@todo If not string, try to pack
         if type(msg) != type(""):
-            if msg.header.xid == 0 and not zero_xid:
-                msg.header.xid = ofutils.gen_xid()
+            if msg.xid == None:
+                msg.xid = ofutils.gen_xid()
             outpkt = msg.pack()
         else:
             outpkt = msg
@@ -679,7 +675,7 @@
         msg_version, msg_type, msg_len, msg_xid = struct.unpack_from("!BBHL", outpkt)
         self.logger.debug("Msg out: buf len %d. hdr.type %s. hdr.len %d hdr.version %d hdr.xid %d",
                           len(outpkt),
-                          ofp.cstruct.ofp_type_map.get(msg_type, "unknown (%d)" % msg_type),
+                          ofp.ofp_type_map.get(msg_type, "unknown (%d)" % msg_type),
                           msg_len,
                           msg_version,
                           msg_xid)
diff --git a/src/python/oftest/illegal_message.py b/src/python/oftest/illegal_message.py
index 0c6a878..8e52e33 100644
--- a/src/python/oftest/illegal_message.py
+++ b/src/python/oftest/illegal_message.py
@@ -2,107 +2,42 @@
 Support an illegal message
 """
 
-from cstruct import *
+import struct
+import ofp
 
-ILLEGAL_MESSAGE_TYPE=217
+class illegal_message_type(object):
+    version = ofp.OFP_VERSION
+    type = 217
 
-class illegal_message_type:
-    """
-    Wrapper class for illegal message
-
-    OpenFlow message header: length, version, xid, type
-    @arg length: The total length of the message
-    @arg version: The OpenFlow version (1)
-    @arg xid: The transaction ID
-    @arg type: The message type (OFPT_ECHO_REQUEST=2)
-
-    @arg data: Binary string following message members
-
-    The message type is set to "illegal" and the pack assert
-    check for the OF header is disabled
-    """
-
-    def __init__(self):
-        self.header = ofp_header()
-        self.header.type = ILLEGAL_MESSAGE_TYPE
-        self.data = ""
+    def __init__(self, xid=None):
+        self.xid = xid
 
     def pack(self):
-        """
-        Pack object into string
+        packed = []
+        packed.append(struct.pack("!B", self.version))
+        packed.append(struct.pack("!B", self.type))
+        packed.append(struct.pack("!H", 0)) # placeholder for length at index 2
+        packed.append(struct.pack("!L", self.xid))
+        length = sum([len(x) for x in packed])
+        packed[2] = struct.pack("!H", length)
+        return ''.join(packed)
 
-        @return The packed string which can go on the wire
-
-        """
-        self.header.length = len(self)
-        packed = self.header.pack(assertstruct=False)
-
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        """
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        """
-        binary_string = self.header.unpack(binary_string)
-
-        self.data = binary_string
-        binary_string = ''
-        return binary_string
-
-    def __len__(self):
-        """
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        """
-        length = OFP_HEADER_BYTES
-
-        length += len(self.data)
-        return length
-
-    def show(self, prefix=''):
-        """
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        """
-
-        outstr = prefix + 'illegal_message (' + \
-            str(ILLEGAL_MESSAGE_TYPE) + ')\n'
-        prefix += '  '
-        outstr += prefix + 'ofp header\n'
-        outstr += self.header.show(prefix + '  ')
-        outstr += prefix + 'data is of length ' + str(len(self.data)) + '\n'
-        return outstr
+    @staticmethod
+    def unpack(buf):
+        raise NotImplementedError()
 
     def __eq__(self, other):
-        """
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        """
         if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-
-        if self.data != other.data: return False
+        if self.version != other.version: return False
+        if self.type != other.type: return False
+        if self.xid != other.xid: return False
         return True
 
     def __ne__(self, other):
-        """
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        """
         return not self.__eq__(other)
+
+    def __str__(self):
+        return self.show()
+
+    def show(self):
+        return "illegal_message_type"
diff --git a/src/python/oftest/parse.py b/src/python/oftest/parse.py
new file mode 100644
index 0000000..d75c7cd
--- /dev/null
+++ b/src/python/oftest/parse.py
@@ -0,0 +1,185 @@
+"""
+Utility parsing functions
+"""
+
+import sys
+import logging
+import ofp
+try:
+    import scapy.all as scapy
+except:
+    try:
+        import scapy as scapy
+    except:
+        sys.exit("Need to install scapy for packet parsing")
+
+map_wc_field_to_match_member = {
+    'OFPFW_DL_VLAN'                 : 'vlan_vid',
+    'OFPFW_DL_SRC'                  : 'eth_src',
+    'OFPFW_DL_DST'                  : 'eth_dst',
+    'OFPFW_DL_TYPE'                 : 'eth_type',
+    'OFPFW_NW_PROTO'                : 'ip_proto',
+    'OFPFW_TP_SRC'                  : 'tcp_src',
+    'OFPFW_TP_DST'                  : 'tcp_dst',
+    'OFPFW_NW_SRC_SHIFT'            : 'nw_src_shift',
+    'OFPFW_NW_SRC_BITS'             : 'nw_src_bits',
+    'OFPFW_NW_SRC_MASK'             : 'nw_src_mask',
+    'OFPFW_NW_SRC_ALL'              : 'nw_src_all',
+    'OFPFW_NW_DST_SHIFT'            : 'nw_dst_shift',
+    'OFPFW_NW_DST_BITS'             : 'nw_dst_bits',
+    'OFPFW_NW_DST_MASK'             : 'nw_dst_mask',
+    'OFPFW_NW_DST_ALL'              : 'nw_dst_all',
+    'OFPFW_DL_VLAN_PCP'             : 'vlan_pcp',
+    'OFPFW_NW_TOS'                  : 'ip_dscp'
+}
+
+
+def parse_mac(mac_str):
+    """
+    Parse a MAC address
+
+    Parse a MAC address ':' separated string of hex digits to an
+    array of integer values.  '00:d0:05:5d:24:00' => [0, 208, 5, 93, 36, 0]
+    @param mac_str The string to convert
+    @return Array of 6 integer values
+    """
+    return map(lambda val: int(val, 16), mac_str.split(":"))
+
+def parse_ip(ip_str):
+    """
+    Parse an IP address
+
+    Parse an IP address '.' separated string of decimal digits to an
+    host ordered integer.  '172.24.74.77' => 
+    @param ip_str The string to convert
+    @return Integer value
+    """
+    array = map(lambda val: int(val), ip_str.split("."))
+    val = 0
+    for a in array:
+        val <<= 8
+        val += a
+    return val
+
+def packet_type_classify(ether):
+    try:
+        dot1q = ether[scapy.Dot1Q]
+    except:
+        dot1q = None
+
+    try:
+        ip = ether[scapy.IP]
+    except:
+        ip = None
+
+    try:
+        tcp = ether[scapy.TCP]
+    except:
+        tcp = None
+
+    try:
+        udp = ether[scapy.UDP]
+    except:
+        udp = None
+
+    try:
+        icmp = ether[scapy.ICMP]
+    except:
+        icmp = None
+
+    try:
+        arp = ether[scapy.ARP]
+    except:
+        arp = None
+    return (dot1q, ip, tcp, udp, icmp, arp)
+
+def packet_to_flow_match(packet, pkt_format="L2"):
+    """
+    Create a flow match that matches packet with the given wildcards
+
+    @param packet The packet to use as a flow template
+    @param pkt_format Currently only L2 is supported.  Will indicate the 
+    overall packet type for parsing
+    @return An ofp_match object if successful.  None if format is not
+    recognized.  The wildcards of the match will be cleared for the
+    values extracted from the packet.
+
+    @todo check min length of packet
+    @todo Check if packet is other than L2 format
+    @todo Implement ICMP and ARP fields
+    """
+
+    #@todo check min length of packet
+    if pkt_format.upper() != "L2":
+        logging.error("Only L2 supported for packet_to_flow")
+        return None
+
+    if type(packet) == type(""):
+        ether = scapy.Ether(packet)
+    else:
+        ether = packet
+
+    # For now, assume ether IP packet and ignore wildcards
+    try:
+        (dot1q, ip, tcp, udp, icmp, arp) = packet_type_classify(ether)
+    except:
+        logging.error("packet_to_flow_match: Classify error")
+        return None
+
+    match = ofp.match()
+    match.wildcards = ofp.OFPFW_ALL
+    #@todo Check if packet is other than L2 format
+    match.eth_dst = parse_mac(ether.dst)
+    match.wildcards &= ~ofp.OFPFW_DL_DST
+    match.eth_src = parse_mac(ether.src)
+    match.wildcards &= ~ofp.OFPFW_DL_SRC
+    match.eth_type = ether.type
+    match.wildcards &= ~ofp.OFPFW_DL_TYPE
+
+    if dot1q:
+        match.vlan_vid = dot1q.vlan
+        match.vlan_pcp = dot1q.prio
+        match.eth_type = dot1q.type
+    else:
+        match.vlan_vid = ofp.OFP_VLAN_NONE
+        match.vlan_pcp = 0
+    match.wildcards &= ~ofp.OFPFW_DL_VLAN
+    match.wildcards &= ~ofp.OFPFW_DL_VLAN_PCP
+
+    if ip:
+        match.ipv4_src = parse_ip(ip.src)
+        match.wildcards &= ~ofp.OFPFW_NW_SRC_MASK
+        match.ipv4_dst = parse_ip(ip.dst)
+        match.wildcards &= ~ofp.OFPFW_NW_DST_MASK
+        match.ip_dscp = ip.tos
+        match.wildcards &= ~ofp.OFPFW_NW_TOS
+
+    if tcp:
+        match.ip_proto = 6
+        match.wildcards &= ~ofp.OFPFW_NW_PROTO
+    elif not tcp and udp:
+        tcp = udp
+        match.ip_proto = 17
+        match.wildcards &= ~ofp.OFPFW_NW_PROTO
+
+    if tcp:
+        match.tcp_src = tcp.sport
+        match.wildcards &= ~ofp.OFPFW_TP_SRC
+        match.tcp_dst = tcp.dport
+        match.wildcards &= ~ofp.OFPFW_TP_DST
+
+    if icmp:
+        match.ip_proto = 1
+        match.tcp_src = icmp.type
+        match.tcp_dst = icmp.code
+        match.wildcards &= ~ofp.OFPFW_NW_PROTO
+
+    if arp:
+        match.ip_proto = arp.op
+        match.wildcards &= ~ofp.OFPFW_NW_PROTO
+        match.ipv4_src = parse_ip(arp.psrc)
+        match.wildcards &= ~ofp.OFPFW_NW_SRC_MASK
+        match.ipv4_dst = parse_ip(arp.pdst)
+        match.wildcards &= ~ofp.OFPFW_NW_DST_MASK
+
+    return match
diff --git a/src/python/oftest/testutils.py b/src/python/oftest/testutils.py
index fcd8f21..980099f 100644
--- a/src/python/oftest/testutils.py
+++ b/src/python/oftest/testutils.py
@@ -16,10 +16,8 @@
 import oftest
 import oftest.controller
 import oftest.dataplane
-import of10.cstruct
-import of10.message
-import of10.action
-import of10.parse
+import oftest.parse
+import ofp
 
 global skipped_test_count
 skipped_test_count = 0
@@ -40,10 +38,9 @@
     """
 
     logging.info("Deleting all flows")
-    msg = of10.message.flow_mod()
-    msg.match.wildcards = of10.cstruct.OFPFW_ALL
-    msg.out_port = of10.cstruct.OFPP_NONE
-    msg.command = of10.cstruct.OFPFC_DELETE
+    msg = ofp.message.flow_delete()
+    msg.match.wildcards = ofp.OFPFW_ALL
+    msg.out_port = ofp.OFPP_NONE
     msg.buffer_id = 0xffffffff
     ctrl.message_send(msg)
     return 0 # for backwards compatibility
@@ -51,17 +48,17 @@
 def required_wildcards(parent):
     w = test_param_get('required_wildcards', default='default')
     if w == 'l3-l4':
-        return (of10.cstruct.OFPFW_NW_SRC_ALL | of10.cstruct.OFPFW_NW_DST_ALL | of10.cstruct.OFPFW_NW_TOS
-                | of10.cstruct.OFPFW_NW_PROTO | of10.cstruct.OFPFW_TP_SRC | of10.cstruct.OFPFW_TP_DST)
+        return (ofp.OFPFW_NW_SRC_ALL | ofp.OFPFW_NW_DST_ALL | ofp.OFPFW_NW_TOS
+                | ofp.OFPFW_NW_PROTO | ofp.OFPFW_TP_SRC | ofp.OFPFW_TP_DST)
     else:
         return 0
 
 def simple_tcp_packet(pktlen=100, 
-                      dl_dst='00:01:02:03:04:05',
-                      dl_src='00:06:07:08:09:0a',
+                      eth_dst='00:01:02:03:04:05',
+                      eth_src='00:06:07:08:09:0a',
                       dl_vlan_enable=False,
-                      dl_vlan=0,
-                      dl_vlan_pcp=0,
+                      vlan_vid=0,
+                      vlan_pcp=0,
                       dl_vlan_cfi=0,
                       ip_src='192.168.0.1',
                       ip_dst='192.168.0.2',
@@ -77,11 +74,11 @@
 
     Supports a few parameters:
     @param len Length of packet in bytes w/o CRC
-    @param dl_dst Destinatino MAC
-    @param dl_src Source MAC
+    @param eth_dst Destinatino MAC
+    @param eth_src Source MAC
     @param dl_vlan_enable True if the packet is with vlan, False otherwise
-    @param dl_vlan VLAN ID
-    @param dl_vlan_pcp VLAN priority
+    @param vlan_vid VLAN ID
+    @param vlan_pcp VLAN priority
     @param ip_src IP source
     @param ip_dst IP destination
     @param ip_tos IP ToS
@@ -99,17 +96,17 @@
 
     # Note Dot1Q.id is really CFI
     if (dl_vlan_enable):
-        pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
-            scapy.Dot1Q(prio=dl_vlan_pcp, id=dl_vlan_cfi, vlan=dl_vlan)/ \
+        pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
+            scapy.Dot1Q(prio=vlan_pcp, id=dl_vlan_cfi, vlan=vlan_vid)/ \
             scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \
             scapy.TCP(sport=tcp_sport, dport=tcp_dport)
     else:
         if not ip_options:
-            pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \
                 scapy.TCP(sport=tcp_sport, dport=tcp_dport)
         else:
-            pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl, options=ip_options)/ \
                 scapy.TCP(sport=tcp_sport, dport=tcp_dport)
 
@@ -118,11 +115,11 @@
     return pkt
 
 def simple_udp_packet(pktlen=100,
-                      dl_dst='00:01:02:03:04:05',
-                      dl_src='00:06:07:08:09:0a',
+                      eth_dst='00:01:02:03:04:05',
+                      eth_src='00:06:07:08:09:0a',
                       dl_vlan_enable=False,
-                      dl_vlan=0,
-                      dl_vlan_pcp=0,
+                      vlan_vid=0,
+                      vlan_pcp=0,
                       dl_vlan_cfi=0,
                       ip_src='192.168.0.1',
                       ip_dst='192.168.0.2',
@@ -138,11 +135,11 @@
 
     Supports a few parameters:
     @param len Length of packet in bytes w/o CRC
-    @param dl_dst Destination MAC
-    @param dl_src Source MAC
+    @param eth_dst Destination MAC
+    @param eth_src Source MAC
     @param dl_vlan_enable True if the packet is with vlan, False otherwise
-    @param dl_vlan VLAN ID
-    @param dl_vlan_pcp VLAN priority
+    @param vlan_vid VLAN ID
+    @param vlan_pcp VLAN priority
     @param ip_src IP source
     @param ip_dst IP destination
     @param ip_tos IP ToS
@@ -159,17 +156,17 @@
 
     # Note Dot1Q.id is really CFI
     if (dl_vlan_enable):
-        pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
-            scapy.Dot1Q(prio=dl_vlan_pcp, id=dl_vlan_cfi, vlan=dl_vlan)/ \
+        pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
+            scapy.Dot1Q(prio=vlan_pcp, id=dl_vlan_cfi, vlan=vlan_vid)/ \
             scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \
             scapy.UDP(sport=udp_sport, dport=udp_dport)
     else:
         if not ip_options:
-            pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \
                 scapy.UDP(sport=udp_sport, dport=udp_dport)
         else:
-            pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl, options=ip_options)/ \
                 scapy.UDP(sport=udp_sport, dport=udp_dport)
 
@@ -178,11 +175,11 @@
     return pkt
 
 def simple_icmp_packet(pktlen=60, 
-                      dl_dst='00:01:02:03:04:05',
-                      dl_src='00:06:07:08:09:0a',
+                      eth_dst='00:01:02:03:04:05',
+                      eth_src='00:06:07:08:09:0a',
                       dl_vlan_enable=False,
-                      dl_vlan=0,
-                      dl_vlan_pcp=0,
+                      vlan_vid=0,
+                      vlan_pcp=0,
                       ip_src='192.168.0.1',
                       ip_dst='192.168.0.2',
                       ip_tos=0,
@@ -195,11 +192,11 @@
 
     Supports a few parameters:
     @param len Length of packet in bytes w/o CRC
-    @param dl_dst Destinatino MAC
-    @param dl_src Source MAC
+    @param eth_dst Destinatino MAC
+    @param eth_src Source MAC
     @param dl_vlan_enable True if the packet is with vlan, False otherwise
-    @param dl_vlan VLAN ID
-    @param dl_vlan_pcp VLAN priority
+    @param vlan_vid VLAN ID
+    @param vlan_pcp VLAN priority
     @param ip_src IP source
     @param ip_dst IP destination
     @param ip_tos IP ToS
@@ -216,12 +213,12 @@
         pktlen = MINSIZE
 
     if (dl_vlan_enable):
-        pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
-            scapy.Dot1Q(prio=dl_vlan_pcp, id=0, vlan=dl_vlan)/ \
+        pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
+            scapy.Dot1Q(prio=vlan_pcp, id=0, vlan=vlan_vid)/ \
             scapy.IP(src=ip_src, dst=ip_dst, ttl=ip_ttl, tos=ip_tos)/ \
             scapy.ICMP(type=icmp_type, code=icmp_code)
     else:
-        pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+        pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
             scapy.IP(src=ip_src, dst=ip_dst, ttl=ip_ttl, tos=ip_tos)/ \
             scapy.ICMP(type=icmp_type, code=icmp_code)
 
@@ -230,8 +227,8 @@
     return pkt
 
 def simple_arp_packet(pktlen=60, 
-                      dl_dst='ff:ff:ff:ff:ff:ff',
-                      dl_src='00:06:07:08:09:0a',
+                      eth_dst='ff:ff:ff:ff:ff:ff',
+                      eth_src='00:06:07:08:09:0a',
                       arp_op=1,
                       ip_snd='192.168.0.1',
                       ip_tgt='192.168.0.2',
@@ -243,8 +240,8 @@
 
     Supports a few parameters:
     @param len Length of packet in bytes w/o CRC
-    @param dl_dst Destinatino MAC
-    @param dl_src Source MAC
+    @param eth_dst Destinatino MAC
+    @param eth_src Source MAC
     @param arp_op Operation (1=request, 2=reply)
     @param ip_snd Sender IP
     @param ip_tgt Target IP
@@ -259,7 +256,7 @@
     if MINSIZE > pktlen:
         pktlen = MINSIZE
 
-    pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+    pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
           scapy.ARP(hwsrc=hw_snd, hwdst=hw_tgt, pdst=ip_tgt, psrc=ip_snd, op=arp_op)
 
     pkt = pkt/("0" * (pktlen - len(pkt)))
@@ -267,27 +264,27 @@
     return pkt
 
 def simple_eth_packet(pktlen=60,
-                      dl_dst='00:01:02:03:04:05',
-                      dl_src='01:80:c2:00:00:00',
-                      dl_type=0x88cc):
+                      eth_dst='00:01:02:03:04:05',
+                      eth_src='01:80:c2:00:00:00',
+                      eth_type=0x88cc):
 
     if MINSIZE > pktlen:
         pktlen = MINSIZE
 
-    pkt = scapy.Ether(dst=dl_dst, src=dl_src, type=dl_type)
+    pkt = scapy.Ether(dst=eth_dst, src=eth_src, type=eth_type)
 
     pkt = pkt/("0" * (pktlen - len(pkt)))
 
     return pkt
 
 def qinq_tcp_packet(pktlen=100, 
-                    dl_dst='00:01:02:03:04:05',
-                    dl_src='00:06:07:08:09:0a',
+                    eth_dst='00:01:02:03:04:05',
+                    eth_src='00:06:07:08:09:0a',
                     dl_vlan_outer=20,
                     dl_vlan_pcp_outer=0,
                     dl_vlan_cfi_outer=0,
-                    dl_vlan=10,
-                    dl_vlan_pcp=0,
+                    vlan_vid=10,
+                    vlan_pcp=0,
                     dl_vlan_cfi=0,
                     ip_src='192.168.0.1',
                     ip_dst='192.168.0.2',
@@ -303,13 +300,13 @@
 
     Supports a few parameters:
     @param len Length of packet in bytes w/o CRC
-    @param dl_dst Destinatino MAC
-    @param dl_src Source MAC
+    @param eth_dst Destinatino MAC
+    @param eth_src Source MAC
     @param dl_vlan_outer Outer VLAN ID
     @param dl_vlan_pcp_outer Outer VLAN priority
     @param dl_vlan_cfi_outer Outer VLAN cfi bit
-    @param dl_vlan Inner VLAN ID
-    @param dl_vlan_pcp VLAN priority
+    @param vlan_vid Inner VLAN ID
+    @param vlan_pcp VLAN priority
     @param dl_vlan_cfi VLAN cfi bit
     @param ip_src IP source
     @param ip_dst IP destination
@@ -326,9 +323,9 @@
         pktlen = MINSIZE
 
     # Note Dot1Q.id is really CFI
-    pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+    pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
           scapy.Dot1Q(prio=dl_vlan_pcp_outer, id=dl_vlan_cfi_outer, vlan=dl_vlan_outer)/ \
-          scapy.Dot1Q(prio=dl_vlan_pcp, id=dl_vlan_cfi, vlan=dl_vlan)/ \
+          scapy.Dot1Q(prio=vlan_pcp, id=dl_vlan_cfi, vlan=vlan_vid)/ \
           scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \
           scapy.TCP(sport=tcp_sport, dport=tcp_dport)
 
@@ -341,7 +338,7 @@
     Do a barrier command
     Return 0 on success, -1 on error
     """
-    b = of10.message.barrier_request()
+    b = ofp.message.barrier_request()
     (resp, pkt) = ctrl.transact(b, timeout=timeout)
     if resp is None:
         raise AssertionError("barrier failed")
@@ -358,7 +355,7 @@
     @returns (hwaddr, config, advert) The hwaddress, configuration and
     advertised values
     """
-    request = of10.message.features_request()
+    request = ofp.message.features_request()
     reply, pkt = controller.transact(request)
     logging.debug(reply.show())
     if reply is None:
@@ -380,7 +377,7 @@
     configuration value according to config and mask
     """
     logging.info("Setting port " + str(port_no) + " to config " + str(config))
-    request = of10.message.features_request()
+    request = ofp.message.features_request()
     reply, pkt = controller.transact(request)
     if reply is None:
         return -1
@@ -390,7 +387,7 @@
         if reply.ports[idx].port_no == port_no:
             p = reply.ports[idx]
             break
-    mod = of10.message.port_mod()
+    mod = ofp.message.port_mod()
     mod.port_no = port_no
     if p:
         mod.hw_addr = p.hw_addr
@@ -461,7 +458,7 @@
     # Expect a packet from each port on egr port list
     for egr_port in egr_port_list:
         check_port = egr_port
-        if egr_port == of10.cstruct.OFPP_IN_PORT:
+        if egr_port == ofp.OFPP_IN_PORT:
             check_port = ing_port
         (rcv_port, rcv_pkt, pkt_time) = parent.dataplane.poll(
             port_number=check_port, exp_pkt=exp_pkt_arg)
@@ -500,52 +497,52 @@
     parent.assertEqual(req_match.in_port, res_match.in_port,
                        'Match failed: in_port: ' + str(req_match.in_port) +
                        " != " + str(res_match.in_port))
-    parent.assertEqual(str(req_match.dl_src), str(res_match.dl_src),
-                       'Match failed: dl_src: ' + str(req_match.dl_src) +
-                       " != " + str(res_match.dl_src))
-    parent.assertEqual(str(req_match.dl_dst), str(res_match.dl_dst),
-                       'Match failed: dl_dst: ' + str(req_match.dl_dst) +
-                       " != " + str(res_match.dl_dst))
-    parent.assertEqual(req_match.dl_vlan, res_match.dl_vlan,
-                       'Match failed: dl_vlan: ' + str(req_match.dl_vlan) +
-                       " != " + str(res_match.dl_vlan))
-    parent.assertEqual(req_match.dl_vlan_pcp, res_match.dl_vlan_pcp,
-                       'Match failed: dl_vlan_pcp: ' + 
-                       str(req_match.dl_vlan_pcp) + " != " + 
-                       str(res_match.dl_vlan_pcp))
-    parent.assertEqual(req_match.dl_type, res_match.dl_type,
-                       'Match failed: dl_type: ' + str(req_match.dl_type) +
-                       " != " + str(res_match.dl_type))
+    parent.assertEqual(str(req_match.eth_src), str(res_match.eth_src),
+                       'Match failed: eth_src: ' + str(req_match.eth_src) +
+                       " != " + str(res_match.eth_src))
+    parent.assertEqual(str(req_match.eth_dst), str(res_match.eth_dst),
+                       'Match failed: eth_dst: ' + str(req_match.eth_dst) +
+                       " != " + str(res_match.eth_dst))
+    parent.assertEqual(req_match.vlan_vid, res_match.vlan_vid,
+                       'Match failed: vlan_vid: ' + str(req_match.vlan_vid) +
+                       " != " + str(res_match.vlan_vid))
+    parent.assertEqual(req_match.vlan_pcp, res_match.vlan_pcp,
+                       'Match failed: vlan_pcp: ' + 
+                       str(req_match.vlan_pcp) + " != " + 
+                       str(res_match.vlan_pcp))
+    parent.assertEqual(req_match.eth_type, res_match.eth_type,
+                       'Match failed: eth_type: ' + str(req_match.eth_type) +
+                       " != " + str(res_match.eth_type))
 
-    if (not(req_match.wildcards & of10.cstruct.OFPFW_DL_TYPE)
-        and (req_match.dl_type == IP_ETHERTYPE)):
-        parent.assertEqual(req_match.nw_tos, res_match.nw_tos,
-                           'Match failed: nw_tos: ' + str(req_match.nw_tos) +
-                           " != " + str(res_match.nw_tos))
-        parent.assertEqual(req_match.nw_proto, res_match.nw_proto,
-                           'Match failed: nw_proto: ' + str(req_match.nw_proto) +
-                           " != " + str(res_match.nw_proto))
-        parent.assertEqual(req_match.nw_src, res_match.nw_src,
-                           'Match failed: nw_src: ' + str(req_match.nw_src) +
-                           " != " + str(res_match.nw_src))
-        parent.assertEqual(req_match.nw_dst, res_match.nw_dst,
-                           'Match failed: nw_dst: ' + str(req_match.nw_dst) +
-                           " != " + str(res_match.nw_dst))
+    if (not(req_match.wildcards & ofp.OFPFW_DL_TYPE)
+        and (req_match.eth_type == IP_ETHERTYPE)):
+        parent.assertEqual(req_match.ip_dscp, res_match.ip_dscp,
+                           'Match failed: ip_dscp: ' + str(req_match.ip_dscp) +
+                           " != " + str(res_match.ip_dscp))
+        parent.assertEqual(req_match.ip_proto, res_match.ip_proto,
+                           'Match failed: ip_proto: ' + str(req_match.ip_proto) +
+                           " != " + str(res_match.ip_proto))
+        parent.assertEqual(req_match.ipv4_src, res_match.ipv4_src,
+                           'Match failed: ipv4_src: ' + str(req_match.ipv4_src) +
+                           " != " + str(res_match.ipv4_src))
+        parent.assertEqual(req_match.ipv4_dst, res_match.ipv4_dst,
+                           'Match failed: ipv4_dst: ' + str(req_match.ipv4_dst) +
+                           " != " + str(res_match.ipv4_dst))
 
-        if (not(req_match.wildcards & of10.cstruct.OFPFW_NW_PROTO)
-            and ((req_match.nw_proto == TCP_PROTOCOL)
-                 or (req_match.nw_proto == UDP_PROTOCOL))):
-            parent.assertEqual(req_match.tp_src, res_match.tp_src,
-                               'Match failed: tp_src: ' + 
-                               str(req_match.tp_src) +
-                               " != " + str(res_match.tp_src))
-            parent.assertEqual(req_match.tp_dst, res_match.tp_dst,
-                               'Match failed: tp_dst: ' + 
-                               str(req_match.tp_dst) +
-                               " != " + str(res_match.tp_dst))
+        if (not(req_match.wildcards & ofp.OFPFW_NW_PROTO)
+            and ((req_match.ip_proto == TCP_PROTOCOL)
+                 or (req_match.ip_proto == UDP_PROTOCOL))):
+            parent.assertEqual(req_match.tcp_src, res_match.tcp_src,
+                               'Match failed: tcp_src: ' + 
+                               str(req_match.tcp_src) +
+                               " != " + str(res_match.tcp_src))
+            parent.assertEqual(req_match.tcp_dst, res_match.tcp_dst,
+                               'Match failed: tcp_dst: ' + 
+                               str(req_match.tcp_dst) +
+                               " != " + str(res_match.tcp_dst))
 
 def packet_to_flow_match(parent, packet):
-    match = of10.parse.packet_to_flow_match(packet)
+    match = oftest.parse.packet_to_flow_match(packet)
     match.wildcards |= required_wildcards(parent)
     return match
 
@@ -560,12 +557,12 @@
     @param in_band if True, do not wildcard ingress port
     @param egr_ports None (drop), single port or list of ports
     """
-    match = of10.parse.packet_to_flow_match(pkt)
+    match = oftest.parse.packet_to_flow_match(pkt)
     parent.assertTrue(match is not None, "Flow match from pkt failed")
     if wildcards is None:
         wildcards = required_wildcards(parent)
     if in_band:
-        wildcards &= ~of10.cstruct.OFPFW_IN_PORT
+        wildcards &= ~ofp.OFPFW_IN_PORT
     match.wildcards = wildcards
     match.in_port = ing_port
 
@@ -574,31 +571,31 @@
     else:
         egr_port_list = [egr_ports]
 
-    request = of10.message.flow_mod()
+    request = ofp.message.flow_add()
     request.match = match
     request.buffer_id = 0xffffffff
     if check_expire:
-        request.flags |= of10.cstruct.OFPFF_SEND_FLOW_REM
+        request.flags |= ofp.OFPFF_SEND_FLOW_REM
         request.hard_timeout = 1
 
     if action_list is not None:
         for act in action_list:
             logging.debug("Adding action " + act.show())
-            request.actions.add(act)
+            request.actions.append(act)
 
     # Set up output/enqueue action if directed
     if egr_queue is not None:
         parent.assertTrue(egr_ports is not None, "Egress port not set")
-        act = of10.action.action_enqueue()
+        act = ofp.action.enqueue()
         for egr_port in egr_port_list:
             act.port = egr_port
             act.queue_id = egr_queue
-            request.actions.add(act)
+            request.actions.append(act)
     elif egr_ports is not None:
         for egr_port in egr_port_list:
-            act = of10.action.action_output()
+            act = ofp.action.output()
             act.port = egr_port
-            request.actions.add(act)
+            request.actions.append(act)
 
     logging.debug(request.show())
 
@@ -627,7 +624,7 @@
     do_barrier(parent.controller)
 
 def flow_match_test_port_pair(parent, ing_port, egr_ports, wildcards=None,
-                              dl_vlan=-1, pkt=None, exp_pkt=None,
+                              vlan_vid=-1, pkt=None, exp_pkt=None,
                               action_list=None):
     """
     Flow match test on single TCP packet
@@ -641,9 +638,9 @@
         wildcards = required_wildcards(parent)
     logging.info("Pkt match test: " + str(ing_port) + " to " + 
                        str(egr_ports))
-    logging.debug("  WC: " + hex(wildcards) + " vlan: " + str(dl_vlan))
+    logging.debug("  WC: " + hex(wildcards) + " vlan: " + str(vlan_vid))
     if pkt is None:
-        pkt = simple_tcp_packet(dl_vlan_enable=(dl_vlan >= 0), dl_vlan=dl_vlan)
+        pkt = simple_tcp_packet(dl_vlan_enable=(vlan_vid >= 0), vlan_vid=vlan_vid)
 
     request = flow_msg_create(parent, pkt, ing_port=ing_port, 
                               wildcards=wildcards, egr_ports=egr_ports,
@@ -660,7 +657,7 @@
     receive_pkt_verify(parent, egr_ports, exp_pkt, ing_port)
 
 def flow_match_test_pktout(parent, ing_port, egr_ports,
-                           dl_vlan=-1, pkt=None, exp_pkt=None,
+                           vlan_vid=-1, pkt=None, exp_pkt=None,
                            action_list=None):
     """
     Packet-out test on single TCP packet
@@ -672,21 +669,21 @@
     """
 
     if pkt is None:
-        pkt = simple_tcp_packet(dl_vlan_enable=(dl_vlan >= 0), dl_vlan=dl_vlan)
+        pkt = simple_tcp_packet(dl_vlan_enable=(vlan_vid >= 0), vlan_vid=vlan_vid)
 
-    msg = of10.message.packet_out()
+    msg = ofp.message.packet_out()
     msg.in_port = ing_port
     msg.data = str(pkt)
     if action_list is not None:
         for act in action_list:
-            msg.actions.add(act)
+            msg.actions.append(act)
 
     # Set up output action
     if egr_ports is not None:
         for egr_port in egr_ports:
-            act = of10.action.action_output()
+            act = ofp.action.output()
             act.port = egr_port
-            msg.actions.add(act)
+            msg.actions.append(act)
 
     logging.debug(msg.show())
     parent.controller.message_send(msg)
@@ -719,7 +716,7 @@
     logging.debug("Could not generate enough egress ports for test")
     return []
     
-def flow_match_test(parent, port_map, wildcards=None, dl_vlan=-1, pkt=None, 
+def flow_match_test(parent, port_map, wildcards=None, vlan_vid=-1, pkt=None, 
                     exp_pkt=None, action_list=None,
                     max_test=0, egr_count=1, ing_port=False):
     """
@@ -730,7 +727,7 @@
     and logging
     @param pkt If not None, use this packet for ingress
     @param wildcards For flow match entry
-    @param dl_vlan If not -1, and pkt is None, create a pkt w/ VLAN tag
+    @param vlan_vid If not -1, and pkt is None, create a pkt w/ VLAN tag
     @param exp_pkt If not None, use this as the expected output pkt; els use pkt
     @param action_list Additional actions to add to flow mod
     @param egr_count Number of egress ports; -1 means get from config w/ dflt 2
@@ -750,12 +747,12 @@
         egr_ports = get_egr_list(parent, of_ports, egr_count, 
                                  exclude_list=[ingress_port])
         if ing_port:
-            egr_ports.append(of10.cstruct.OFPP_IN_PORT)
+            egr_ports.append(ofp.OFPP_IN_PORT)
         if len(egr_ports) == 0:
             parent.assertTrue(0, "Failed to generate egress port list")
 
         flow_match_test_port_pair(parent, ingress_port, egr_ports, 
-                                  wildcards=wildcards, dl_vlan=dl_vlan, 
+                                  wildcards=wildcards, vlan_vid=vlan_vid, 
                                   pkt=pkt, exp_pkt=exp_pkt,
                                   action_list=action_list)
         test_count += 1
@@ -770,9 +767,9 @@
     egr_ports = get_egr_list(parent, of_ports, egr_count,
                              exclude_list=[ingress_port])
     if ing_port:
-        egr_ports.append(of10.cstruct.OFPP_IN_PORT)
+        egr_ports.append(ofp.OFPP_IN_PORT)
     flow_match_test_pktout(parent, ingress_port, egr_ports,
-                           dl_vlan=dl_vlan,
+                           vlan_vid=vlan_vid,
                            pkt=pkt, exp_pkt=exp_pkt,
                            action_list=action_list)
 
@@ -816,43 +813,43 @@
     if field_to_mod in ['pktlen']:
         return None
 
-    if field_to_mod == 'dl_dst':
-        act = of10.action.action_set_dl_dst()
-        act.dl_addr = of10.parse.parse_mac(mod_field_vals['dl_dst'])
-    elif field_to_mod == 'dl_src':
-        act = of10.action.action_set_dl_src()
-        act.dl_addr = of10.parse.parse_mac(mod_field_vals['dl_src'])
+    if field_to_mod == 'eth_dst':
+        act = ofp.action.set_dl_dst()
+        act.dl_addr = oftest.parse.parse_mac(mod_field_vals['eth_dst'])
+    elif field_to_mod == 'eth_src':
+        act = ofp.action.set_dl_src()
+        act.dl_addr = oftest.parse.parse_mac(mod_field_vals['eth_src'])
     elif field_to_mod == 'dl_vlan_enable':
         if not mod_field_vals['dl_vlan_enable']: # Strip VLAN tag
-            act = of10.action.action_strip_vlan()
-        # Add VLAN tag is handled by dl_vlan field
+            act = ofp.action.strip_vlan()
+        # Add VLAN tag is handled by vlan_vid field
         # Will return None in this case
-    elif field_to_mod == 'dl_vlan':
-        act = of10.action.action_set_vlan_vid()
-        act.vlan_vid = mod_field_vals['dl_vlan']
-    elif field_to_mod == 'dl_vlan_pcp':
-        act = of10.action.action_set_vlan_pcp()
-        act.vlan_pcp = mod_field_vals['dl_vlan_pcp']
+    elif field_to_mod == 'vlan_vid':
+        act = ofp.action.set_vlan_vid()
+        act.vlan_vid = mod_field_vals['vlan_vid']
+    elif field_to_mod == 'vlan_pcp':
+        act = ofp.action.set_vlan_pcp()
+        act.vlan_pcp = mod_field_vals['vlan_pcp']
     elif field_to_mod == 'ip_src':
-        act = of10.action.action_set_nw_src()
-        act.nw_addr = of10.parse.parse_ip(mod_field_vals['ip_src'])
+        act = ofp.action.set_nw_src()
+        act.nw_addr = oftest.parse.parse_ip(mod_field_vals['ip_src'])
     elif field_to_mod == 'ip_dst':
-        act = of10.action.action_set_nw_dst()
-        act.nw_addr = of10.parse.parse_ip(mod_field_vals['ip_dst'])
+        act = ofp.action.set_nw_dst()
+        act.nw_addr = oftest.parse.parse_ip(mod_field_vals['ip_dst'])
     elif field_to_mod == 'ip_tos':
-        act = of10.action.action_set_nw_tos()
+        act = ofp.action.set_nw_tos()
         act.nw_tos = mod_field_vals['ip_tos']
     elif field_to_mod == 'tcp_sport':
-        act = of10.action.action_set_tp_src()
+        act = ofp.action.set_tp_src()
         act.tp_port = mod_field_vals['tcp_sport']
     elif field_to_mod == 'tcp_dport':
-        act = of10.action.action_set_tp_dst()
+        act = ofp.action.set_tp_dst()
         act.tp_port = mod_field_vals['tcp_dport']
     elif field_to_mod == 'udp_sport':
-        act = of10.action.action_set_tp_src()
+        act = ofp.action.set_tp_src()
         act.tp_port = mod_field_vals['udp_sport']
     elif field_to_mod == 'udp_dport':
-        act = of10.action.action_set_tp_dst()
+        act = ofp.action.set_tp_dst()
         act.tp_port = mod_field_vals['udp_dport']
     else:
         parent.assertTrue(0, "Unknown field to modify: " + str(field_to_mod))
@@ -878,11 +875,11 @@
 
     base_pkt_params = {}
     base_pkt_params['pktlen'] = 100
-    base_pkt_params['dl_dst'] = '00:DE:F0:12:34:56'
-    base_pkt_params['dl_src'] = '00:23:45:67:89:AB'
+    base_pkt_params['eth_dst'] = '00:DE:F0:12:34:56'
+    base_pkt_params['eth_src'] = '00:23:45:67:89:AB'
     base_pkt_params['dl_vlan_enable'] = False
-    base_pkt_params['dl_vlan'] = 2
-    base_pkt_params['dl_vlan_pcp'] = 0
+    base_pkt_params['vlan_vid'] = 2
+    base_pkt_params['vlan_pcp'] = 0
     base_pkt_params['ip_src'] = '192.168.0.1'
     base_pkt_params['ip_dst'] = '192.168.0.2'
     base_pkt_params['ip_tos'] = 0
@@ -897,11 +894,11 @@
 
     mod_pkt_params = {}
     mod_pkt_params['pktlen'] = 100
-    mod_pkt_params['dl_dst'] = '00:21:0F:ED:CB:A9'
-    mod_pkt_params['dl_src'] = '00:ED:CB:A9:87:65'
+    mod_pkt_params['eth_dst'] = '00:21:0F:ED:CB:A9'
+    mod_pkt_params['eth_src'] = '00:ED:CB:A9:87:65'
     mod_pkt_params['dl_vlan_enable'] = False
-    mod_pkt_params['dl_vlan'] = 3
-    mod_pkt_params['dl_vlan_pcp'] = 7
+    mod_pkt_params['vlan_vid'] = 3
+    mod_pkt_params['vlan_pcp'] = 7
     mod_pkt_params['ip_src'] = '10.20.30.40'
     mod_pkt_params['ip_dst'] = '50.60.70.80'
     mod_pkt_params['ip_tos'] = 0xf0
@@ -926,9 +923,9 @@
 
         if vid:
             base_pkt_params['dl_vlan_enable'] = True
-            base_pkt_params['dl_vlan'] = vid
-            if 'dl_vlan' in mod_fields:
-                mod_pkt_params['dl_vlan'] = vid + 1
+            base_pkt_params['vlan_vid'] = vid
+            if 'vlan_vid' in mod_fields:
+                mod_pkt_params['vlan_vid'] = vid + 1
 
         if add_vlan:
             base_pkt_params['dl_vlan_enable'] = False
@@ -936,8 +933,8 @@
             mod_pkt_params['pktlen'] = base_pkt_params['pktlen'] + 4
             mod_fields.append('pktlen')
             mod_fields.append('dl_vlan_enable')
-            if 'dl_vlan' not in mod_fields:
-                mod_fields.append('dl_vlan')
+            if 'vlan_vid' not in mod_fields:
+                mod_fields.append('vlan_vid')
         elif strip_vlan:
             base_pkt_params['dl_vlan_enable'] = True
             mod_pkt_params['dl_vlan_enable'] = False
@@ -969,10 +966,10 @@
 # Generate a simple "drop" flow mod
 # If in_band is true, then only drop from first test port
 def flow_mod_gen(port_map, in_band):
-    request = of10.message.flow_mod()
-    request.match.wildcards = of10.cstruct.OFPFW_ALL
+    request = ofp.message.flow_add()
+    request.match.wildcards = ofp.OFPFW_ALL
     if in_band:
-        request.match.wildcards = of10.cstruct.OFPFW_ALL - of10.cstruct.OFPFW_IN_PORT
+        request.match.wildcards = ofp.OFPFW_ALL - ofp.OFPFW_IN_PORT
         for of_port, ifname in port_map.items(): # Grab first port
             break
         request.match.in_port = of_port
@@ -1002,28 +999,28 @@
     @returns dict with keys flows, packets, bytes, active (flows), 
     lookups, matched
     """
-    stat_req = of10.message.aggregate_stats_request()
-    stat_req.match = of10.cstruct.ofp_match()
-    stat_req.match.wildcards = of10.cstruct.OFPFW_ALL
+    stat_req = ofp.message.aggregate_stats_request()
+    stat_req.match = ofp.match()
+    stat_req.match.wildcards = ofp.OFPFW_ALL
     stat_req.table_id = 0xff
-    stat_req.out_port = of10.cstruct.OFPP_NONE
+    stat_req.out_port = ofp.OFPP_NONE
 
     rv = {}
 
     (reply, pkt) = parent.controller.transact(stat_req)
-    parent.assertTrue(len(reply.stats) == 1, "Did not receive flow stats reply")
+    parent.assertTrue(len(reply.entries) == 1, "Did not receive flow stats reply")
 
-    for obj in reply.stats:
+    for obj in reply.entries:
         (rv["flows"], rv["packets"], rv["bytes"]) = (obj.flow_count, 
                                                   obj.packet_count, obj.byte_count)
         break
 
-    request = of10.message.table_stats_request()
+    request = ofp.message.table_stats_request()
     (reply , pkt) = parent.controller.transact(request)
 
     
     (rv["active"], rv["lookups"], rv["matched"]) = (0,0,0)
-    for obj in reply.stats:
+    for obj in reply.entries:
         rv["active"] += obj.active_count
         rv["lookups"] += obj.lookup_count
         rv["matched"] += obj.matched_count
@@ -1147,18 +1144,18 @@
     stats = []
     reply, _ = test.controller.transact(req)
     test.assertTrue(reply is not None, "No response to stats request")
-    stats.extend(reply.stats)
-    while reply.flags & of10.OFPSF_REPLY_MORE != 0:
-        reply, pkt = self.controller.poll(exp_msg=of10.OFPT_STATS_REPLY)
+    stats.extend(reply.entries)
+    while reply.flags & ofp.OFPSF_REPLY_MORE != 0:
+        reply, pkt = self.controller.poll(exp_msg=ofp.OFPT_STATS_REPLY)
         test.assertTrue(reply is not None, "No response to stats request")
-        stats.extend(reply.stats)
+        stats.extend(reply.entries)
     return stats
 
-def get_flow_stats(test, match, table_id=0xff, out_port=of10.cstruct.OFPP_NONE):
+def get_flow_stats(test, match, table_id=0xff, out_port=ofp.OFPP_NONE):
     """
     Retrieve a list of flow stats entries.
     """
-    req = of10.message.flow_stats_request(match=match,
+    req = ofp.message.flow_stats_request(match=match,
                                           table_id=table_id,
                                           out_port=out_port)
     return get_stats(test, req)
@@ -1167,18 +1164,18 @@
     """
     Retrieve a list of port stats entries.
     """
-    req = of10.message.port_stats_request(port_no=port_no)
+    req = ofp.message.port_stats_request(port_no=port_no)
     return get_stats(test, req)
 
 def get_queue_stats(test, port_no, queue_id):
     """
     Retrieve a list of queue stats entries.
     """
-    req = of10.message.queue_stats_request(port_no=port_no, queue_id=queue_id)
+    req = ofp.message.queue_stats_request(port_no=port_no, queue_id=queue_id)
     return get_stats(test, req)
 
 def verify_flow_stats(test, match, table_id=0xff,
-                      out_port=of10.cstruct.OFPP_NONE,
+                      out_port=ofp.OFPP_NONE,
                       initial=[],
                       pkts=None, bytes=None):
     """
diff --git a/tests/FuncUtils.py b/tests/FuncUtils.py
index cbbf87e..1aefae1 100644
--- a/tests/FuncUtils.py
+++ b/tests/FuncUtils.py
@@ -5,10 +5,8 @@
 import random
 
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import logging
 import types
@@ -20,17 +18,16 @@
 #################### Functions for various types of flow_mod  ##########################################################################################
 
 def match_send_flowadd(self, match, priority, port):
-    msg = message.flow_mod()
+    msg = ofp.message.flow_add()
     msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
     # msg.cookie = random.randint(0,9007199254740992)
     msg.buffer_id = 0xffffffff
     msg.match = match
     if priority != None :
         msg.priority = priority
-    act = action.action_output()
+    act = ofp.action.output()
     act.port = port 
-    msg.actions.add(act)
+    msg.actions.append(act)
     self.controller.message_send(msg)
     do_barrier(self.controller)
 
@@ -42,7 +39,7 @@
     match = parse.packet_to_flow_match(pkt_exactflow)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
     match.in_port = of_ports[0]
-    #match.nw_src = 1
+    #match.ipv4_src = 1
     match.wildcards=0
     match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_exactflow,match)
@@ -55,7 +52,7 @@
     match = parse.packet_to_flow_match(pkt_exactflow)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
     match.in_port = of_ports[0]
-    #match.nw_src = 1
+    #match.ipv4_src = 1
     match.wildcards=0
     match_send_flowadd(self, match, priority, of_ports[2])
     return (pkt_exactflow,match)         
@@ -69,7 +66,7 @@
     match1 = parse.packet_to_flow_match(pkt_wildcardsrc)
     self.assertTrue(match1 is not None, "Could not generate flow match from pkt")
     match1.in_port = of_ports[0]
-    #match1.nw_src = 1
+    #match1.ipv4_src = 1
     match1.wildcards = ofp.OFPFW_DL_SRC
     match_send_flowadd(self, match1, priority, of_ports[1])
     return (pkt_wildcardsrc,match1)
@@ -78,7 +75,7 @@
     #Generate Match_Ethernet_SrC_Address flow
 
     #Create a simple tcp packet and generate match on ethernet src address flow
-    pkt_MatchSrc = simple_eth_packet(dl_src='00:01:01:01:01:01')
+    pkt_MatchSrc = simple_eth_packet(eth_src='00:01:01:01:01:01')
     match = parse.packet_to_flow_match(pkt_MatchSrc)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_SRC
@@ -89,7 +86,7 @@
     #Generate Match_Ethernet_Dst_Address flow
 
     #Create a simple tcp packet and generate match on ethernet dst address flow
-    pkt_matchdst = simple_eth_packet(dl_dst='00:01:01:01:01:01')
+    pkt_matchdst = simple_eth_packet(eth_dst='00:01:01:01:01:01')
     match = parse.packet_to_flow_match(pkt_matchdst)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
@@ -138,7 +135,7 @@
     #Generate Match_Vlan_Id
 
     #Create a simple tcp packet and generate match on ethernet dst address flow
-    pkt_matchvlanid = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=1)
+    pkt_matchvlanid = simple_tcp_packet(dl_vlan_enable=True,vlan_vid=1)
     match = parse.packet_to_flow_match(pkt_matchvlanid)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
@@ -150,7 +147,7 @@
     #Generate Match_Vlan_Priority
 
     #Create a simple tcp packet and generate match on ethernet dst address flow
-    pkt_matchvlanpcp = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=1,dl_vlan_pcp=5)
+    pkt_matchvlanpcp = simple_tcp_packet(dl_vlan_enable=True,vlan_vid=1,vlan_pcp=5)
     match = parse.packet_to_flow_match(pkt_matchvlanpcp)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
@@ -163,7 +160,7 @@
     #Generate Match_Mul_L2 flow
 
     #Create a simple eth packet and generate match on ethernet protocol flow
-    pkt_mulL2 = simple_eth_packet(dl_type=0x88cc,dl_src='00:01:01:01:01:01',dl_dst='00:01:01:01:01:02')
+    pkt_mulL2 = simple_eth_packet(eth_type=0x88cc,eth_src='00:01:01:01:01:01',eth_dst='00:01:01:01:01:02')
     match = parse.packet_to_flow_match(pkt_mulL2)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
@@ -310,7 +307,7 @@
     #Generate a Match_Ethernet_Type flow
 
     #Create a simple tcp packet and generate match on ethernet type flow
-    pkt_matchtype = simple_eth_packet(dl_type=0x88cc)
+    pkt_matchtype = simple_eth_packet(eth_type=0x88cc)
     match = parse.packet_to_flow_match(pkt_matchtype)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
@@ -325,14 +322,13 @@
 # Strict Modify the flow Action 
         
     #Create a flow_mod message , command MODIFY_STRICT
-    msg5 = message.flow_mod()
+    msg5 = ofp.message.flow_modify_strict()
     msg5.match = match
     msg5.cookie = random.randint(0,9007199254740992)
-    msg5.command = ofp.OFPFC_MODIFY_STRICT
     msg5.buffer_id = 0xffffffff
-    act5 = action.action_output()
+    act5 = ofp.action.output()
     act5.port = egress_port
-    msg5.actions.add(act5)
+    msg5.actions.append(act5)
 
     if priority != None :
         msg5.priority = priority
@@ -345,16 +341,15 @@
 # Modify the flow action
         
     #Create a flow_mod message , command MODIFY 
-    msg8 = message.flow_mod()
+    msg8 = ofp.message.flow_modify()
     msg8.match = match
     msg8.cookie = random.randint(0,9007199254740992)
-    msg8.command = ofp.OFPFC_MODIFY
     #out_port will be ignored for flow adds and flow modify (here for test-case Add_Modify_With_Outport)
     msg8.out_port = of_ports[3]
     msg8.buffer_id = 0xffffffff
-    act8 = action.action_output()
+    act8 = ofp.action.output()
     act8.port = of_ports[2]
-    msg8.actions.add(act8)
+    msg8.actions.append(act8)
 
     if priority != None :
         msg8.priority = priority
@@ -373,13 +368,13 @@
             "Could not generate flow match from pkt")
     
     match.in_port = ingress_port
-    request = message.flow_mod()
+    request = ofp.message.flow_add()
     request.match = match
     request.buffer_id = 0xffffffff
-    act = action.action_enqueue()
+    act = ofp.action.enqueue()
     act.port     = egress_port
     act.queue_id = egress_queue_id
-    request.actions.add(act)
+    request.actions.append(act)
     
     logging.info("Inserting flow")
     self.controller.message_send(request)
@@ -391,7 +386,7 @@
 def get_flowstats(self,match):
     # Generate flow_stats request
     
-    stat_req = message.flow_stats_request()
+    stat_req = ofp.message.flow_stats_request()
     stat_req.match = match
     stat_req.table_id = 0xff
     stat_req.out_port = ofp.OFPP_NONE
@@ -405,7 +400,7 @@
 def get_portstats(self,port_num):
 
 # Return all the port counters in the form a tuple 
-    port_stats_req = message.port_stats_request()
+    port_stats_req = ofp.message.port_stats_request()
     port_stats_req.port_no = port_num  
     response,pkt = self.controller.transact(port_stats_req)
     self.assertTrue(response is not None,"No response received for port stats request") 
@@ -424,7 +419,7 @@
     tx_err=0
 
 
-    for obj in response.stats:
+    for obj in response.entries:
         rx_pkts += obj.rx_packets
         tx_pkts += obj.tx_packets
         rx_byts += obj.rx_bytes
@@ -443,7 +438,7 @@
 def get_queuestats(self,port_num,queue_id):
 #Generate Queue Stats request 
 
-    request = message.queue_stats_request()
+    request = ofp.message.queue_stats_request()
     request.port_no  = port_num
     request.queue_id = queue_id
     (queue_stats, p) = self.controller.transact(request)
@@ -454,7 +449,7 @@
 def get_tablestats(self):
 # Send Table_Stats request (retrieve current table counters )
 
-    stat_req = message.table_stats_request()
+    stat_req = ofp.message.table_stats_request()
     response, pkt = self.controller.transact(stat_req,
                                                      timeout=5)
     self.assertTrue(response is not None, 
@@ -463,7 +458,7 @@
     current_matched = 0
     current_active = 0 
 
-    for obj in response.stats:
+    for obj in response.entries:
         current_lookedup += obj.lookup_count
         current_matched  += obj.matched_count
         current_active += obj.active_count
@@ -474,7 +469,7 @@
 
 def verify_tablestats(self,expect_lookup=None,expect_match=None,expect_active=None):
 
-    stat_req = message.table_stats_request()
+    stat_req = ofp.message.table_stats_request()
     
     for i in range(0,100):
 
@@ -488,7 +483,7 @@
         matched = 0 
         active = 0
         
-        for item in response.stats:
+        for item in response.entries:
             lookedup += item.lookup_count
             matched += item.matched_count
             active += item.active_count
@@ -518,9 +513,8 @@
 # Issue Strict Delete 
         
     #Create flow_mod message, command DELETE_STRICT
-    msg4 = message.flow_mod()
+    msg4 = ofp.message.flow_delete_strict()
     msg4.out_port = ofp.OFPP_NONE
-    msg4.command = ofp.OFPFC_DELETE_STRICT
     msg4.buffer_id = 0xffffffff
     msg4.match = match
 
@@ -535,9 +529,8 @@
 # Issue Non_Strict Delete 
         
     #Create flow_mod message, command DELETE
-    msg6 = message.flow_mod()
+    msg6 = ofp.message.flow_delete()
     msg6.out_port = ofp.OFPP_NONE
-    msg6.command = ofp.OFPFC_DELETE
     msg6.buffer_id = 0xffffffff
     msg6.match = match
 
@@ -574,7 +567,7 @@
 
     cache_supported_actions = None
     if cache_supported_actions is None or not use_cache:
-        request = message.features_request()
+        request = ofp.message.features_request()
         (reply, pkt) = parent.controller.transact(request)
         parent.assertTrue(reply is not None, "Did not get response to ftr req")
         cache_supported_actions = reply.actions
diff --git a/tests/actions.py b/tests/actions.py
index bacb67c..494d941 100644
--- a/tests/actions.py
+++ b/tests/actions.py
@@ -14,10 +14,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 
@@ -51,9 +49,8 @@
         match.wildcards=ofp.OFPFW_ALL
         match.in_port = of_ports[0]
         
-        msg = message.flow_mod()
+        msg = ofp.message.flow_add()
         msg.out_port = ofp.OFPP_NONE
-        msg.command = ofp.OFPFC_ADD
         msg.buffer_id = 0xffffffff
         msg.match = match
         self.controller.message_send(msg)
@@ -87,10 +84,10 @@
         logging.info("Expecting Features Reply with supported actions")
 
         # Sending Features_Request
-        request = message.features_request()
+        request = ofp.message.features_request()
         (reply, pkt) = self.controller.transact(request)
         self.assertTrue(reply is not None, "Failed to get any reply")
-        self.assertEqual(reply.header.type, ofp.OFPT_FEATURES_REPLY,'Response is not Features_reply')
+        self.assertEqual(reply.type, ofp.OFPT_FEATURES_REPLY,'Response is not Features_reply')
         
         supported_actions =[]
         if(reply.actions &1<<ofp.OFPAT_OUTPUT):
@@ -144,7 +141,7 @@
         #Create a packet
         pkt = simple_tcp_packet()
         match = parse.packet_to_flow_match(pkt)
-        act = action.action_output()
+        act = ofp.action.output()
 
         #Delete all flows 
         delete_all_flows(self.controller)
@@ -152,11 +149,11 @@
         match.in_port = ingress_port
 
         #Create a flow mod with action.port = OFPP_ALL
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
         request.match.wildcards = ofp.OFPFW_ALL&~ofp.OFPFW_IN_PORT
         act.port = ofp.OFPP_ALL
-        request.actions.add(act)
+        request.actions.append(act)
         
         logging.info("Inserting flow")
         self.controller.message_send(request)
@@ -195,7 +192,7 @@
         #Create packet
         pkt = simple_tcp_packet()
         match = parse.packet_to_flow_match(pkt)
-        act = action.action_output()
+        act = ofp.action.output()
 
         for ingress_port in of_ports:
             #Delete all flows 
@@ -204,10 +201,10 @@
             match.in_port = ingress_port
             
             #Create a flow mod message
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             act.port = ofp.OFPP_CONTROLLER
-            request.actions.add(act)
+            request.actions.append(act)
 
             logging.info("Inserting flow")
             self.controller.message_send(request)
@@ -247,7 +244,7 @@
         #Clear switch state
         pkt = simple_tcp_packet()
         match = parse.packet_to_flow_match(pkt)
-        act = action.action_output()
+        act = ofp.action.output()
 
         for ingress_port in of_ports:
             #Delete the flows
@@ -255,10 +252,10 @@
 
             match.in_port = ingress_port
             #Create flow mod message
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             act.port = ofp.OFPP_LOCAL
-            request.actions.add(act)
+            request.actions.append(act)
 
             logging.info("Inserting flow")
             self.controller.message_send(request)
@@ -295,7 +292,7 @@
         #Create a packet
         pkt = simple_tcp_packet()
         match = parse.packet_to_flow_match(pkt)
-        act = action.action_output()
+        act = ofp.action.output()
 
         #Delete all flows 
         delete_all_flows(self.controller)
@@ -303,11 +300,11 @@
         match.in_port = ingress_port
 
         #Create a flow mod with action.port = OFPP_ALL
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
         request.match.wildcards = ofp.OFPFW_ALL&~ofp.OFPFW_IN_PORT
         act.port = ofp.OFPP_FLOOD
-        request.actions.add(act)
+        request.actions.append(act)
         
         logging.info("Inserting flow")
         self.controller.message_send(request)
@@ -345,7 +342,7 @@
         #Create a packet
         pkt = simple_tcp_packet()
         match = parse.packet_to_flow_match(pkt)
-        act = action.action_output()
+        act = ofp.action.output()
 
         #Delete the flows
         delete_all_flows(self.controller)
@@ -353,11 +350,11 @@
         match.in_port = ingress_port
 
         # Create a flow mod message
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
         act.port = ofp.OFPP_IN_PORT
             
-        request.actions.add(act)
+        request.actions.append(act)
         logging.info("Inserting flow")
         self.controller.message_send(request)
         do_barrier(self.controller)
@@ -396,12 +393,12 @@
         (pkt,match) = wildcard_all(self,of_ports)
         
         #Create a packet out message
-        pkt_out =message.packet_out();
+        pkt_out =ofp.message.packet_out();
         pkt_out.data = str(pkt)
         pkt_out.in_port = of_ports[0]
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = ofp.OFPP_TABLE
-        pkt_out.actions.add(act)
+        pkt_out.actions.append(act)
         self.controller.message_send(pkt_out)
 
         #Verifying packet out message recieved on the expected dataplane port. 
@@ -441,8 +438,8 @@
         len_w_vid = 104
         pkt = simple_tcp_packet(pktlen=len_wo_vid)
         exp_pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True, 
-                                    dl_vlan=new_vid,dl_vlan_pcp=0)
-        vid_act = action.action_set_vlan_vid()
+                                    vlan_vid=new_vid,vlan_pcp=0)
+        vid_act = ofp.action.set_vlan_vid()
         vid_act.vlan_vid = new_vid
 
         #Insert flow with action -- set vid , Send packet matching the flow, Verify recieved packet is expected packet
@@ -477,9 +474,9 @@
         #Create a tagged packet with old_vid to be sent, and expected packet with new_vid
         old_vid = 2
         new_vid = 3
-        pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=old_vid)
-        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=new_vid)
-        vid_act = action.action_set_vlan_vid()
+        pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=old_vid)
+        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=new_vid)
+        vid_act = ofp.action.set_vlan_vid()
         vid_act.vlan_vid = new_vid
         
         #Insert flow with action -- set vid , Send packet matching the flow.Verify recieved packet is expected packet.
@@ -516,8 +513,8 @@
         vlan_pcp = 1
         pktlen = 64 if config["minsize"] < 64 else config["minsize"]
         pkt = simple_tcp_packet(pktlen=pktlen)
-        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=vlan_id,dl_vlan_pcp=vlan_pcp, pktlen=pktlen + 4)
-        act = action.action_set_vlan_pcp()
+        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vlan_id,vlan_pcp=vlan_pcp, pktlen=pktlen + 4)
+        act = ofp.action.set_vlan_pcp()
         act.vlan_pcp = vlan_pcp
 
         #Insert flow with action -- set vLAN priority, Send packet matching the flow, Verify recieved packet is expected packet
@@ -554,9 +551,9 @@
         vid          = 123
         old_vlan_pcp = 2
         new_vlan_pcp = 3
-        pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=vid, dl_vlan_pcp=old_vlan_pcp)
-        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=vid, dl_vlan_pcp=new_vlan_pcp)
-        vid_act = action.action_set_vlan_pcp()
+        pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vid, vlan_pcp=old_vlan_pcp)
+        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vid, vlan_pcp=new_vlan_pcp)
+        vid_act = ofp.action.set_vlan_pcp()
         vid_act.vlan_pcp = new_vlan_pcp
 
         #Insert flow with action -- set vLAN priority, Send tagged packet matching the flow, Verify recieved packet is expected packet
@@ -589,8 +586,8 @@
             skip_message_emit(self, "modify_l2_src test skipped")
             return
 
-        #Create packet to be sent and expected packet with dl_src set to specified value
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_src'],
+        #Create packet to be sent and expected packet with eth_src set to specified value
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_src'],
                                                 check_test_params=True)
         
         #Insert flow with action -- set src address, Send packet matching the flow, Verify recieved packet is expected packet
@@ -623,8 +620,8 @@
             skip_message_emit(self, "modify_l2_dst test skipped")
             return
 
-        #Create packet to be sent and expected packet with dl_src set to specified value
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_dst'],
+        #Create packet to be sent and expected packet with eth_src set to specified value
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_dst'],
                                                 check_test_params=True)
         
         #Insert flow with action -- set dst address, Send packet matching the flow, Verify recieved packet is expected packet
@@ -656,7 +653,7 @@
             skip_message_emit(self, "modify_l3_src test")
             return
 
-        #Create packet to be sent and expected packet with nw_src set to specified value
+        #Create packet to be sent and expected packet with ipv4_src set to specified value
         (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['ip_src'],
                                                 check_test_params=True)
         
@@ -689,7 +686,7 @@
             skip_message_emit(self, "modify_l3_dst test skipped")
             return
         
-        #Create packet to be sent and expected packet with nw_dst set to specified value
+        #Create packet to be sent and expected packet with ipv4_dst set to specified value
         (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['ip_dst'],
                                                 check_test_params=True)
         
diff --git a/tests/basic.py b/tests/basic.py
index 54aea3a..66e0355 100644
--- a/tests/basic.py
+++ b/tests/basic.py
@@ -41,9 +41,9 @@
         response, pkt = self.controller.transact(request)
         self.assertTrue(response is not None,
                         "Did not get echo reply")
-        self.assertEqual(response.header.type, ofp.OFPT_ECHO_REPLY,
+        self.assertEqual(response.type, ofp.OFPT_ECHO_REPLY,
                          'response is not echo_reply')
-        self.assertEqual(request.header.xid, response.header.xid,
+        self.assertEqual(request.xid, response.xid,
                          'response xid != request xid')
         self.assertEqual(len(response.data), 0, 'response data non-empty')
 
@@ -56,9 +56,9 @@
         response, pkt = self.controller.transact(request)
         self.assertTrue(response is not None,
                         "Did not get echo reply (with data)")
-        self.assertEqual(response.header.type, ofp.OFPT_ECHO_REPLY,
+        self.assertEqual(response.type, ofp.OFPT_ECHO_REPLY,
                          'response is not echo_reply')
-        self.assertEqual(request.header.xid, response.header.xid,
+        self.assertEqual(request.xid, response.xid,
                          'response xid != request xid')
         self.assertEqual(request.data, response.data,
                          'response data does not match request')
@@ -84,7 +84,7 @@
         for of_port in config["port_map"].keys():
             for pkt, pt in [
                (simple_tcp_packet(), "simple TCP packet"),
-               (simple_tcp_packet(dl_vlan_enable=True,dl_vlan=vid,pktlen=108), 
+               (simple_tcp_packet(dl_vlan_enable=True,vlan_vid=vid,pktlen=108), 
                 "simple tagged TCP packet"),
                (simple_eth_packet(), "simple Ethernet packet"),
                (simple_eth_packet(pktlen=40), "tiny Ethernet packet")]:
@@ -133,7 +133,7 @@
 
         of_ports = config["port_map"].keys()
         d_port = of_ports[0]
-        pkt = simple_eth_packet(dl_dst='ff:ff:ff:ff:ff:ff')
+        pkt = simple_eth_packet(eth_dst='ff:ff:ff:ff:ff:ff')
 
         logging.info("BCast Leak Test, send to port %s" % d_port)
         self.dataplane.send(d_port, str(pkt))
@@ -391,10 +391,12 @@
         request = illegal_message.illegal_message_type()
 
         reply, pkt = self.controller.transact(request)
+        logging.info(repr(pkt))
         self.assertTrue(reply is not None, "Did not get response to bad req")
-        self.assertTrue(reply.header.type == ofp.OFPT_ERROR,
+        self.assertTrue(reply.type == ofp.OFPT_ERROR,
                         "reply not an error message")
-        self.assertTrue(reply.type == ofp.OFPET_BAD_REQUEST,
+        logging.info(reply.err_type)
+        self.assertTrue(reply.err_type == ofp.OFPET_BAD_REQUEST,
                         "reply error type is not bad request")
         self.assertTrue(reply.code == ofp.OFPBRC_BAD_TYPE,
                         "reply error code is not bad type")
@@ -416,7 +418,7 @@
             request = ofp.message.table_stats_request()
             response, _ = self.controller.transact(request)
             try:
-                table_stats = [x for x in response.stats if x.table_id == table_id][0]
+                table_stats = [x for x in response.entries if x.table_id == table_id][0]
             except IndexError:
                 raise AssertionError("table id %d not found" % table_id)
             return table_stats.config
diff --git a/tests/bsn_ipmask.py b/tests/bsn_ipmask.py
index 8304958..8dd603a 100644
--- a/tests/bsn_ipmask.py
+++ b/tests/bsn_ipmask.py
@@ -6,8 +6,7 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.base_tests as base_tests
 
 from oftest.testutils import *
@@ -48,9 +47,7 @@
         given wildcard index
         """
         logging.info("Setting index %d to mask is %s" % (index, mask))
-        m = message.vendor()
-        m.vendor = 0x005c16c7
-        m.data = struct.pack("!LBBBBL", 0, index, 0, 0, 0, mask)
+        m = ofp.message.bsn_set_ip_mask(index=index, mask=mask)
         self.controller.message_send(m)
 
     def bsn_get_ip_mask(self, index):
@@ -58,16 +55,11 @@
         Use the BSN_GET_IP_MASK_REQUEST vendor command to get the current IP mask
         for the given wildcard index
         """
-        m = message.vendor()
-        m.vendor = 0x005c16c7
-        m.data = struct.pack( "!LBBBBL", 1, index, 0, 0, 0, 0 )
-        self.controller.message_send(m)
-        m, r = self.controller.poll(ofp.OFPT_VENDOR)
-        self.assertEqual(m.vendor, 0x005c16c7, "Wrong vendor ID")
-        x = struct.unpack("!LBBBBL", m.data)
-        self.assertEqual(x[0], 2, "Wrong subtype")
-        self.assertEqual(x[1], index, "Wrong index")
-        return x[5]
+        request = ofp.message.bsn_get_ip_mask_request(index=index)
+        reply, _ = self.controller.transact(request)
+        self.assertTrue(isinstance(reply, ofp.message.bsn_get_ip_mask_reply), "Wrong reply type")
+        self.assertEqual(reply.index, index, "Wrong index")
+        return reply.mask
 
     def runTest(self):
         self.assertFalse(required_wildcards(self) & ofp.OFPFW_NW_DST_ALL,
diff --git a/tests/bsn_mirror.py b/tests/bsn_mirror.py
index 10c3f93..4e4343d 100644
--- a/tests/bsn_mirror.py
+++ b/tests/bsn_mirror.py
@@ -6,75 +6,11 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
-import oftest.action as action
-import oftest.action_list as action_list
+import ofp
 import oftest.base_tests as base_tests
 
 from oftest.testutils import *
 
-class bsn_action_mirror(action.action_vendor):
-    def __init__(self):
-        self.type = ofp.OFPAT_VENDOR
-        self.len = 24
-        self.vendor = 0x005c16c7
-        self.subtype = 1
-        self.dest_port = 0
-        self.vlan_tag = 0
-        self.copy_stage = 0
-
-    def __assert(self):
-        return (True, None)
-
-    def pack(self, assertstruct=True):
-        return struct.pack("!HHLLLLBBBB", self.type, self.len, self.vendor,
-                           self.subtype, self.dest_port, self.vlan_tag,
-                           self.copy_stage, 0, 0, 0)
-
-    def unpack(self, binaryString):
-        if len(binaryString) < self.len:
-            raise Exception("too short")
-        x = struct.unpack("!HHLLLLBBBB", binaryString[:self.len])
-        if x[0] != self.type:
-            raise Exception("wrong type")
-        if x[1] != self.len:
-            raise Exception("wrong length")
-        if x[2] != self.vendor:
-            raise Exception("wrong vendor")
-        if x[3] != self.subtype:
-            raise Exception("wrong subtype")
-        self.dest_port = x[4]
-        self.vlan_tag = x[5]
-        self.copy_stage = x[6]
-        return binaryString[self.len:]
-
-    def __len__(self):
-        return self.len
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        if self.type != other.type: return False
-        if self.len != other.len: return False
-        if self.vendor != other.vendor: return False
-        if self.subtype != other.subtype: return False
-        if self.dest_port != other.dest_port: return False
-        if self.vlan_tag != other.vlan_tag: return False
-        if self.copy_stage != other.copy_stage: return False
-        return True
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def show(self, prefix=""):
-        outstr = prefix + "action_vendor\n"
-        for f in ["type", "len", "vendor", "subtype", "dest_port", "vlan_tag",
-                  "copy_stage"]:
-            outstr += prefix + ("%s: %s\n" % (f, getattr(self, f)))
-        return outstr
-
-action_list.action_object_map[ofp.OFPAT_VENDOR] = bsn_action_mirror
-
 @nonstandard
 class BSNMirrorAction(base_tests.SimpleDataPlane):
     """
@@ -87,9 +23,7 @@
         Use the BSN_SET_MIRRORING vendor command to enable/disable
         mirror action support
         """
-        m = message.vendor()
-        m.vendor = 0x005c16c7
-        m.data = struct.pack("!LBBBB", 3, enabled, 0, 0, 0)
+        m = ofp.message.bsn_set_mirroring(report_mirror_ports=enabled)
         self.controller.message_send(m)
 
     def bsn_get_mirroring(self):
@@ -97,15 +31,10 @@
         Use the BSN_GET_MIRRORING_REQUEST vendor command to get the
         enabled/disabled state of mirror action support
         """
-        m = message.vendor()
-        m.vendor = 0x005c16c7
-        m.data = struct.pack("!LBBBB", 4, 0, 0, 0, 0)
-        self.controller.message_send(m)
-        m, r = self.controller.poll(ofp.OFPT_VENDOR, 2)
-        self.assertEqual(m.vendor, 0x005c16c7, "Wrong vendor ID")
-        x = struct.unpack("!LBBBB", m.data)
-        self.assertEqual(x[0], 5, "Wrong subtype")
-        return x[1]
+        request = ofp.message.bsn_get_mirroring_request()
+        reply, _ = self.controller.transact(request)
+        self.assertTrue(isinstance(reply, ofp.message.bsn_get_mirroring_reply), "Unexpected reply type")
+        return reply.report_mirror_ports
 
     def runTest(self):
         mirror_ports = test_param_get("mirror_ports")
@@ -117,7 +46,7 @@
 
         logging.info("Checking that mirror ports are not reported")
         self.assertEqual(bool(self.bsn_get_mirroring()), False)
-        m, r = self.controller.transact(message.features_request(), 2)
+        m, r = self.controller.transact(ofp.message.features_request(), 2)
         p = dict([(pt.port_no, pt) for pt in m.ports])
         self.assertFalse(mirror_ports[0] in p or mirror_ports[1] in p,
                          "Mirror port in features reply")
@@ -127,7 +56,7 @@
 
         logging.info("Checking that mirror ports are reported")
         self.assertEqual(bool(self.bsn_get_mirroring()), True)
-        m, r = self.controller.transact(message.features_request(), 2)
+        m, r = self.controller.transact(ofp.message.features_request(), 2)
         p = dict([(pt.port_no, pt) for pt in m.ports])
         self.assertTrue(mirror_ports[0] in p and mirror_ports[1] in p,
                         "Mirror port not in features reply")
@@ -136,19 +65,19 @@
         self.assertTrue(p[mirror_ports[1]].config & (1 << 31),
                         "Mirror port config flag not set in features reply")
 
-        act1 = bsn_action_mirror()
+        act1 = ofp.action.bsn_mirror()
         act1.dest_port = mirror_ports[0]
         act1.copy_stage = 0
-        act2 = bsn_action_mirror()
+        act2 = ofp.action.bsn_mirror()
         act2.dest_port = mirror_ports[1]
         act2.copy_stage = 0
-        act3 = action.action_output()
+        act3 = ofp.action.output()
         act3.port = ports[1]
-        flow_mod = message.flow_mod()
+        flow_mod = ofp.message.flow_add()
         flow_mod.match = match
-        flow_mod.actions.add(act1)
-        flow_mod.actions.add(act2)
-        flow_mod.actions.add(act3)
+        flow_mod.actions.append(act1)
+        flow_mod.actions.append(act2)
+        flow_mod.actions.append(act3)
         delete_all_flows(self.controller)
         self.controller.message_send(flow_mod)
         do_barrier(self.controller)
diff --git a/tests/bsn_shell.py b/tests/bsn_shell.py
index f4d9969..2ac2f08 100644
--- a/tests/bsn_shell.py
+++ b/tests/bsn_shell.py
@@ -6,8 +6,7 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.base_tests as base_tests
 
 from oftest.testutils import *
@@ -23,23 +22,17 @@
         Use the BSN_SHELL_COMMAND vendor command to run the given command
         and receive the output
         """
-        m = message.vendor()
-        m.vendor = 0x005c16c7
-        m.data = struct.pack("!LL", 6, 0) + cmd
-        rc = self.controller.message_send(m)
-        self.assertNotEqual(rc, -1, "Error sending shell command")
+        m = ofp.message.bsn_shell_command(service=0, data=cmd)
+        self.controller.message_send(m)
         out = ""
         while True:
-            m, r = self.controller.poll(ofp.OFPT_VENDOR, 60)
-            self.assertEqual(m.vendor, 0x005c16c7, "Wrong vendor ID")
-            subtype = struct.unpack("!L", m.data[:4])[0]
-            if subtype == 7:
-               out += m.data[4:]
-            elif subtype == 8:
-               status = struct.unpack("!LL", m.data)[1]
-               return status, out
+            m, _ = self.controller.poll(ofp.OFPT_VENDOR, 60)
+            if isinstance(m, ofp.message.bsn_shell_output):
+                out += m.data
+            elif isinstance(m, ofp.message.bsn_shell_status):
+                return m.status, out
             else:
-               assert False, "Wrong subtype"
+                raise AssertionError("Unexpected message received")
 
     def runTest(self):
         status, out = self.bsn_shell_command("echo _one     space_")
diff --git a/tests/caps.py b/tests/caps.py
index b87b0e2..7fceeaf 100644
--- a/tests/caps.py
+++ b/tests/caps.py
@@ -9,10 +9,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 
@@ -37,8 +35,8 @@
     for port in of_ports:
         break;
     match.in_port = port
-    match.nw_src = 1
-    request = message.flow_mod()
+    match.ipv4_src = 1
+    request = ofp.message.flow_add()
     count_check = 101  # fixme:  better way to determine this.
     if is_exact:
         match.wildcards = 0
@@ -49,7 +47,7 @@
     request.buffer_id = 0xffffffff      # set to NONE
     logging.info(request.show())
 
-    tstats = message.table_stats_request()
+    tstats = ofp.message.table_stats_request()
     try:  # Determine the table index to check (or "all")
         table_idx = config["caps_table_idx"]
     except:
@@ -65,7 +63,7 @@
     logging.info("Check every " + str(count_check) + " inserts")
 
     while True:
-        request.match.nw_src += 1
+        request.match.ipv4_src += 1
         obj.controller.message_send(request)
         flow_count += 1
         if flow_count % count_check == 0:
@@ -75,10 +73,10 @@
             logging.info(response.show())
             if table_idx == -1:  # Accumulate for all tables
                 active_flows = 0
-                for stats in response.stats:
+                for stats in response.entries:
                     active_flows += stats.active_count
             else: # Table index to use specified in config
-                active_flows = response.stats[table_idx].active_count
+                active_flows = response.entries[table_idx].active_count
             if active_flows != flow_count:
                 break
 
diff --git a/tests/counters.py b/tests/counters.py
index be6c979..77182b6 100644
--- a/tests/counters.py
+++ b/tests/counters.py
@@ -11,10 +11,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 import time
@@ -26,7 +24,7 @@
 
 def port_queues_get(self, queue_stats, port_num):
             result = []
-            for qs in queue_stats.stats:
+            for qs in queue_stats.entries:
                 if qs.port_no != port_num:
                     continue
                 result.append(qs.queue_id)
@@ -122,7 +120,7 @@
         (pkt,match) = wildcard_all_except_ingress(self,of_ports)
     
         #Create flow_stats request 
-        stat_req = message.flow_stats_request()
+        stat_req = ofp.message.flow_stats_request()
         stat_req.match= match
         stat_req.table_id = 0xff
         stat_req.out_port = ofp.OFPP_NONE
@@ -133,9 +131,9 @@
         response, pkt = self.controller.transact(stat_req)
         
         self.assertTrue(response is not None,"No response to stats request")
-        self.assertTrue(len(response.stats) == 1,"Did not receive flow stats reply")
+        self.assertTrue(len(response.entries) == 1,"Did not receive flow stats reply")
         
-        stat = response.stats[0]
+        stat = response.entries[0]
         logging.info("Duration of flow is %d s %d ns", stat.duration_sec, stat.duration_nsec) 
         self.assertTrue(stat.duration_sec == expected_duration, "Flow stats reply incorrect")
 
diff --git a/tests/cxn.py b/tests/cxn.py
index 34bacad..1a00f1f 100644
--- a/tests/cxn.py
+++ b/tests/cxn.py
@@ -12,10 +12,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 
 from oftest.testutils import *
 
@@ -90,7 +88,7 @@
         logging.info("TCP Connected " + 
                      str(self.controllers[0].switch_addr))
         logging.info("Sending hello")
-        self.controllers[0].message_send(message.hello())
+        self.controllers[0].message_send(ofp.message.hello())
 
         logging.info("Features request not sent, waiting for timeout")
 
@@ -163,7 +161,7 @@
                     if con.cstate == 0:
                         logging.info(condesc + "Sending hello to " +
                                      str(con.switch_addr))
-                        con.message_send(message.hello())
+                        con.message_send(ofp.message.hello())
                         con.cstate = 1
                         con.count = 0
                     elif con.cstate == 1:
@@ -185,7 +183,7 @@
                     elif con.cstate == 2:
                         logging.info(condesc + "Sending features request to " +
                                      str(con.switch_addr))
-                        con.message_send(message.features_request())
+                        con.message_send(ofp.message.features_request())
                         con.cstate = 3
                         con.count = 0
                     elif con.cstate == 3:
diff --git a/tests/default_drop.py b/tests/default_drop.py
index 7103f2a..574593f 100644
--- a/tests/default_drop.py
+++ b/tests/default_drop.py
@@ -6,10 +6,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.base_tests as base_tests
 
 from oftest.testutils import *
diff --git a/tests/detailed_contr_sw_messages.py b/tests/detailed_contr_sw_messages.py
index 4ca6a6b..a32251d 100644
--- a/tests/detailed_contr_sw_messages.py
+++ b/tests/detailed_contr_sw_messages.py
@@ -11,10 +11,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 
@@ -54,16 +52,15 @@
         match3.wildcards = ofp.OFPFW_ALL-ofp.OFPFW_IN_PORT
         match3.in_port = of_ports[0]
 
-        msg3 = message.flow_mod()
-        msg3.command = ofp.OFPFC_ADD
+        msg3 = ofp.message.flow_add()
         msg3.match = match3
         msg3.flags |= ofp.OFPFF_CHECK_OVERLAP
         msg3.cookie = random.randint(0,9007199254740992)
         msg3.buffer_id = 0xffffffff
        
-        act3 = action.action_output()
+        act3 = ofp.action.output()
         act3.port = of_ports[1]
-        msg3.actions.add(act3)
+        msg3.actions.append(act3)
         self.controller.message_send(msg3)
         do_barrier(self.controller)
 
@@ -75,7 +72,7 @@
                                                timeout=5)
         self.assertTrue(response is not None, 
                                'Switch did not reply with error message') 
-        self.assertTrue(response.type==ofp.OFPET_FLOW_MOD_FAILED, 
+        self.assertTrue(response.err_type==ofp.OFPET_FLOW_MOD_FAILED, 
                                'Error message type is not flow mod failed ') 
         self.assertTrue(response.code==ofp.OFPFMFC_OVERLAP, 
                                'Error Message code is not overlap')
@@ -175,17 +172,16 @@
         match = parse.packet_to_flow_match(pkt)
         match.in_port = of_ports[0]
         
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
-        request.command = ofp.OFPFC_ADD
         request.flags = request.flags|ofp.OFPFF_EMERG
         request.hard_timeout =9
         request.idle_timeout =9
         
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = of_ports[1]
         
-        request.actions.add(act)
+        request.actions.append(act)
         logging.info("Inserting flow")
         self.controller.message_send(request)
 
@@ -196,7 +192,7 @@
                                                timeout=5)
         self.assertTrue(response is not None, 
                                'Switch did not reply with error message') 
-        self.assertTrue(response.type==ofp.OFPET_FLOW_MOD_FAILED, 
+        self.assertTrue(response.err_type==ofp.OFPET_FLOW_MOD_FAILED, 
                                'Error message type is not flow mod failed ') 
         self.assertTrue(response.code==ofp.OFPFMFC_BAD_EMERG_TIMEOUT, 
                                'Error Message code is not bad emergency timeout')
@@ -222,15 +218,14 @@
 
         #Generate a flow-mod,command OFPC_MODIFY 
 
-        request = message.flow_mod()
-        request.command = ofp.OFPFC_MODIFY
+        request = ofp.message.flow_modify()
         request.match.wildcards = ofp.OFPFW_ALL-ofp.OFPFW_IN_PORT
         request.match.in_port = of_ports[0]
         request.cookie = random.randint(0,9007199254740992)
         request.buffer_id = 0xffffffff
-        act3 = action.action_output()
+        act3 = ofp.action.output()
         act3.port = of_ports[1]
-        request.actions.add(act3)
+        request.actions.append(act3)
 
         logging.info("Inserting flow")
         self.controller.message_send(request)
@@ -339,10 +334,9 @@
         logging.info("Expecting switch to ignore the command , without generating errors")
 
         # Issue a delete command 
-        msg = message.flow_mod()
+        msg = ofp.message.flow_delete()
         msg.match.wildcards = ofp.OFPFW_ALL
         msg.out_port = ofp.OFPP_NONE
-        msg.command = ofp.OFPFC_DELETE
         msg.buffer_id = 0xffffffff
 
         # Verify no message or error is generated by polling the the control plane
@@ -391,7 +385,7 @@
                         'Received flow removed message for the flow with flow_rem flag not set')
         
         # Insert another flow F' with OFPFF_SEND_FLOW_REM flag set.
-        msg9 = message.flow_mod()
+        msg9 = ofp.message.flow_add()
         msg9.match.wildcards = ofp.OFPFW_ALL
         msg9.cookie = random.randint(0,9007199254740992)
         msg9.buffer_id = 0xffffffff
@@ -434,13 +428,12 @@
         pkt = simple_tcp_packet()
         match = parse.packet_to_flow_match(pkt)
         match.in_port = of_ports[0]
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
-        request.command = ofp.OFPFC_ADD
         request.flags = request.flags|ofp.OFPFF_EMERG|ofp.OFPFF_SEND_FLOW_REM
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = of_ports[1]
-        request.actions.add(act)
+        request.actions.append(act)
 
         self.controller.message_send(request)
         
@@ -566,9 +559,8 @@
         verify_tablestats(self,expect_active=1)
 
         #Send delete command matching the flow-1 but with contraint out_port = of_port[2]
-        msg7 = message.flow_mod()
+        msg7 = ofp.message.flow_delete()
         msg7.out_port = of_ports[2]
-        msg7.command = ofp.OFPFC_DELETE
         msg7.buffer_id = 0xffffffff
         msg7.match = match
 
@@ -582,9 +574,8 @@
         logging.info("Expecting switch to delete the flow")
 
         #Send Delete command with contraint out_port = of_ports[1]
-        msg7 = message.flow_mod()
+        msg7 = ofp.message.flow_delete()
         msg7.out_port = of_ports[1]
-        msg7.command = ofp.OFPFC_DELETE
         msg7.buffer_id = 0xffffffff
         msg7.match = match
 
@@ -614,7 +605,7 @@
         logging.info("Expecting the flow entry to delete with given idle_timeout")
 
         #Insert a flow entry with idle_timeout=1.Send_Flow_Rem flag set
-        msg9 = message.flow_mod()
+        msg9 = ofp.message.flow_add()
         msg9.match.wildcards = ofp.OFPFW_ALL
         msg9.cookie = random.randint(0,9007199254740992)
         msg9.buffer_id = 0xffffffff
@@ -696,7 +687,7 @@
         logging.info("Expecting the flow entry to delete with given hard_timeout")
 
         # Insert a flow entry with hardtimeout=1 and send_flow_removed flag set
-        msg9 = message.flow_mod()
+        msg9 = ofp.message.flow_add()
         msg9.match.wildcards = ofp.OFPFW_ALL
         msg9.cookie = random.randint(0,9007199254740992)
         msg9.buffer_id = 0xffffffff
@@ -747,17 +738,16 @@
         self.assertTrue(match3 is not None, "Could not generate flow match from pkt")
         match3.wildcards = ofp.OFPFW_ALL-ofp.OFPFW_IN_PORT
         match3.in_port = of_ports[0]
-        msg3 = message.flow_mod()
+        msg3 = ofp.message.flow_add()
         msg3.out_port = of_ports[2] # ignored by flow add,flow modify 
-        msg3.command = ofp.OFPFC_ADD
         msg3.cookie = random.randint(0,9007199254740992)
         msg3.buffer_id = 0xffffffff
         msg3.hard_timeout = 1
         msg3.buffer_id = 0xffffffff
         msg3.match = match3
-        act3 = action.action_output()
+        act3 = ofp.action.output()
         act3.port = of_ports[1]
-        msg3.actions.add(act3)
+        msg3.actions.append(act3)
 
         self.controller.message_send(msg3)
         do_barrier(self.controller)
diff --git a/tests/flow_expire.py b/tests/flow_expire.py
index 484f22f..0467e4b 100644
--- a/tests/flow_expire.py
+++ b/tests/flow_expire.py
@@ -11,10 +11,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 
@@ -44,7 +42,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         of_ports = config["port_map"].keys()
         of_ports.sort()
@@ -57,14 +55,14 @@
         
         match.in_port = ingress_port
         
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
         request.cookie = random.randint(0,9007199254740992)
         request.buffer_id = 0xffffffff
         request.idle_timeout = 1
         request.flags |= ofp.OFPFF_SEND_FLOW_REM
         act.port = egress_port
-        request.actions.add(act)
+        request.actions.append(act)
         
         logging.info("Inserting flow")
         self.controller.message_send(request)
diff --git a/tests/flow_matches.py b/tests/flow_matches.py
index 9d04093..721d68b 100644
--- a/tests/flow_matches.py
+++ b/tests/flow_matches.py
@@ -12,10 +12,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 import time
@@ -52,11 +50,11 @@
         wildcard_all(self,of_ports)
 
         #check for different  match fields and verify packet implements the action specified in the flow
-        pkt1 = simple_tcp_packet(dl_src="00:01:01:01:01:01");
+        pkt1 = simple_tcp_packet(eth_src="00:01:01:01:01:01");
         self.dataplane.send(of_ports[0], str(pkt1))
         receive_pkt_check(self.dataplane,pkt1,[yes_ports],no_ports,self)
        
-        pkt2 = simple_tcp_packet(dl_dst="00:01:01:01:01:01");    
+        pkt2 = simple_tcp_packet(eth_dst="00:01:01:01:01:01");    
         self.dataplane.send(of_ports[0], str(pkt2))
         receive_pkt_check(self.dataplane,pkt2,[yes_ports],no_ports,self)
         
@@ -115,7 +113,7 @@
         receive_pkt_check(self.dataplane,pkt,[yes_ports],no_ports,self)
 
         #Sending non matching packet , verify Packetin event gets triggered.
-        pkt2 = simple_eth_packet(dl_src='00:01:01:01:01:02');
+        pkt2 = simple_eth_packet(eth_src='00:01:01:01:01:02');
         self.dataplane.send(of_ports[0], str(pkt2))
         
         (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN,timeout=4)
@@ -154,7 +152,7 @@
         receive_pkt_check(self.dataplane,pkt,[yes_ports],no_ports,self)
         
         #Send Non-matching packet
-        pkt2 = simple_eth_packet(dl_dst='00:01:01:01:01:02');
+        pkt2 = simple_eth_packet(eth_dst='00:01:01:01:01:02');
         self.dataplane.send(of_ports[0], str(pkt2))
         
         #Verify PacketIn event gets triggered
@@ -195,7 +193,7 @@
         receive_pkt_check(self.dataplane,pkt,[yes_ports],no_ports,self)
 
         #Sending non matching packet , 
-        pkt2 = simple_eth_packet(dl_type=0x0806);
+        pkt2 = simple_eth_packet(eth_type=0x0806);
         self.dataplane.send(of_ports[0], str(pkt2))
         
         #verify Packetin event gets triggered.
@@ -273,7 +271,7 @@
         receive_pkt_check(self.dataplane,pkt,[yes_ports],no_ports,self)
         
         #Send Non-matching packet, i.e packet with different Vlan Id
-        pkt2 = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=4);
+        pkt2 = simple_tcp_packet(dl_vlan_enable=True,vlan_vid=4);
         self.dataplane.send(of_ports[0], str(pkt2))
         
         #Verify PacketIn event gets triggered
@@ -313,7 +311,7 @@
         receive_pkt_check(self.dataplane,pkt,[yes_ports],no_ports,self)
         
         #Send tagged packet with same vlan_id but different vlan priority
-        pkt2 = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=1,dl_vlan_pcp=20);
+        pkt2 = simple_tcp_packet(dl_vlan_enable=True,vlan_vid=1,vlan_pcp=20);
         self.dataplane.send(of_ports[0], str(pkt2))
 
         #Verify Packet_In event gets triggered
@@ -345,28 +343,28 @@
 
         (pkt,match) = match_mul_l2(self,of_ports)   
 
-        #Send eth packet matching the dl_type field, verify it implements the action
+        #Send eth packet matching the eth_type field, verify it implements the action
         self.dataplane.send(of_ports[0], str(pkt))
 
         #Verify packet implements the action specified in the flow
         receive_pkt_check(self.dataplane,pkt,[yes_ports],no_ports,self)
 
-        #Sending non matching packet (only dl_dst is different) , verify Packetin event gets triggered.
-        pkt2 = simple_eth_packet(dl_type=0x88cc,dl_src='00:01:01:01:01:01',dl_dst='00:01:01:02:01:01');
+        #Sending non matching packet (only eth_dst is different) , verify Packetin event gets triggered.
+        pkt2 = simple_eth_packet(eth_type=0x88cc,eth_src='00:01:01:01:01:01',eth_dst='00:01:01:02:01:01');
         self.dataplane.send(of_ports[0], str(pkt2))
         
         (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN,timeout=4)
         self.assertTrue(response is not None, "PacketIn not received for non matching packet")
 
-        #Sending non matching packet (only dl_src is different) , verify Packetin event gets triggered.
-        pkt2 = simple_eth_packet(dl_type=0x88cc,dl_src='00:01:01:01:01:02',dl_dst='00:01:01:01:01:02');
+        #Sending non matching packet (only eth_src is different) , verify Packetin event gets triggered.
+        pkt2 = simple_eth_packet(eth_type=0x88cc,eth_src='00:01:01:01:01:02',eth_dst='00:01:01:01:01:02');
         self.dataplane.send(of_ports[0], str(pkt2))
         
         (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN,timeout=4)
         self.assertTrue(response is not None, "PacketIn not received for non matching packet")
 
         #Sending non matching packet (only ether_type is different) , verify Packetin event gets triggered.
-        pkt2 = simple_eth_packet(dl_type=0x0806,dl_src='00:01:01:01:01:01',dl_dst='00:01:01:01:01:02');
+        pkt2 = simple_eth_packet(eth_type=0x0806,eth_src='00:01:01:01:01:01',eth_dst='00:01:01:01:01:02');
         self.dataplane.send(of_ports[0], str(pkt2))
         
         #Verify packet_in event gets triggered
diff --git a/tests/flow_query.py b/tests/flow_query.py
index 271be11..e7f1718 100644
--- a/tests/flow_query.py
+++ b/tests/flow_query.py
@@ -67,11 +67,8 @@
 
 from oftest import config
 import oftest.controller  as controller
-import oftest.cstruct     as ofp
-import oftest.message     as message
+import ofp
 import oftest.dataplane   as dataplane
-import oftest.action      as action
-import oftest.action_list as action_list
 import oftest.parse       as parse
 import pktact
 import oftest.base_tests as base_tests
@@ -307,7 +304,7 @@
     result = "{"
     sep    = ""
     for a in all_actions_list:
-        if ((1 << a) & bm) != 0:
+        if ((1 << a) & bm) != 0 and a in ofp.ofp_action_type_map:
             result = result + sep + ofp.ofp_action_type_map[a]
             sep = ", "
     result = result + "}"
@@ -335,15 +332,15 @@
     # - idle_timeout
     # - hard_timeout
     # - priority
-    # - action_list
+    # - actions
 
     def __init__(self):
         self.priority        = 0
-        self.match           = ofp.ofp_match()
+        self.match           = ofp.match()
         self.match.wildcards = ofp.OFPFW_ALL
         self.idle_timeout    = 0
         self.hard_timeout    = 0
-        self.actions         = action_list.action_list()
+        self.actions         = []
 
     # {pri, match} is considered a flow key
     def key_equal(self, x):
@@ -356,41 +353,41 @@
            and self.match.in_port != x.match.in_port:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_DST) == 0 \
-           and self.match.dl_dst != x.match.dl_dst:
+           and self.match.eth_dst != x.match.eth_dst:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_SRC) == 0 \
-           and self.match.dl_src != x.match.dl_src:
+           and self.match.eth_src != x.match.eth_src:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_VLAN) == 0 \
-           and self.match.dl_vlan != x.match.dl_vlan:
+           and self.match.vlan_vid != x.match.vlan_vid:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_VLAN_PCP) == 0 \
-           and self.match.dl_vlan_pcp != x.match.dl_vlan_pcp:
+           and self.match.vlan_pcp != x.match.vlan_pcp:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_TYPE) == 0 \
-           and self.match.dl_type != x.match.dl_type:
+           and self.match.eth_type != x.match.eth_type:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_NW_TOS) == 0 \
-           and self.match.nw_tos != x.match.nw_tos:
+           and self.match.ip_dscp != x.match.ip_dscp:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_NW_PROTO) == 0 \
-           and self.match.nw_proto != x.match.nw_proto:
+           and self.match.ip_proto != x.match.ip_proto:
             return False
         n = wildcard_get(self.match.wildcards, ofp.OFPFW_NW_SRC_MASK)
         if n < 32:
             m = ~((1 << n) - 1)
-            if (self.match.nw_src & m) != (x.match.nw_src & m):
+            if (self.match.ipv4_src & m) != (x.match.ipv4_src & m):
                 return False
         n = wildcard_get(self.match.wildcards, ofp.OFPFW_NW_DST_MASK)
         if n < 32:
             m = ~((1 << n) - 1)
-            if (self.match.nw_dst & m) != (x.match.nw_dst & m):
+            if (self.match.ipv4_dst & m) != (x.match.ipv4_dst & m):
                 return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_TP_SRC) == 0 \
-               and self.match.tp_src != x.match.tp_src:
+               and self.match.tcp_src != x.match.tcp_src:
             return False
         if wildcard_get(self.match.wildcards, ofp.OFPFW_TP_DST) == 0 \
-               and self.match.tp_dst != x.match.tp_dst:
+               and self.match.tcp_dst != x.match.tcp_dst:
             return False
         return True
 
@@ -398,8 +395,8 @@
         if test_param_get("conservative_ordered_actions", True):
             # Compare actions lists as unordered
             
-            aa = copy.deepcopy(x.actions.actions)
-            for a in self.actions.actions:
+            aa = copy.deepcopy(x.actions)
+            for a in self.actions:
                 i = 0
                 while i < len(aa):
                     if a == aa[i]:
@@ -434,37 +431,37 @@
         if wildcard_get(self.match.wildcards, ofp.OFPFW_IN_PORT) == 0:
             result = result + (", in_port=%d" % (self.match.in_port))
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_DST) == 0:
-            result = result + (", dl_dst=%s" \
-                               % (dl_addr_to_str(self.match.dl_dst)) \
+            result = result + (", eth_dst=%s" \
+                               % (dl_addr_to_str(self.match.eth_dst)) \
                                )
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_SRC) == 0:
-            result = result + (", dl_src=%s" \
-                               % (dl_addr_to_str(self.match.dl_src)) \
+            result = result + (", eth_src=%s" \
+                               % (dl_addr_to_str(self.match.eth_src)) \
                                )
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_VLAN) == 0:
-            result = result + (", dl_vlan=%d" % (self.match.dl_vlan))
+            result = result + (", vlan_vid=%d" % (self.match.vlan_vid))
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_VLAN_PCP) == 0:
-            result = result + (", dl_vlan_pcp=%d" % (self.match.dl_vlan_pcp))
+            result = result + (", vlan_pcp=%d" % (self.match.vlan_pcp))
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_TYPE) == 0:
-            result = result + (", dl_type=0x%x" % (self.match.dl_type))
+            result = result + (", eth_type=0x%x" % (self.match.eth_type))
         if wildcard_get(self.match.wildcards, ofp.OFPFW_NW_TOS) == 0:
-            result = result + (", nw_tos=0x%x" % (self.match.nw_tos))
+            result = result + (", ip_dscp=0x%x" % (self.match.ip_dscp))
         if wildcard_get(self.match.wildcards, ofp.OFPFW_NW_PROTO) == 0:
-            result = result + (", nw_proto=%d" % (self.match.nw_proto))
+            result = result + (", ip_proto=%d" % (self.match.ip_proto))
         n = wildcard_get(self.match.wildcards, ofp.OFPFW_NW_SRC_MASK)
         if n < 32:
-            result = result + (", nw_src=%s" % \
-                               (ip_addr_to_str(self.match.nw_src, 32 - n)) \
+            result = result + (", ipv4_src=%s" % \
+                               (ip_addr_to_str(self.match.ipv4_src, 32 - n)) \
                                )
         n = wildcard_get(self.match.wildcards, ofp.OFPFW_NW_DST_MASK)
         if n < 32:
-            result = result + (", nw_dst=%s" % \
-                               (ip_addr_to_str(self.match.nw_dst, 32 - n)) \
+            result = result + (", ipv4_dst=%s" % \
+                               (ip_addr_to_str(self.match.ipv4_dst, 32 - n)) \
                                )
         if wildcard_get(self.match.wildcards, ofp.OFPFW_TP_SRC) == 0:
-            result = result + (", tp_src=%d" % self.match.tp_src)
+            result = result + (", tcp_src=%d" % self.match.tcp_src)
         if wildcard_get(self.match.wildcards, ofp.OFPFW_TP_DST) == 0:
-            result = result + (", tp_dst=%d" % self.match.tp_dst)
+            result = result + (", tcp_dst=%d" % self.match.tcp_dst)
         return result
 
     def __eq__(self, x):
@@ -475,8 +472,8 @@
         result = result + (", cookie=%d" % self.cookie)
         result = result + (", idle_timeout=%d" % self.idle_timeout)
         result = result + (", hard_timeout=%d" % self.hard_timeout)
-        for a in self.actions.actions:
-            result = result + (", action=%s" % ofp.ofp_action_type_map[a.type])
+        for a in self.actions:
+            result = result + (", action=%s" % ofp.ofp_action_type_map.get(a.type, "unknown"))
             if a.type == ofp.OFPAT_OUTPUT:
                 result = result + ("(%d)" % (a.port))
             elif a.type == ofp.OFPAT_SET_VLAN_VID:
@@ -521,50 +518,50 @@
 
         set_vlanf   = False
         strip_vlanf = False
-        self.actions = action_list.action_list()
+        self.actions = []
         for a in actions:
             act = None
             if a == ofp.OFPAT_OUTPUT:
                 pass                    # OUTPUT actions must come last
             elif a == ofp.OFPAT_SET_VLAN_VID:
                if not strip_vlanf:
-                  act = action.action_set_vlan_vid()
+                  act = ofp.action.set_vlan_vid()
                   act.vlan_vid = fi.rand_vlan()
                   set_vlanf = True
             elif a == ofp.OFPAT_SET_VLAN_PCP:
                if not strip_vlanf:
-                  act = action.action_set_vlan_pcp()
+                  act = ofp.action.set_vlan_pcp()
                   act.vlan_pcp = random.randint(0, (1 << 3) - 1)
                   set_vlanf = True
             elif a == ofp.OFPAT_STRIP_VLAN:
                if not set_vlanf:
-                  act = action.action_strip_vlan()
+                  act = ofp.action.strip_vlan()
                   strip_vlanf = True
             elif a == ofp.OFPAT_SET_DL_SRC:
-                act = action.action_set_dl_src()
+                act = ofp.action.set_dl_src()
                 act.dl_addr = fi.rand_dl_addr()
             elif a == ofp.OFPAT_SET_DL_DST:
-                act = action.action_set_dl_dst()
+                act = ofp.action.set_dl_dst()
                 act.dl_addr = fi.rand_dl_addr()
             elif a == ofp.OFPAT_SET_NW_SRC:
-                act = action.action_set_nw_src()
+                act = ofp.action.set_nw_src()
                 act.nw_addr = fi.rand_ip_addr()
             elif a == ofp.OFPAT_SET_NW_DST:
-                act = action.action_set_nw_dst()
+                act = ofp.action.set_nw_dst()
                 act.nw_addr = fi.rand_ip_addr()
             elif a == ofp.OFPAT_SET_NW_TOS:
-                act = action.action_set_nw_tos()
-                act.nw_tos = fi.rand_ip_tos()
+                act = ofp.action.set_nw_tos()
+                act.ip_dscp = fi.rand_ip_tos()
             elif a == ofp.OFPAT_SET_TP_SRC:
-                act = action.action_set_tp_src()
+                act = ofp.action.set_tp_src()
                 act.tp_port = fi.rand_l4_port()
             elif a == ofp.OFPAT_SET_TP_DST:
-                act = action.action_set_tp_dst()
+                act = ofp.action.set_tp_dst()
                 act.tp_port = fi.rand_l4_port()
             elif a == ofp.OFPAT_ENQUEUE:
                 pass                    # Enqueue actions must come last
             if act:
-                self.actions.add(act)
+                self.actions.append(act)
                 
         p = random.randint(1, 100)
         if (((1 << ofp.OFPAT_ENQUEUE) & actions_force) != 0 or p <= 33) \
@@ -573,9 +570,9 @@
             # In not forecd, one third of the time, include ENQUEUE actions
             # at end of list
             # At most 1 ENQUEUE action
-            act = action.action_enqueue()
+            act = ofp.action.enqueue()
             (act.port, act.queue_id) = rand_pick(valid_queues)
-            self.actions.add(act)
+            self.actions.append(act)
         if (((1 << ofp.OFPAT_OUTPUT) & actions_force) != 0 \
             or (p > 33 and p <= 66) \
             ) \
@@ -588,12 +585,12 @@
                 else random.randint(1, len(valid_ports))
             port_idxs = port_idxs[0 : n]
             for pi in port_idxs:
-                act = action.action_output()
+                act = ofp.action.output()
                 act.port = valid_ports[pi]
                 if act.port != ofp.OFPP_IN_PORT \
                    or wildcard_get(self.match.wildcards, ofp.OFPFW_IN_PORT) == 0:
                     # OUTPUT(IN_PORT) only valid if OFPFW_IN_PORT not wildcarded
-                    self.actions.add(act)
+                    self.actions.append(act)
         else:
             # One third of the time, include neither
             pass
@@ -629,7 +626,7 @@
 
         actions = shuffle(actions)
 
-        self.actions = action_list.action_list()
+        self.actions = []
         for a in actions:
             if a == ofp.OFPAT_OUTPUT:
                 # TBD - Output actions are clustered in list, spread them out?
@@ -638,47 +635,47 @@
                 port_idxs = shuffle(range(len(valid_ports)))
                 port_idxs = port_idxs[0 : random.randint(1, len(valid_ports))]
                 for pi in port_idxs:
-                    act = action.action_output()
+                    act = ofp.action.output()
                     act.port = valid_ports[pi]
-                    self.actions.add(act)
+                    self.actions.append(act)
             elif a == ofp.OFPAT_SET_VLAN_VID:
-                act = action.action_set_vlan_vid()
+                act = ofp.action.set_vlan_vid()
                 act.vlan_vid = fi.rand_vlan()
-                self.actions.add(act)
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_VLAN_PCP:
-                act = action.action_set_vlan_pcp()
+                act = ofp.action.set_vlan_pcp()
                 act.vlan_pcp = random.randint(0, (1 << 3) - 1)
             elif a == ofp.OFPAT_STRIP_VLAN:
-                act = action.action_strip_vlan()
-                self.actions.add(act)
+                act = ofp.action.strip_vlan()
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_DL_SRC:
-                act = action.action_set_dl_src()
+                act = ofp.action.set_dl_src()
                 act.dl_addr = fi.rand_dl_addr()
-                self.actions.add(act)
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_DL_DST:
-                act = action.action_set_dl_dst()
+                act = ofp.action.set_dl_dst()
                 act.dl_addr = fi.rand_dl_addr()
-                self.actions.add(act)
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_NW_SRC:
-                act = action.action_set_nw_src()
+                act = ofp.action.set_nw_src()
                 act.nw_addr = fi.rand_ip_addr()
-                self.actions.add(act)
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_NW_DST:
-                act = action.action_set_nw_dst()
+                act = ofp.action.set_nw_dst()
                 act.nw_addr = fi.rand_ip_addr()
-                self.actions.add(act)
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_NW_TOS:
-                act = action.action_set_nw_tos()
-                act.nw_tos = fi.rand_ip_tos()
-                self.actions.add(act)
+                act = ofp.action.set_nw_tos()
+                act.ip_dscp = fi.rand_ip_tos()
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_TP_SRC:
-                act = action.action_set_tp_src()
+                act = ofp.action.set_tp_src()
                 act.tp_port = fi.rand_l4_port()
-                self.actions.add(act)
+                self.actions.append(act)
             elif a == ofp.OFPAT_SET_TP_DST:
-                act = action.action_set_tp_dst()
+                act = ofp.action.set_tp_dst()
                 act.tp_port = fi.rand_l4_port()
-                self.actions.add(act)
+                self.actions.append(act)
             elif a == ofp.OFPAT_ENQUEUE:
                 # TBD - Enqueue actions are clustered in list, spread them out?
                 if len(valid_queues) == 0:
@@ -686,9 +683,9 @@
                 qidxs = shuffle(range(len(valid_queues)))
                 qidxs = qidxs[0 : random.randint(1, len(valid_queues))]
                 for qi in qidxs:
-                    act = action.action_enqueue()
+                    act = ofp.action.enqueue()
                     (act.port, act.queue_id) = valid_queues[qi]
-                    self.actions.add(act)
+                    self.actions.append(act)
 
         return self
 
@@ -733,7 +730,7 @@
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.dl_dst = fi.rand_dl_addr()
+            self.match.eth_dst = fi.rand_dl_addr()
         else:
             self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                 ofp.OFPFW_DL_DST, \
@@ -745,7 +742,7 @@
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.dl_src = fi.rand_dl_addr()
+            self.match.eth_src = fi.rand_dl_addr()
         else:
             self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                 ofp.OFPFW_DL_SRC, \
@@ -757,7 +754,7 @@
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.dl_vlan = fi.rand_vlan()
+            self.match.vlan_vid = fi.rand_vlan()
         else:
             self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                 ofp.OFPFW_DL_VLAN, \
@@ -769,7 +766,7 @@
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.dl_vlan_pcp = random.randint(0, (1 << 3) - 1)
+            self.match.vlan_pcp = random.randint(0, (1 << 3) - 1)
         else:
             self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                 ofp.OFPFW_DL_VLAN_PCP, \
@@ -781,7 +778,7 @@
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.dl_type = fi.rand_ethertype()
+            self.match.eth_type = fi.rand_ethertype()
         else:
             self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                 ofp.OFPFW_DL_TYPE, \
@@ -802,11 +799,11 @@
                                             n \
                                             )
         if n < 32:
-            self.match.nw_src    = fi.rand_ip_addr() & ~((1 << n) - 1)
+            self.match.ipv4_src    = fi.rand_ip_addr() & ~((1 << n) - 1)
             # Specifying any IP address match other than all bits
             # don't care requires that Ethertype is one of {IP, ARP}
             if flip_coin():
-                self.match.dl_type   = rand_pick([0x0800, 0x0806])
+                self.match.eth_type   = rand_pick([0x0800, 0x0806])
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_DL_TYPE, \
                                                     0 \
@@ -826,11 +823,11 @@
                                             n \
                                             )
         if n < 32:
-            self.match.nw_dst    = fi.rand_ip_addr() & ~((1 << n) - 1)
+            self.match.ipv4_dst    = fi.rand_ip_addr() & ~((1 << n) - 1)
             # Specifying any IP address match other than all bits
             # don't care requires that Ethertype is one of {IP, ARP}
             if flip_coin():
-                self.match.dl_type   = rand_pick([0x0800, 0x0806])
+                self.match.eth_type   = rand_pick([0x0800, 0x0806])
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_DL_TYPE, \
                                                     0 \
@@ -841,10 +838,10 @@
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.nw_tos = fi.rand_ip_tos()
+            self.match.ip_dscp = fi.rand_ip_tos()
             # Specifying a TOS value requires that Ethertype is IP
             if flip_coin():
-                self.match.dl_type   = 0x0800
+                self.match.eth_type   = 0x0800
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_DL_TYPE, \
                                                     0 \
@@ -855,16 +852,16 @@
                                                 1 \
                                                 )
 
-        # Known issue on OVS with specifying nw_proto w/o dl_type as IP
+        # Known issue on OVS with specifying ip_proto w/o eth_type as IP
         if wildcard_get(wildcards_force, ofp.OFPFW_NW_PROTO) == 0 \
                and (wildcard_get(valid_wildcards, ofp.OFPFW_NW_PROTO) == 0 \
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.nw_proto = fi.rand_ip_proto()
+            self.match.ip_proto = fi.rand_ip_proto()
             # Specifying an IP protocol requires that Ethertype is IP
             if flip_coin():
-                self.match.dl_type   = 0x0800
+                self.match.eth_type   = 0x0800
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_DL_TYPE, \
                                                     0 \
@@ -880,23 +877,23 @@
                     or exact\
                     or flip_coin() \
                     ):
-            self.match.tp_src = fi.rand_l4_port()
+            self.match.tcp_src = fi.rand_l4_port()
             # Specifying a L4 port requires that IP protcol is
             # one of {ICMP, TCP, UDP}
             if flip_coin():
-                self.match.nw_proto = rand_pick([1, 6, 17])
+                self.match.ip_proto = rand_pick([1, 6, 17])
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_NW_PROTO, \
                                                     0 \
                                                     )
                 # Specifying a L4 port requirues that Ethertype is IP
-                self.match.dl_type   = 0x0800
+                self.match.eth_type   = 0x0800
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_DL_TYPE, \
                                                     0 \
                                                     )
-                if self.match.nw_proto == 1:
-                    self.match.tp_src = self.match.tp_src & 0xff
+                if self.match.ip_proto == 1:
+                    self.match.tcp_src = self.match.tcp_src & 0xff
         else:
             self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                 ofp.OFPFW_TP_SRC, \
@@ -908,23 +905,23 @@
                     or exact \
                     or flip_coin() \
                     ):
-            self.match.tp_dst = fi.rand_l4_port()
+            self.match.tcp_dst = fi.rand_l4_port()
             # Specifying a L4 port requires that IP protcol is
             # one of {ICMP, TCP, UDP}
             if flip_coin():
-                self.match.nw_proto = rand_pick([1, 6, 17])
+                self.match.ip_proto = rand_pick([1, 6, 17])
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_NW_PROTO, \
                                                     0 \
                                                     )
                 # Specifying a L4 port requirues that Ethertype is IP
-                self.match.dl_type   = 0x0800
+                self.match.eth_type   = 0x0800
                 self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                     ofp.OFPFW_DL_TYPE, \
                                                     0 \
                                                     )
-                if self.match.nw_proto == 1:
-                    self.match.tp_dst = self.match.tp_dst & 0xff
+                if self.match.ip_proto == 1:
+                    self.match.tcp_dst = self.match.tcp_dst & 0xff
         else:
             self.match.wildcards = wildcard_set(self.match.wildcards, \
                                                 ofp.OFPFW_TP_DST, \
@@ -950,7 +947,7 @@
 
     # Return flow cfg in canonical form
     # - There are dependencies between flow qualifiers, e.g. it only makes
-    #   sense to qualify nw_proto if dl_type is qualified to be 0x0800 (IP).
+    #   sense to qualify ip_proto if eth_type is qualified to be 0x0800 (IP).
     #   The canonical form of flow match criteria will "wildcard out"
     #   all such cases.
     def canonical(self):
@@ -963,10 +960,10 @@
                                                   )
 
         if wildcard_get(result.match.wildcards, ofp.OFPFW_DL_TYPE) != 0 \
-               or result.match.dl_type not in [0x0800, 0x0806]:
+               or result.match.eth_type not in [0x0800, 0x0806]:
             # dl_tyoe is wildcarded, or specified as something other
             # than IP or ARP
-            # => nw_src, nw_dst, nw_proto cannot be specified,
+            # => ipv4_src, ipv4_dst, ip_proto cannot be specified,
             # must be wildcarded
             result.match.wildcards = wildcard_set(result.match.wildcards, \
                                                   ofp.OFPFW_NW_SRC_MASK, \
@@ -982,9 +979,9 @@
                                                   )
 
         if wildcard_get(result.match.wildcards, ofp.OFPFW_DL_TYPE) != 0 \
-               or result.match.dl_type != 0x0800:
-            # dl_type is wildcarded, or specified as something other than IP
-            # => nw_tos, tp_src and tp_dst cannot be specified,
+               or result.match.eth_type != 0x0800:
+            # eth_type is wildcarded, or specified as something other than IP
+            # => ip_dscp, tcp_src and tcp_dst cannot be specified,
             #    must be wildcarded
             result.match.wildcards = wildcard_set(result.match.wildcards, \
                                                   ofp.OFPFW_NW_TOS, \
@@ -1012,10 +1009,10 @@
                                                   )
             
         if wildcard_get(result.match.wildcards, ofp.OFPFW_NW_PROTO) != 0 \
-               or result.match.nw_proto not in [1, 6, 17]:
-            # nw_proto is wildcarded, or specified as something other than ICMP,
+               or result.match.ip_proto not in [1, 6, 17]:
+            # ip_proto is wildcarded, or specified as something other than ICMP,
             # TCP or UDP
-            # => tp_src and tp_dst cannot be specified, must be wildcarded
+            # => tcp_src and tcp_dst cannot be specified, must be wildcarded
             result.match.wildcards = wildcard_set(result.match.wildcards, \
                                                   ofp.OFPFW_TP_SRC, \
                                                   1 \
@@ -1041,43 +1038,43 @@
                 return False            # Receiver more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_VLAN) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_DL_VLAN) == 0:
-                if self.match.dl_vlan != x.match.dl_vlan:
+                if self.match.vlan_vid != x.match.vlan_vid:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_SRC) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_DL_SRC) == 0:
-                if self.match.dl_src != x.match.dl_src:
+                if self.match.eth_src != x.match.eth_src:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_DST) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_DL_DST) == 0:
-                if self.match.dl_dst != x.match.dl_dst:
+                if self.match.eth_dst != x.match.eth_dst:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_TYPE) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_DL_TYPE) == 0:
-                if self.match.dl_type != x.match.dl_type:
+                if self.match.eth_type != x.match.eth_type:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Recevier more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_NW_PROTO) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_NW_PROTO) == 0:
-                if self.match.nw_proto != x.match.nw_proto:
+                if self.match.ip_proto != x.match.ip_proto:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_TP_SRC) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_TP_SRC) == 0:
-                if self.match.tp_src != x.match.tp_src:
+                if self.match.tcp_src != x.match.tcp_src:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_TP_DST) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_TP_DST) == 0:
-                if self.match.tp_dst != x.match.tp_dst:
+                if self.match.tcp_dst != x.match.tcp_dst:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
@@ -1087,7 +1084,7 @@
             return False                # Receiver more specific
         if (na < 32 and nb < 32):
             m = ~((1 << na) - 1) & ~((1 << nb) - 1)
-            if (self.match.nw_src & m) != (x.match.nw_src & m):
+            if (self.match.ipv4_src & m) != (x.match.ipv4_src & m):
                 return False            # Overlapping bits not equal
         na = wildcard_get(self.match.wildcards, ofp.OFPFW_NW_DST_MASK)
         nb = wildcard_get(x.match.wildcards, ofp.OFPFW_NW_DST_MASK)
@@ -1095,17 +1092,17 @@
             return False                # Receiver more specific
         if (na < 32 and nb < 32):
             m = ~((1 << na) - 1) & ~((1 << nb) - 1)
-            if (self.match.nw_dst & m) != (x.match.nw_dst & m):
+            if (self.match.ipv4_dst & m) != (x.match.ipv4_dst & m):
                 return False            # Overlapping bits not equal
         if wildcard_get(self.match.wildcards, ofp.OFPFW_DL_VLAN_PCP) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_DL_VLAN_PCP) == 0:
-                if self.match.dl_vlan_pcp != x.match.dl_vlan_pcp:
+                if self.match.vlan_pcp != x.match.vlan_pcp:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
         if wildcard_get(self.match.wildcards, ofp.OFPFW_NW_TOS) == 0:
             if wildcard_get(x.match.wildcards, ofp.OFPFW_NW_TOS) == 0:
-                if self.match.nw_tos != x.match.nw_tos:
+                if self.match.ip_dscp != x.match.ip_dscp:
                     return False        # Both specified, and not equal
             elif delf:
                 return False            # Receiver more specific
@@ -1165,7 +1162,7 @@
             fc = Flow_Cfg()
             fc.rand(fi, \
                     wildcards_force, \
-                    sw.tbl_stats.stats[tbl].wildcards, \
+                    sw.tbl_stats.entries[tbl].wildcards, \
                     sw.sw_features.actions, \
                     sw.valid_ports, \
                     sw.valid_queues \
@@ -1177,7 +1174,7 @@
             self.insert(fc)
             i = i + 1
             j = j + 1
-            if j >= sw.tbl_stats.stats[tbl].max_entries:
+            if j >= sw.tbl_stats.entries[tbl].max_entries:
                 tbl = tbl + 1
                 j = 0
 
@@ -1206,16 +1203,12 @@
 
     def error_handler(self, controller, msg, rawmsg):
         logging.info("Got an ERROR message, type=%d, code=%d" \
-                          % (msg.type, msg.code) \
+                          % (msg.err_type, msg.code) \
                           )
-        logging.info("Message header:")
-        logging.info(msg.header.show())
         self.error_msgs.append(msg)
 
     def removed_handler(self, controller, msg, rawmsg):
         logging.info("Got a REMOVED message")
-        logging.info("Message header:")
-        logging.info(msg.header.show())
         self.removed_msgs.append(msg)
 
     def controller_set(self, controller):
@@ -1228,7 +1221,7 @@
 
     def features_get(self):
         # Get switch features
-        request = message.features_request()
+        request = ofp.message.features_request()
         (self.sw_features, pkt) = self.controller.transact(request)
         if self.sw_features is None:
             logging.error("Get switch features failed")
@@ -1270,13 +1263,13 @@
 
     def tbl_stats_get(self):
         # Get table stats
-        request = message.table_stats_request()
+        request = ofp.message.table_stats_request()
         (self.tbl_stats, pkt) = self.controller.transact(request)
         if self.tbl_stats is None:
             logging.error("Get table stats failed")
             return False
         i = 0
-        for ts in self.tbl_stats.stats:
+        for ts in self.tbl_stats.entries:
             logging.info("Supported wildcards for table %d reported by switch:"
                            % (i)
                            )
@@ -1297,7 +1290,7 @@
 
     def queue_stats_get(self):
         # Get queue stats
-        request = message.queue_stats_request()
+        request = ofp.message.queue_stats_request()
         request.port_no  = ofp.OFPP_ALL
         request.queue_id = ofp.OFPQ_ALL
         (self.queue_stats, pkt) = self.controller.transact(request)
@@ -1305,7 +1298,7 @@
             logging.error("Get queue stats failed")
             return False
         self.valid_queues = map(lambda x: (x.port_no, x.queue_id), \
-                                self.queue_stats.stats \
+                                self.queue_stats.entries \
                                 )
         logging.info("(Port, queue) pairs reported by switch:")
         logging.info(self.valid_queues)
@@ -1325,8 +1318,8 @@
                 )
 
     def flow_stats_get(self, limit = 10000):
-        request = message.flow_stats_request()
-        query_match           = ofp.ofp_match()
+        request = ofp.message.flow_stats_request()
+        query_match           = ofp.match()
         query_match.wildcards = ofp.OFPFW_ALL
         request.match    = query_match
         request.table_id = 0xff
@@ -1345,9 +1338,9 @@
             if n == 0:
                 self.flow_stats = resp
             else:
-                self.flow_stats.stats.extend(resp.stats)
+                self.flow_stats.entries.extend(resp.entries)
             n = n + 1
-            if len(self.flow_stats.stats) > limit:
+            if len(self.flow_stats.entries) > limit:
                 logging.error("Too many flows returned")
                 return False
             if (resp.flags & 1) == 0:
@@ -1355,51 +1348,52 @@
         return (n > 0)
 
     def flow_add(self, flow_cfg, overlapf = False):
-        flow_mod_msg = message.flow_mod()
-        flow_mod_msg.command     = ofp.OFPFC_ADD
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.buffer_id   = 0xffffffff
         flow_cfg.to_flow_mod_msg(flow_mod_msg)
         if overlapf:
             flow_mod_msg.flags = flow_mod_msg.flags | ofp.OFPFF_CHECK_OVERLAP
         if flow_cfg.send_rem:
             flow_mod_msg.flags = flow_mod_msg.flags | ofp.OFPFF_SEND_FLOW_REM
-        flow_mod_msg.header.xid = random.randrange(1,0xffffffff)
+        flow_mod_msg.xid = random.randrange(1,0xffffffff)
         logging.info("Sending flow_mod(add), xid=%d"
-                        % (flow_mod_msg.header.xid)
+                        % (flow_mod_msg.xid)
                         )
         self.controller.message_send(flow_mod_msg)
         return True
 
     def flow_mod(self, flow_cfg, strictf):
-        flow_mod_msg = message.flow_mod()
-        flow_mod_msg.command     = ofp.OFPFC_MODIFY_STRICT if strictf \
-                                   else ofp.OFPFC_MODIFY
+        if strictf:
+            flow_mod_msg = ofp.message.flow_modify_strict()
+        else:
+            flow_mod_msg = ofp.message.flow_modify()
         flow_mod_msg.buffer_id   = 0xffffffff
         flow_cfg.to_flow_mod_msg(flow_mod_msg)
-        flow_mod_msg.header.xid = random.randrange(1,0xffffffff)
+        flow_mod_msg.xid = random.randrange(1,0xffffffff)
         logging.info("Sending flow_mod(mod), xid=%d"
-                        % (flow_mod_msg.header.xid)
+                        % (flow_mod_msg.xid)
                         )
         self.controller.message_send(flow_mod_msg)
         return True
 
     def flow_del(self, flow_cfg, strictf):
-        flow_mod_msg = message.flow_mod()
-        flow_mod_msg.command     = ofp.OFPFC_DELETE_STRICT if strictf \
-                                   else ofp.OFPFC_DELETE
+        if strictf:
+            flow_mod_msg = ofp.message.flow_delete_strict()
+        else:
+            flow_mod_msg = ofp.message.flow_delete()
         flow_mod_msg.buffer_id   = 0xffffffff
         # TBD - "out_port" filtering of deletes needs to be tested
         flow_mod_msg.out_port    = ofp.OFPP_NONE
         flow_cfg.to_flow_mod_msg(flow_mod_msg)
-        flow_mod_msg.header.xid = random.randrange(1,0xffffffff)
+        flow_mod_msg.xid = random.randrange(1,0xffffffff)
         logging.info("Sending flow_mod(del), xid=%d"
-                        % (flow_mod_msg.header.xid)
+                        % (flow_mod_msg.xid)
                         )
         self.controller.message_send(flow_mod_msg)
         return True
 
     def barrier(self):
-        barrier = message.barrier_request()
+        barrier = ofp.message.barrier_request()
         (resp, pkt) = self.controller.transact(barrier, 30)
         return (resp is not None)
 
@@ -1419,7 +1413,7 @@
                             )
             f = False
             for e in self.error_msgs:
-                if e.type == type and e.code == code:
+                if e.err_type == type and e.code == code:
                     logging.info("Got it")
                     f = True
             if not f:
@@ -1454,7 +1448,7 @@
             logging.error("Get table stats failed")
             return False
         n = 0
-        for ts in self.tbl_stats.stats:
+        for ts in self.tbl_stats.entries:
             n = n + ts.active_count
         logging.info("Table stats reported %d active flows" \
                           % (n) \
@@ -1469,18 +1463,18 @@
         if not self.flow_stats_get():
             logging.error("Get flow stats failed")
             return False
-        logging.info("Retrieved %d flows" % (len(self.flow_stats.stats)))
+        logging.info("Retrieved %d flows" % (len(self.flow_stats.entries)))
     
         # Verify flows returned by switch
     
-        if len(self.flow_stats.stats) != self.flow_tbl.count():
+        if len(self.flow_stats.entries) != self.flow_tbl.count():
             logging.error("Switch reported incorrect number of flows")
             result = False
     
         logging.info("Verifying received flows")
         for fc in self.flow_tbl.values():
             fc.matched = False
-        for fs in self.flow_stats.stats:
+        for fs in self.flow_stats.entries:
             flow_in = Flow_Cfg()
             flow_in.from_flow_stat(fs)
             logging.info("Received flow:")
@@ -1596,7 +1590,7 @@
             # Number of flows requested was 0
             # => Generate max number of flows
 
-            for ts in sw.tbl_stats.stats:
+            for ts in sw.tbl_stats.entries:
                 num_flows = num_flows + ts.max_entries
 
         logging.info("Generating %d flows" % (num_flows))        
@@ -1705,7 +1699,7 @@
             fc = Flow_Cfg()
             fc.rand(fi, \
                     required_wildcards(self), \
-                    sw.tbl_stats.stats[0].wildcards, \
+                    sw.tbl_stats.entries[0].wildcards, \
                     sw.sw_features.actions, \
                     sw.valid_ports, \
                     sw.valid_queues \
@@ -1808,7 +1802,7 @@
                         )
 
         num_flows = 0
-        for ts in sw.tbl_stats.stats:
+        for ts in sw.tbl_stats.entries:
             num_flows = num_flows + ts.max_entries
 
         logging.info("Switch capacity is %d flows" % (num_flows))        
@@ -1853,7 +1847,7 @@
             fc = Flow_Cfg()
             fc.rand(fi, \
                     required_wildcards(self), \
-                    sw.tbl_stats.stats[0].wildcards, \
+                    sw.tbl_stats.entries[0].wildcards, \
                     sw.sw_features.actions, \
                     sw.valid_ports, \
                     sw.valid_queues \
@@ -1949,7 +1943,7 @@
         fc = Flow_Cfg()
         fc.rand(fi, \
                 required_wildcards(self), \
-                sw.tbl_stats.stats[0].wildcards, \
+                sw.tbl_stats.entries[0].wildcards, \
                 sw.sw_features.actions, \
                 sw.valid_ports, \
                 sw.valid_queues \
@@ -2071,7 +2065,7 @@
         while True:
             fc.rand(fi, \
                     required_wildcards(self), \
-                    sw.tbl_stats.stats[0].wildcards, \
+                    sw.tbl_stats.entries[0].wildcards, \
                     sw.sw_features.actions, \
                     sw.valid_ports, \
                     sw.valid_queues \
@@ -2196,7 +2190,7 @@
         fc = Flow_Cfg()
         fc.rand(fi, \
                 required_wildcards(self), \
-                sw.tbl_stats.stats[0].wildcards, \
+                sw.tbl_stats.entries[0].wildcards, \
                 sw.sw_features.actions, \
                 sw.valid_ports, \
                 sw.valid_queues \
@@ -2472,7 +2466,7 @@
         fc = Flow_Cfg()
         fc.rand(fi, \
                 required_wildcards(self), \
-                sw.tbl_stats.stats[0].wildcards, \
+                sw.tbl_stats.entries[0].wildcards, \
                 sw.sw_features.actions, \
                 sw.valid_ports, \
                 sw.valid_queues \
@@ -2564,7 +2558,7 @@
         fc = Flow_Cfg()
         fc.rand(fi, \
                 required_wildcards(self), \
-                sw.tbl_stats.stats[0].wildcards, \
+                sw.tbl_stats.entries[0].wildcards, \
                 sw.sw_features.actions, \
                 sw.valid_ports, \
                 sw.valid_queues \
@@ -2679,7 +2673,7 @@
         fc = Flow_Cfg()
         fc.rand(fi, \
                 required_wildcards(self), \
-                sw.tbl_stats.stats[0].wildcards, \
+                sw.tbl_stats.entries[0].wildcards, \
                 sw.sw_features.actions, \
                 sw.valid_ports, \
                 sw.valid_queues \
@@ -2958,7 +2952,7 @@
         fc = Flow_Cfg()
         fc.rand(fi, \
                 required_wildcards(self), \
-                sw.tbl_stats.stats[0].wildcards, \
+                sw.tbl_stats.entries[0].wildcards, \
                 sw.sw_features.actions, \
                 sw.valid_ports, \
                 sw.valid_queues \
diff --git a/tests/flow_stats.py b/tests/flow_stats.py
index 2f14156..ff33948 100644
--- a/tests/flow_stats.py
+++ b/tests/flow_stats.py
@@ -12,10 +12,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 
@@ -74,7 +72,7 @@
     """
 
     def verifyStats(self, flow_mod_msg, match, out_port, test_timeout, packet_count):
-        stat_req = message.flow_stats_request()
+        stat_req = ofp.message.flow_stats_request()
         stat_req.match = match
         stat_req.table_id = 0xff
         stat_req.out_port = out_port
@@ -86,9 +84,9 @@
                                                      timeout=test_timeout)
             self.assertTrue(response is not None, 
                             "No response to stats request")
-            self.assertTrue(len(response.stats) == 1,
+            self.assertTrue(len(response.entries) == 1,
                             "Did not receive flow stats reply")
-            for obj in response.stats:
+            for obj in response.entries:
                 # TODO: pad1 and pad2 fields may be nonzero, is this a bug?
                 # for now, just clear them so the assert is simpler
                 obj.match.pad1 = 0
@@ -127,7 +125,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         # build flow
         ingress_port = of_ports[0];
@@ -135,7 +133,7 @@
         logging.info("Ingress " + str(ingress_port) + 
                        " to egress " + str(egress_port))
         match.in_port = ingress_port
-        flow_mod_msg = message.flow_mod()
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.match = copy.deepcopy(match)
         flow_mod_msg.cookie = random.randint(0,9007199254740992)
         flow_mod_msg.buffer_id = 0xffffffff
@@ -143,7 +141,7 @@
         flow_mod_msg.hard_timeout = 65000
         flow_mod_msg.priority = 100
         act.port = egress_port
-        flow_mod_msg.actions.add(act)
+        flow_mod_msg.actions.append(act)
        
         # send flow
         logging.info("Inserting flow")
@@ -187,15 +185,15 @@
                         "Could not generate flow match from pkt")
         match.in_port = ingress_port
         
-        flow_mod_msg = message.flow_mod()
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.match = match
         flow_mod_msg.cookie = random.randint(0,9007199254740992)
         flow_mod_msg.buffer_id = 0xffffffff
         flow_mod_msg.idle_timeout = 0
         flow_mod_msg.hard_timeout = 0
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = egress_port
-        flow_mod_msg.actions.add(act)
+        flow_mod_msg.actions.append(act)
 
         logging.info("Ingress " + str(ingress_port) + 
                        " to egress " + str(egress_port))
@@ -204,7 +202,7 @@
 
     def sumStatsReplyCounts(self, response):
         total_packets = 0
-        for obj in response.stats:
+        for obj in response.entries:
             # TODO: pad1 and pad2 fields may be nonzero, is this a bug?
             # for now, just clear them so the assert is simpler
             #obj.match.pad1 = 0
@@ -217,7 +215,7 @@
         return total_packets
 
     def verifyStats(self, match, out_port, test_timeout, packet_count):
-        stat_req = message.flow_stats_request()
+        stat_req = ofp.message.flow_stats_request()
         stat_req.match = match
         stat_req.table_id = 0xff
         stat_req.out_port = out_port
@@ -263,7 +261,7 @@
         pkt1 = simple_tcp_packet()
         flow_mod_msg1 = self.buildFlowModMsg(pkt1, ingress_port, egress_port1)
        
-        pkt2 = simple_tcp_packet(dl_src='0:7:7:7:7:7')
+        pkt2 = simple_tcp_packet(eth_src='0:7:7:7:7:7')
         flow_mod_msg2 = self.buildFlowModMsg(pkt2, ingress_port, egress_port2)
        
         logging.info("Inserting flow1")
@@ -312,15 +310,15 @@
                         "Could not generate flow match from pkt")
         match.in_port = ingress_port
         
-        flow_mod_msg = message.flow_mod()
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.match = match
         flow_mod_msg.cookie = random.randint(0,9007199254740992)
         flow_mod_msg.buffer_id = 0xffffffff
         flow_mod_msg.idle_timeout = 0
         flow_mod_msg.hard_timeout = 0
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = egress_port
-        flow_mod_msg.actions.add(act)
+        flow_mod_msg.actions.append(act)
 
         logging.info("Ingress " + str(ingress_port) + 
                        " to egress " + str(egress_port))
@@ -329,7 +327,7 @@
 
     def verifyAggFlowStats(self, match, out_port, test_timeout, 
                            flow_count, packet_count):
-        stat_req = message.aggregate_stats_request()
+        stat_req = ofp.message.aggregate_stats_request()
         stat_req.match = match
         stat_req.table_id = 0xff
         stat_req.out_port = out_port
@@ -341,15 +339,12 @@
                                                      timeout=test_timeout)
             self.assertTrue(response is not None, 
                             "No response to stats request")
-            self.assertTrue(len(response.stats) == 1, 
-                            "Did not receive flow stats reply")
-            for obj in response.stats:
-                self.assertTrue(obj.flow_count == flow_count,
-                                "Flow count " + str(obj.flow_count) +
-                                " does not match expected " + str(flow_count))
-                logging.info("Received " + str(obj.packet_count) + " packets")
-                if obj.packet_count == packet_count:
-                    all_packets_received = 1
+            self.assertTrue(response.flow_count == flow_count,
+                            "Flow count " + str(response.flow_count) +
+                            " does not match expected " + str(flow_count))
+            logging.info("Received " + str(response.packet_count) + " packets")
+            if response.packet_count == packet_count:
+                all_packets_received = 1
 
             if all_packets_received:
                 break
@@ -374,7 +369,7 @@
         pkt1 = simple_tcp_packet()
         flow_mod_msg1 = self.buildFlowModMsg(pkt1, ingress_port, egress_port1)
        
-        pkt2 = simple_tcp_packet(dl_src='0:7:7:7:7:7')
+        pkt2 = simple_tcp_packet(eth_src='0:7:7:7:7:7')
         flow_mod_msg2 = self.buildFlowModMsg(pkt2, ingress_port, egress_port2)
        
         logging.info("Inserting flow1")
@@ -413,9 +408,9 @@
     """
     def runTest(self):
         delete_all_flows(self.controller)
-        match = ofp.ofp_match()
+        match = ofp.match()
         match.wildcards = 0
-        stat_req = message.flow_stats_request()
+        stat_req = ofp.message.flow_stats_request()
         stat_req.match = match
         stat_req.table_id = 0xff
         stat_req.out_port = ofp.OFPP_NONE
@@ -423,7 +418,7 @@
         response, pkt = self.controller.transact(stat_req)
         self.assertTrue(response is not None,
                         "No response to stats request")
-        self.assertEquals(len(response.stats), 0)
+        self.assertEquals(len(response.entries), 0)
         self.assertEquals(response.flags, 0)
 
 class EmptyAggregateStats(base_tests.SimpleDataPlane):
@@ -433,9 +428,9 @@
     """
     def runTest(self):
         delete_all_flows(self.controller)
-        match = ofp.ofp_match()
+        match = ofp.match()
         match.wildcards = 0
-        stat_req = message.aggregate_stats_request()
+        stat_req = ofp.message.aggregate_stats_request()
         stat_req.match = match
         stat_req.table_id = 0xff
         stat_req.out_port = ofp.OFPP_NONE
@@ -443,11 +438,9 @@
         response, pkt = self.controller.transact(stat_req)
         self.assertTrue(response is not None,
                         "No response to stats request")
-        self.assertTrue(len(response.stats) == 1,
-                        "Did not receive flow stats reply")
-        self.assertEquals(response.stats[0].flow_count, 0)
-        self.assertEquals(response.stats[0].packet_count, 0)
-        self.assertEquals(response.stats[0].byte_count, 0)
+        self.assertEquals(response.flow_count, 0)
+        self.assertEquals(response.packet_count, 0)
+        self.assertEquals(response.byte_count, 0)
 
 class DeletedFlowStats(base_tests.SimpleDataPlane):
     """
@@ -476,7 +469,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None,
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         # build flow
         ingress_port = of_ports[0];
@@ -484,7 +477,7 @@
         logging.info("Ingress " + str(ingress_port) +
                        " to egress " + str(egress_port))
         match.in_port = ingress_port
-        flow_mod_msg = message.flow_mod()
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.match = copy.deepcopy(match)
         flow_mod_msg.cookie = random.randint(0,9007199254740992)
         flow_mod_msg.buffer_id = 0xffffffff
@@ -493,7 +486,7 @@
         flow_mod_msg.priority = 100
         flow_mod_msg.flags = ofp.OFPFF_SEND_FLOW_REM
         act.port = egress_port
-        flow_mod_msg.actions.add(act)
+        flow_mod_msg.actions.append(act)
 
         # send flow
         logging.info("Inserting flow")
diff --git a/tests/load.py b/tests/load.py
index 830aeed..4680edb 100644
--- a/tests/load.py
+++ b/tests/load.py
@@ -20,10 +20,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 import time
@@ -60,30 +58,30 @@
         match = packet_to_flow_match(self, pkt)
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         match.in_port = lb_port
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = lb_port + 1
 
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
         request.hard_timeout = 2 * barrier_count
 
         request.buffer_id = 0xffffffff
-        request.actions.add(act)
+        request.actions.append(act)
 
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = ofp.OFPP_CONTROLLER
-        request.actions.add(act)
+        request.actions.append(act)
 
         self.controller.message_send(request)
         do_barrier(self.controller)
 
         # Create packet out and send to port lb_port + 1
-        msg = message.packet_out()
+        msg = ofp.message.packet_out()
         msg.in_port = lb_port
         msg.data = str(pkt)
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = lb_port + 1
-        msg.actions.add(act)
+        msg.actions.append(act)
         logging.info("Sleeping before starting storm")
         time.sleep(1) # Root causing issue with fast disconnects
         logging.info("Sending packet out to %d" % (lb_port + 1))
@@ -167,12 +165,12 @@
                (simple_eth_packet(pktlen=40), "tiny Ethernet packet")]:
 
                logging.info("PKT OUT test with %s, port %s" % (opt, dp_port))
-               msg = message.packet_out()
+               msg = ofp.message.packet_out()
                msg.in_port = ofp.OFPP_NONE
                msg.data = str(outpkt)
-               act = action.action_output()
+               act = ofp.action.output()
                act.port = dp_port
-               msg.actions.add(act)
+               msg.actions.append(act)
 
                logging.info("PacketOutLoad to: " + str(dp_port))
                for count in range(100):
@@ -193,37 +191,35 @@
 class FlowModLoad(base_tests.SimpleProtocol):
 
     def checkBarrier(self):
-        msg, pkt = self.controller.transact(message.barrier_request(), timeout=60)
+        msg, pkt = self.controller.transact(ofp.message.barrier_request(), timeout=60)
         self.assertNotEqual(msg, None, "Barrier failed")
         while self.controller.packets:
            msg = self.controller.packets.pop(0)[0]
-           self.assertNotEqual(msg.header.type, message.OFPT_ERROR,
-                               "Error received")
+           self.assertNotEqual(msg.type, ofp.OFPT_ERROR, "Error received")
 
     def runTest(self):
-        msg, pkt = self.controller.transact(message.table_stats_request())
+        msg, pkt = self.controller.transact(ofp.message.table_stats_request())
 
         # Some switches report an extremely high max_entries that would cause
         # us to run out of memory attempting to create all the flow-mods.
-        num_flows = min(msg.stats[0].max_entries, 32678)
+        num_flows = min(msg.entries[0].max_entries, 32678)
 
         logging.info("Creating %d flow-mods messages", num_flows)
 
         requests = []
         for i in range(num_flows):
-            match = ofp.ofp_match()
+            match = ofp.match()
             match.wildcards = ofp.OFPFW_ALL & ~ofp.OFPFW_DL_VLAN & ~ofp.OFPFW_DL_DST
-            match.dl_vlan = ofp.OFP_VLAN_NONE
-            match.dl_dst = [0, 1, 2, 3, i / 256, i % 256]
-            act = action.action_output()
+            match.vlan_vid = ofp.OFP_VLAN_NONE
+            match.eth_dst = [0, 1, 2, 3, i / 256, i % 256]
+            act = ofp.action.output()
             act.port = ofp.OFPP_CONTROLLER
-            request = message.flow_mod()
-            request.command = ofp.OFPFC_ADD
+            request = ofp.message.flow_add()
             request.buffer_id = 0xffffffff
             request.priority = num_flows - i
             request.out_port = ofp.OFPP_NONE
             request.match = match
-            request.actions.add(act)
+            request.actions.append(act)
             requests.append(request)
 
         for i in range(3):
diff --git a/tests/message_types.py b/tests/message_types.py
index fe19f61..599764a 100644
--- a/tests/message_types.py
+++ b/tests/message_types.py
@@ -11,10 +11,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 import time
@@ -24,7 +22,7 @@
 from FuncUtils import*
 
 
-
+@disabled
 class HelloWithBody(base_tests.SimpleDataPlane):
 
     """Verify switch should be able to receive OFPT_HELLO messages with body , 
@@ -36,7 +34,7 @@
 
         #Send Hello message
         logging.info("Sending Hello...")
-        request = message.hello()
+        request = ofp.message.hello()
         request.data = 'OpenFlow Will Rule The World'
         self.controller.message_send(request)
 
@@ -47,7 +45,7 @@
         self.assertTrue(response is not None, 
                                'Switch did not exchange hello message in return') 
         self.assertEqual(len(response.data), 0, 'Response data field non-empty')
-        self.assertTrue(response.header.version == 0x01, 'Openflow-version field is not 1.0.0')
+        self.assertTrue(response.version == 0x01, 'Openflow-version field is not 1.0.0')
 
 
 class EchoWithData(base_tests.SimpleProtocol):
@@ -61,7 +59,7 @@
         
         #Send Echo Request 
         logging.info("Sending Echo With Data ...")
-        request = message.echo_request()
+        request = ofp.message.echo_request()
         request.data = 'OpenFlow Will Rule The World'
         self.controller.message_send(request)
 
@@ -71,9 +69,9 @@
                                                timeout=1)
         self.assertTrue(response is not None,
                         "Did not get echo reply (with data)")
-        self.assertEqual(response.header.type, ofp.OFPT_ECHO_REPLY,
+        self.assertEqual(response.type, ofp.OFPT_ECHO_REPLY,
                          'Response is not echo_reply')
-        self.assertEqual(request.header.xid, response.header.xid,
+        self.assertEqual(request.xid, response.xid,
                          'Response xid does not match the request Xid')
         self.assertEqual(request.data, response.data,
                          'Response data does not match request data')
@@ -96,8 +94,8 @@
 
         #Send Echo Request
         logging.info("Sending a Echo request with a version which is not supported by the switch")
-        request=message.echo_request()
-        request.header.version=0  
+        request=ofp.message.echo_request()
+        request.version=0  
         self.controller.message_send(request)
 
         logging.info("Waiting for a OFPT_ERROR msg on the control plane...") 
@@ -105,7 +103,7 @@
                                                timeout=5)
         self.assertTrue(response is not None, 
                                'Switch did not reply with error message')
-        self.assertTrue(response.type==ofp.OFPET_BAD_REQUEST, 
+        self.assertTrue(response.err_type==ofp.OFPET_BAD_REQUEST, 
                                'Message field type is not OFPET_BAD_REQUEST') 
         self.assertTrue(response.code==ofp.OFPBRC_BAD_VERSION,
                         'Message field code is not OFPBRC_BAD_VERSION')
@@ -125,11 +123,11 @@
 
         # Sending Features_Request
         logging.info("Sending Features_Request...")
-        request = message.features_request()
+        request = ofp.message.features_request()
         (reply, pkt) = self.controller.transact(request)
         self.assertTrue(reply is not None, "Failed to get any reply")
-        self.assertEqual(reply.header.type, ofp.OFPT_FEATURES_REPLY,'Response is not Features_reply')
-        self.assertEqual(reply.header.xid,request.header.xid,'Transaction id does not match')
+        self.assertEqual(reply.type, ofp.OFPT_FEATURES_REPLY,'Response is not Features_reply')
+        self.assertEqual(reply.xid,request.xid,'Transaction id does not match')
         
         supported_actions =[]
         if(reply.actions &1<<ofp.OFPAT_OUTPUT):
@@ -207,14 +205,14 @@
        
         #Send get_config_request
         logging.info("Sending Get Config Request...")
-        request = message.get_config_request()
+        request = ofp.message.get_config_request()
         (reply, pkt) = self.controller.transact(request)
 
         #Verify get_config_reply is recieved
         logging.info("Expecting GetConfigReply ")
         self.assertTrue(reply is not None, "Failed to get any reply")
-        self.assertEqual(reply.header.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
-        self.assertEqual(reply.header.xid,request.header.xid,'Transaction id does not match')
+        self.assertEqual(reply.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
+        self.assertEqual(reply.xid,request.xid,'Transaction id does not match')
 
         if reply.miss_send_len == 0 :
            logging.info ("the switch must send zero-size packet_in message")
@@ -243,10 +241,10 @@
 
         #Send get_config_request -- retrive miss_send_len field
         logging.info("Sending Get Config Request ")
-        request = message.get_config_request()
+        request = ofp.message.get_config_request()
         (reply, pkt) = self.controller.transact(request)
         self.assertTrue(reply is not None, "Failed to get any reply")
-        self.assertEqual(reply.header.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
+        self.assertEqual(reply.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
 
         miss_send_len = 0
         miss_send_len = reply.miss_send_len
@@ -255,7 +253,7 @@
 
         #Send set_config_request --- set a different miss_sen_len field and flag
         logging.info("Sending Set Config Request...")
-        req = message.set_config()
+        req = ofp.message.set_config()
         
         if miss_send_len < 65400 :# Max miss_send len is 65535
             req.miss_send_len = miss_send_len + 100
@@ -275,11 +273,11 @@
 
         #Send get_config_request -- verify change came into effect
         logging.info("Sending Get Config Request...")
-        request = message.get_config_request()
+        request = ofp.message.get_config_request()
 
         (rep, pkt) = self.controller.transact(request)
         self.assertTrue(rep is not None, "Failed to get any reply")
-        self.assertEqual(rep.header.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
+        self.assertEqual(rep.type, ofp.OFPT_GET_CONFIG_REPLY,'Response is not Config Reply')
         self.assertEqual(rep.miss_send_len,new_miss_send_len, "miss_send_len configuration parameter could not be set")
         self.assertEqual(rep.flags,new_flags, "frag flags could not be set")
       
@@ -304,7 +302,7 @@
         miss_send_len = [0 ,32 ,64,100]
         
         for bytes in miss_send_len :
-            req = message.set_config()
+            req = ofp.message.set_config()
             req.miss_send_len = bytes
             self.controller.message_send(req)
             sleep(1)
@@ -360,13 +358,13 @@
         for bytes in max_len :
 
             #Insert a flow entry with action --output to controller
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
-            act = action.action_output()
+            act = ofp.action.output()
             act.port = ofp.OFPP_CONTROLLER
             act.max_len = bytes 
-            request.actions.add(act)
+            request.actions.append(act)
             
             logging.info("Inserting flow....")
             self.controller.message_send(request)
@@ -407,7 +405,7 @@
 
         #Set miss_send_len field 
         logging.info("Sending  set_config_request to set miss_send_len... ")
-        req = message.set_config()
+        req = ofp.message.set_config()
         req.miss_send_len = 65535
         self.controller.message_send(req)
         sleep(1)
@@ -459,12 +457,12 @@
         match.in_port = of_ports[0]
 
         #Insert a flow entry with action output to controller 
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = ofp.OFPP_CONTROLLER
         act.max_len = 65535 # Send the complete packet and do not buffer
-        request.actions.add(act)
+        request.actions.append(act)
 
         logging.info("Inserting flow....")
         self.controller.message_send(request)
@@ -674,30 +672,16 @@
         logging.info("Running DescStatsGet test")
         
         logging.info("Sending stats request")
-        request = message.desc_stats_request()
+        request = ofp.message.desc_stats_request()
         response, pkt = self.controller.transact(request)
         self.assertTrue(response is not None,
                         "Did not get reply for desc stats")
-        
-        mfr_desc = ""
-        hw_desc = ""
-        sw_dec = ""
-        serial_num = ""
-        dp_decription = ""
 
-        for stats in response.stats:
-
-            mfr_desc += stats.mfr_desc
-            hw_desc += stats.hw_desc
-            sw_dec += stats.sw_desc
-            serial_num += stats.serial_num
-            dp_decription += stats.dp_desc
-
-        logging.info("Manufacture Description :" + mfr_desc)
-        logging.info("Hardware description : " + hw_desc)
-        logging.info("Software Description :" + sw_dec)
-        logging.info("Serial number :" + serial_num)
-        logging.info("Human readable description of datapath :" + dp_decription)
+        logging.info("Manufacture Description :" + response.mfr_desc)
+        logging.info("Hardware description : " + response.hw_desc)
+        logging.info("Software Description :" + response.sw_desc)
+        logging.info("Serial number :" + response.serial_num)
+        logging.info("Human readable description of datapath :" + response.dp_desc)
 
 
 
@@ -714,15 +698,15 @@
         of_ports.sort()
         
         logging.info("Sending Queue Config Request ...")
-        request = message.queue_get_config_request()
+        request = ofp.message.queue_get_config_request()
         request.port = of_ports[0]
         response, pkt = self.controller.transact(request)
         self.assertTrue(response is not None,
                         "Did not get reply ")
-        self.assertTrue(response.header.type == ofp.OFPT_QUEUE_GET_CONFIG_REPLY, "Reply is not Queue Config Reply")
+        self.assertTrue(response.type == ofp.OFPT_QUEUE_GET_CONFIG_REPLY, "Reply is not Queue Config Reply")
 
         #Verify Reply Body
-        self.assertEqual(response.header.xid, request.header.xid , "Transaction Id in reply is not same as request")
+        self.assertEqual(response.xid, request.xid , "Transaction Id in reply is not same as request")
         self.assertEqual(response.port,request.port , "Port queried does not match ")
         queues = []
         queues = response.queues
diff --git a/tests/nicira_dec_ttl.py b/tests/nicira_dec_ttl.py
index 013eae7..f5e8214 100644
--- a/tests/nicira_dec_ttl.py
+++ b/tests/nicira_dec_ttl.py
@@ -2,25 +2,11 @@
 import struct
 
 from oftest import config
-import of10 as ofp
+import ofp
 import oftest.base_tests as base_tests
 
 from oftest.testutils import *
 
-class action_nx_dec_ttl(ofp.action.action_vendor):
-    def __init__(self):
-        ofp.action.action_vendor.__init__(self)
-        self.vendor = 0x00002320
-
-    def pack(self):
-        return ofp.action.action_vendor.pack(self) + struct.pack("!HHL", 18, 0x0, 0x0)
-
-    def __len__(self):
-        return 16
-
-    def show(self, prefix=''):
-        return prefix + 'dec_ttl: ' + '\n' + ofp.action.action_vendor.show(self)
-
 @nonstandard
 class TtlDecrement(base_tests.SimpleDataPlane):
     def runTest(self):
@@ -35,17 +21,17 @@
         flow_match_test(self, config["port_map"],
                         pkt=simple_tcp_packet(pktlen=100, ip_ttl=2),
                         exp_pkt=simple_tcp_packet(pktlen=100, ip_ttl=1),
-                        action_list=[action_nx_dec_ttl()])
+                        action_list=[ofp.action.nicira_dec_ttl()])
 
         outpkt = simple_tcp_packet(pktlen=100, ip_ttl=3)
         msg = ofp.message.packet_out(in_port=ofp.OFPP_NONE,
                                      data=str(outpkt),
                                      actions=[
-                                         action_nx_dec_ttl(),
+                                         ofp.action.nicira_dec_ttl(),
                                          ofp.action.output(port=portA),
-                                         action_nx_dec_ttl(),
+                                         ofp.action.nicira_dec_ttl(),
                                          ofp.action.output(port=portB),
-                                         action_nx_dec_ttl(),
+                                         ofp.action.nicira_dec_ttl(),
                                          ofp.action.output(port=portC)])
         self.controller.message_send(msg)
 
diff --git a/tests/nicira_role.py b/tests/nicira_role.py
index fa4cc97..1122a7b 100644
--- a/tests/nicira_role.py
+++ b/tests/nicira_role.py
@@ -6,18 +6,12 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.base_tests as base_tests
 
 from oftest.testutils import *
 
-# Nicira vendor extension constants
-NXT_VENDOR = 0x00002320
-
-NXT_ROLE_REQUEST = 10
-
-NXT_ROLE_VALUE = dict( other=0, slave=1, master=2 )
+NX_ROLE_MASTER = 2
 
 @nonstandard
 class NiciraRoleRequest(base_tests.SimpleDataPlane):
@@ -25,21 +19,10 @@
     Exercise Nicira vendor extension for requesting HA roles
     """
 
-    def nicira_role_request(self, role):
-        """
-        Use the BSN_SET_IP_MASK vendor command to change the IP mask for the
-        given wildcard index
-        """
-        logging.info("Sending role request %s" % role)
-        m = message.vendor()
-        m.vendor = NXT_VENDOR
-        m.data = struct.pack("!LL", NXT_ROLE_REQUEST, NXT_ROLE_VALUE[role])
-        return m
-
     def runTest(self):
         '''
         For now, we only verify that a response is received.
         '''
-        request = self.nicira_role_request("master")
+        request = ofp.message.nicira_controller_role_request(role=NX_ROLE_MASTER)
         response, pkt = self.controller.transact(request)
         self.assertTrue(response is not None, "No reply to Nicira role request")
diff --git a/tests/openflow_protocol_messages.py b/tests/openflow_protocol_messages.py
index b182015..c961f2e 100644
--- a/tests/openflow_protocol_messages.py
+++ b/tests/openflow_protocol_messages.py
@@ -12,10 +12,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 
@@ -41,7 +39,7 @@
         logging.info("Sending Features_Request")
         logging.info("Expecting Features_Reply")
 
-        request = message.features_request()
+        request = ofp.message.features_request()
         self.controller.message_send(request)
         
         (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_FEATURES_REPLY,
@@ -69,7 +67,7 @@
         logging.info("Sending OFPT_GET_CONFIG_REQUEST ")
         logging.info("Expecting OFPT_GET_CONFIG_REPLY ")
 
-        request = message.get_config_request()
+        request = ofp.message.get_config_request()
         self.controller.message_send(request)
         
         (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_GET_CONFIG_REPLY,
@@ -219,11 +217,11 @@
                 (simple_eth_packet(), "simple Ethernet packet"),
                 (simple_eth_packet(pktlen=40), "tiny Ethernet packet")]:
             
-                msg = message.packet_out()
+                msg = ofp.message.packet_out()
                 msg.data = str(outpkt)
-                act = action.action_output()
+                act = ofp.action.output()
                 act.port = dp_port
-                msg.actions.add(act)
+                msg.actions.append(act)
 
                 logging.info("PacketOut to: " + str(dp_port))
                 self.controller.message_send(msg)
@@ -297,12 +295,12 @@
         logging.info("Expecting a Hello on the control plane with version--1.0.0")
         
         #Send Hello message
-        request = message.hello()
+        request = ofp.message.hello()
         (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_HELLO,
                                                timeout=1)
         self.assertTrue(response is not None, 
                                'Switch did not exchange hello message in return') 
-        self.assertTrue(response.header.version == 0x01, 'switch openflow-version field is not 1.0.0')
+        self.assertTrue(response.version == 0x01, 'switch openflow-version field is not 1.0.0')
 
 
 
@@ -320,12 +318,12 @@
         logging.info("Expecting a Echo Reply with version--1.0.0 and same xid")
 
         # Send echo_request
-        request = message.echo_request()
+        request = ofp.message.echo_request()
         (response, pkt) = self.controller.transact(request)
-        self.assertEqual(response.header.type, ofp.OFPT_ECHO_REPLY,'response is not echo_reply')
-        self.assertEqual(request.header.xid, response.header.xid,
+        self.assertEqual(response.type, ofp.OFPT_ECHO_REPLY,'response is not echo_reply')
+        self.assertEqual(request.xid, response.xid,
                          'response xid != request xid')
-        self.assertTrue(response.header.version == 0x01, 'switch openflow-version field is not 1.0.1')
+        self.assertTrue(response.version == 0x01, 'switch openflow-version field is not 1.0.1')
         self.assertEqual(len(response.data), 0, 'response data non-empty')
 
 
@@ -343,10 +341,10 @@
         logging.info("Expecting a Barrier Reply with same xid")
 
         #Send Barrier Request
-        request = message.barrier_request()
+        request = ofp.message.barrier_request()
         (response,pkt) = self.controller.transact(request)
-        self.assertEqual(response.header.type, ofp.OFPT_BARRIER_REPLY,'response is not barrier_reply')
-        self.assertEqual(request.header.xid, response.header.xid,
+        self.assertEqual(response.type, ofp.OFPT_BARRIER_REPLY,'response is not barrier_reply')
+        self.assertEqual(request.xid, response.xid,
                          'response xid != request xid')
 
 
diff --git a/tests/pktact.py b/tests/pktact.py
index fe92aa0..829a90e 100644
--- a/tests/pktact.py
+++ b/tests/pktact.py
@@ -21,10 +21,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 import basic # for IterCases
@@ -106,7 +104,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         for idx in range(len(of_ports)):
             delete_all_flows(self.controller)
@@ -118,12 +116,12 @@
 
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
 
             request.buffer_id = 0xffffffff
             act.port = egress_port
-            request.actions.add(act)
+            request.actions.append(act)
 
             logging.info("Inserting flow")
             self.controller.message_send(request)
@@ -175,20 +173,20 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None,
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         delete_all_flows(self.controller)
 
         ingress_port = of_ports[0]
         match.in_port = ingress_port
 
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
 
         request.buffer_id = 0xffffffff
         act.port = ofp.OFPP_CONTROLLER
         act.max_len = 65535
-        request.actions.add(act)
+        request.actions.append(act)
 
         logging.info("Inserting flow")
         self.controller.message_send(request)
@@ -225,7 +223,7 @@
 
     def portQueuesGet(self, queue_stats, port_num):
         result = []
-        for qs in queue_stats.stats:
+        for qs in queue_stats.entries:
             if qs.port_no != port_num:
                 continue
             result.append(qs.queue_id)
@@ -247,13 +245,13 @@
 
         # Get queue stats from switch
         
-        request = message.queue_stats_request()
+        request = ofp.message.queue_stats_request()
         request.port_no  = ofp.OFPP_ALL
         request.queue_id = ofp.OFPQ_ALL
         (queue_stats, p) = self.controller.transact(request)
         self.assertNotEqual(queue_stats, None, "Queue stats request failed")
 
-        act = action.action_enqueue()
+        act = ofp.action.enqueue()
 
         for idx in range(len(of_ports)):
             ingress_port = of_ports[idx]
@@ -269,13 +267,13 @@
 
                 match.in_port = ingress_port
                 
-                request = message.flow_mod()
+                request = ofp.message.flow_add()
                 request.match = match
 
                 request.buffer_id = 0xffffffff
                 act.port     = egress_port
                 act.queue_id = egress_queue_id
-                request.actions.add(act)
+                request.actions.append(act)
 
                 logging.info("Inserting flow")
                 self.controller.message_send(request)
@@ -283,7 +281,7 @@
 
                 # Get current stats for selected egress queue
 
-                request = message.queue_stats_request()
+                request = ofp.message.queue_stats_request()
                 request.port_no  = egress_port
                 request.queue_id = egress_queue_id
                 (qs_before, p) = self.controller.transact(request)
@@ -315,7 +313,7 @@
 
                 # Get current stats for selected egress queue again
 
-                request = message.queue_stats_request()
+                request = ofp.message.queue_stats_request()
                 request.port_no  = egress_port
                 request.queue_id = egress_queue_id
                 (qs_after, p) = self.controller.transact(request)
@@ -324,8 +322,8 @@
                 # Make sure that tx packet counter for selected egress queue was
                 # incremented
 
-                self.assertEqual(qs_after.stats[0].tx_packets, \
-                                 qs_before.stats[0].tx_packets + 1, \
+                self.assertEqual(qs_after.entries[0].tx_packets, \
+                                 qs_before.entries[0].tx_packets + 1, \
                                  "Verification of egress queue tx packet count failed"
                                  )
                     
@@ -347,7 +345,7 @@
 
     def portQueuesGet(self, queue_stats, port_num):
         result = []
-        for qs in queue_stats.stats:
+        for qs in queue_stats.entries:
             if qs.port_no != port_num:
                 continue
             result.append(qs.queue_id)
@@ -369,16 +367,16 @@
 
         # Get queue stats from switch
         
-        request = message.queue_stats_request()
+        request = ofp.message.queue_stats_request()
         request.port_no  = ofp.OFPP_CONTROLLER
         request.queue_id = ofp.OFPQ_ALL
         (queue_stats, p) = self.controller.transact(request)
         self.assertNotEqual(queue_stats, None, "Queue stats request failed")
-        if queue_stats.header.type == ofp.OFPT_ERROR:
+        if queue_stats.type == ofp.OFPT_ERROR:
             skip_message_emit(self, "Enqueue packet to controller")
             return
 
-        act = action.action_enqueue()
+        act = ofp.action.enqueue()
 
         for idx in range(len(of_ports)):
             ingress_port = of_ports[idx]
@@ -398,13 +396,13 @@
 
                 match.in_port = ingress_port
                 
-                request = message.flow_mod()
+                request = ofp.message.flow_add()
                 request.match = match
 
                 request.buffer_id = 0xffffffff
                 act.port     = egress_port
                 act.queue_id = egress_queue_id
-                request.actions.add(act)
+                request.actions.append(act)
 
                 logging.info("Inserting flow")
                 self.controller.message_send(request)
@@ -412,7 +410,7 @@
 
                 # Get current stats for selected egress queue
 
-                request = message.queue_stats_request()
+                request = ofp.message.queue_stats_request()
                 request.port_no  = egress_port
                 request.queue_id = egress_queue_id
                 (qs_before, p) = self.controller.transact(request)
@@ -454,7 +452,7 @@
 
                 # Get current stats for selected egress queue again
 
-                request = message.queue_stats_request()
+                request = ofp.message.queue_stats_request()
                 request.port_no  = egress_port
                 request.queue_id = egress_queue_id
                 (qs_after, p) = self.controller.transact(request)
@@ -463,8 +461,8 @@
                 # Make sure that tx packet counter for selected egress queue was
                 # incremented
 
-                self.assertEqual(qs_after.stats[0].tx_packets, \
-                                 qs_before.stats[0].tx_packets + 1, \
+                self.assertEqual(qs_after.entries[0].tx_packets, \
+                                 qs_before.entries[0].tx_packets + 1, \
                                  "Verification of egress queue tx packet count failed"
                                  )
                     
@@ -503,7 +501,6 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
 
         for idx in range(len(of_ports)):
             delete_all_flows(self.controller)
@@ -517,13 +514,11 @@
 
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
-            act.port = egress_port1
-            request.actions.add(act)
-            act.port = egress_port2
-            request.actions.add(act)
+            request.actions.append(ofp.action.output(port=egress_port1))
+            request.actions.append(ofp.action.output(port=egress_port2))
             # logging.info(request.show())
 
             logging.info("Inserting flow")
@@ -561,7 +556,6 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
 
         for ingress_port in of_ports:
             delete_all_flows(self.controller)
@@ -570,14 +564,13 @@
                            " all non-ingress ports")
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
             for egress_port in of_ports:
                 if egress_port == ingress_port:
                     continue
-                act.port = egress_port
-                request.actions.add(act)
+                request.actions.append(ofp.action.output(port=egress_port))
             logging.debug(request.show())
 
             logging.info("Inserting flow")
@@ -613,7 +606,6 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
 
         for ingress_port in of_ports:
             delete_all_flows(self.controller)
@@ -621,15 +613,16 @@
             logging.info("Ingress " + str(ingress_port) + " to all ports")
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
             for egress_port in of_ports:
+                act = ofp.action.output()
                 if egress_port == ingress_port:
                     act.port = ofp.OFPP_IN_PORT
                 else:
                     act.port = egress_port
-                request.actions.add(act)
+                request.actions.append(act)
             # logging.info(request.show())
 
             logging.info("Inserting flow")
@@ -661,7 +654,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         for of_port in of_ports:
             # Clear relevant bits that might block ports
@@ -677,11 +670,11 @@
             logging.info("Ingress " + str(ingress_port) + " to all ports")
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
             act.port = ofp.OFPP_FLOOD
-            request.actions.add(act)
+            request.actions.append(act)
             logging.info(request.show())
 
             logging.info("Inserting flow")
@@ -715,7 +708,6 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
 
         for ingress_port in of_ports:
             delete_all_flows(self.controller)
@@ -723,13 +715,11 @@
             logging.info("Ingress " + str(ingress_port) + " to all ports")
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
-            act.port = ofp.OFPP_FLOOD
-            request.actions.add(act)
-            act.port = ofp.OFPP_IN_PORT
-            request.actions.add(act)
+            request.actions.append(ofp.action.output(port=ofp.OFPP_FLOOD))
+            request.actions.append(ofp.action.output(port=ofp.OFPP_IN_PORT))
             logging.info(request.show())
 
             logging.info("Inserting flow")
@@ -760,7 +750,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         for ingress_port in of_ports:
             delete_all_flows(self.controller)
@@ -768,11 +758,11 @@
             logging.info("Ingress " + str(ingress_port) + " to all ports")
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
             act.port = ofp.OFPP_ALL
-            request.actions.add(act)
+            request.actions.append(act)
             logging.info(request.show())
 
             logging.info("Inserting flow")
@@ -806,7 +796,6 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
 
         for ingress_port in of_ports:
             delete_all_flows(self.controller)
@@ -814,13 +803,11 @@
             logging.info("Ingress " + str(ingress_port) + " to all ports")
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
-            act.port = ofp.OFPP_ALL
-            request.actions.add(act)
-            act.port = ofp.OFPP_IN_PORT
-            request.actions.add(act)
+            request.actions.append(ofp.action.output(port=ofp.OFPP_ALL))
+            request.actions.append(ofp.action.output(port=ofp.OFPP_IN_PORT))
             logging.info(request.show())
 
             logging.info("Inserting flow")
@@ -853,7 +840,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         # Clear OFPPC_NO_FLOOD on each port
         for of_port in of_ports:
@@ -873,11 +860,11 @@
 
             match.in_port = ingress_port
 
-            request = message.flow_mod()
+            request = ofp.message.flow_add()
             request.match = match
             request.buffer_id = 0xffffffff
             act.port = ofp.OFPP_FLOOD
-            request.actions.add(act)
+            request.actions.append(act)
             logging.info(request.show())
 
             logging.info("Inserting flow")
@@ -937,7 +924,7 @@
 
     def runTest(self):
         vid = test_param_get('vid', default=TEST_VID_DEFAULT)
-        flow_match_test(self, config["port_map"], dl_vlan=vid)
+        flow_match_test(self, config["port_map"], vlan_vid=vid)
 
 @disabled
 class ExactMatchTaggedMany(BaseMatchCase):
@@ -947,10 +934,10 @@
 
     def runTest(self):
         for vid in range(2,100,10):
-            flow_match_test(self, config["port_map"], dl_vlan=vid, max_test=5)
+            flow_match_test(self, config["port_map"], vlan_vid=vid, max_test=5)
         for vid in range(100,4000,389):
-            flow_match_test(self, config["port_map"], dl_vlan=vid, max_test=5)
-        flow_match_test(self, config["port_map"], dl_vlan=4094, max_test=5)
+            flow_match_test(self, config["port_map"], vlan_vid=vid, max_test=5)
+        flow_match_test(self, config["port_map"], vlan_vid=4094, max_test=5)
 
 class SingleWildcardMatchPriority(BaseMatchCase):
     """
@@ -1035,10 +1022,10 @@
         
     def removeFlow(self, prio):
         if self.flowMsgs.has_key(prio):
-            msg = self.flowMsgs[prio]
-            msg.command = ofp.OFPFC_DELETE_STRICT
-            # This *must* be set for DELETE
-            msg.out_port = ofp.OFPP_NONE
+            old_msg = self.flowMsgs[prio]
+            msg = ofp.message.flow_delete_strict(out_port=ofp.OFPP_NONE,
+                                                 match=old_msg.match,
+                                                 priority=old_msg.priority)
             logging.debug("Remove flow with priority " + str(prio))
             self.controller.message_send(msg)
             do_barrier(self.controller)
@@ -1174,11 +1161,11 @@
             wc |= required_wildcards(self)
             if wc & ofp.OFPFW_DL_VLAN:
                 # Set nonzero VLAN id to avoid sending priority-tagged packet
-                dl_vlan = vid
+                vlan_vid = vid
             else:
-                dl_vlan = -1
+                vlan_vid = -1
             flow_match_test(self, config["port_map"], wildcards=wc, 
-                            dl_vlan=dl_vlan, max_test=10)
+                            vlan_vid=vlan_vid, max_test=10)
 
 class SingleWildcardMatchTagged(BaseMatchCase):
     """
@@ -1188,7 +1175,7 @@
         vid = test_param_get('vid', default=TEST_VID_DEFAULT)
         for wc in WILDCARD_VALUES:
             wc |= required_wildcards(self)
-            flow_match_test(self, config["port_map"], wildcards=wc, dl_vlan=vid,
+            flow_match_test(self, config["port_map"], wildcards=wc, vlan_vid=vid,
                             max_test=10)
 
 class AllExceptOneWildcardMatch(BaseMatchCase):
@@ -1208,11 +1195,11 @@
             all_exp_one_wildcard |= required_wildcards(self)
             if all_exp_one_wildcard & ofp.OFPFW_DL_VLAN:
                 # Set nonzero VLAN id to avoid sending priority-tagged packet
-                dl_vlan = vid
+                vlan_vid = vid
             else:
-                dl_vlan = -1
+                vlan_vid = -1
             flow_match_test(self, config["port_map"], wildcards=all_exp_one_wildcard,
-                            dl_vlan=dl_vlan)
+                            vlan_vid=vlan_vid)
 
 class AllExceptOneWildcardMatchTagged(BaseMatchCase):
     """
@@ -1223,7 +1210,7 @@
         for all_exp_one_wildcard in NO_WILDCARD_VALUES:
             all_exp_one_wildcard |= required_wildcards(self)
             flow_match_test(self, config["port_map"], wildcards=all_exp_one_wildcard,
-                            dl_vlan=vid)
+                            vlan_vid=vid)
 
 class AllWildcardMatch(BaseMatchCase):
     """
@@ -1246,7 +1233,7 @@
     def runTest(self):
         vid = test_param_get('vid', default=TEST_VID_DEFAULT)
         flow_match_test(self, config["port_map"], wildcards=ofp.OFPFW_ALL, 
-                        dl_vlan=vid)
+                        vlan_vid=vid)
 
 @group('smoke')
 class AddVLANTag(BaseMatchCase):
@@ -1264,8 +1251,8 @@
         len_w_vid = 104
         pkt = simple_tcp_packet(pktlen=len)
         exp_pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True, 
-                                    dl_vlan=new_vid)
-        vid_act = action.action_set_vlan_vid()
+                                    vlan_vid=new_vid)
+        vid_act = ofp.action.set_vlan_vid()
         vid_act.vlan_vid = new_vid
 
         flow_match_test(self, config["port_map"], pkt=pkt, 
@@ -1294,7 +1281,7 @@
 
     def runTest(self):
         vid = test_param_get('vid', default=TEST_VID_DEFAULT)
-        pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=vid)
+        pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vid)
         of_ports = config["port_map"].keys()
         of_ports.sort()
         ing_port = of_ports[0]
@@ -1318,9 +1305,9 @@
             skip_message_emit(self, "Modify VLAN tag test")
             return
 
-        pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=old_vid)
-        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=new_vid)
-        vid_act = action.action_set_vlan_vid()
+        pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=old_vid)
+        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=new_vid)
+        vid_act = ofp.action.set_vlan_vid()
         vid_act.vlan_vid = new_vid
 
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
@@ -1337,7 +1324,7 @@
 
 class ModifyVIDWithTagMatchWildcarded(BaseMatchCase):
     """
-    With vlan ID and priority wildcarded, perform SET_VLAN_VID action.
+    With vlan ID and priority wildcarded, perform SET_VLAN_VID ofp.action.
     The same flow should match on both untagged and tagged packets.
     """
     def runTest(self):
@@ -1359,12 +1346,12 @@
         len_w_vid = 104
         untagged_pkt = simple_tcp_packet(pktlen=len_untagged)
         tagged_pkt = simple_tcp_packet(pktlen=len_w_vid, 
-                                       dl_vlan_enable=True, dl_vlan=old_vid)
+                                       dl_vlan_enable=True, vlan_vid=old_vid)
         exp_pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True,
-                                    dl_vlan=new_vid)
+                                    vlan_vid=new_vid)
         wildcards = (required_wildcards(self) | ofp.OFPFW_DL_VLAN |
                      ofp.OFPFW_DL_VLAN_PCP)
-        vid_act = action.action_set_vlan_vid()
+        vid_act = ofp.action.set_vlan_vid()
         vid_act.vlan_vid = new_vid
         request = flow_msg_create(self, untagged_pkt, ing_port=ing_port, 
                                   wildcards=wildcards, egr_ports=egr_ports,
@@ -1394,9 +1381,9 @@
             skip_message_emit(self, "Modify VLAN priority test")
             return
 
-        pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=vid, dl_vlan_pcp=old_vlan_pcp)
-        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=vid, dl_vlan_pcp=new_vlan_pcp)
-        vid_act = action.action_set_vlan_pcp()
+        pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vid, vlan_pcp=old_vlan_pcp)
+        exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vid, vlan_pcp=new_vlan_pcp)
+        vid_act = ofp.action.set_vlan_pcp()
         vid_act.vlan_pcp = new_vlan_pcp
 
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
@@ -1416,9 +1403,9 @@
         len_w_vid = 104
         len = 100
         pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True, 
-                                dl_vlan=old_vid)
+                                vlan_vid=old_vid)
         exp_pkt = simple_tcp_packet(pktlen=len)
-        vid_act = action.action_strip_vlan()
+        vid_act = ofp.action.strip_vlan()
 
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
                         action_list=[vid_act])
@@ -1438,11 +1425,11 @@
         len_w_vid = 104
         len_untagged = 100
         pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True, 
-                                dl_vlan=old_vid)
+                                vlan_vid=old_vid)
         exp_pkt = simple_tcp_packet(pktlen=len_untagged)
         wildcards = (required_wildcards(self) | ofp.OFPFW_DL_VLAN |
                      ofp.OFPFW_DL_VLAN_PCP)
-        vid_act = action.action_strip_vlan()
+        vid_act = ofp.action.strip_vlan()
 
         flow_match_test(self, config["port_map"], 
                         wildcards=wildcards,
@@ -1454,13 +1441,13 @@
     Pass back a dictionary with default packet arguments
     """
     args = {}
-    args["dl_src"] = '00:23:45:67:89:AB'
+    args["eth_src"] = '00:23:45:67:89:AB'
 
     dl_vlan_enable=False
-    dl_vlan=-1
+    vlan_vid=-1
     if config["test-params"]["vid"]:
         dl_vlan_enable=True
-        dl_vlan = config["test-params"]["vid"]
+        vlan_vid = config["test-params"]["vid"]
 
 # Unpack operator is ** on a dictionary
 
@@ -1476,7 +1463,7 @@
             skip_message_emit(self, "ModifyL2Src test")
             return
 
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_src'],
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_src'],
                                                 check_test_params=True)
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, 
                         action_list=acts, max_test=2)
@@ -1491,7 +1478,7 @@
             skip_message_emit(self, "ModifyL2dst test")
             return
 
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_dst'],
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_dst'],
                                                 check_test_params=True)
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, 
                         action_list=acts, max_test=2)
@@ -1611,7 +1598,7 @@
             skip_message_emit(self, "ModifyL2dstMC test")
             return
 
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_dst'],
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_dst'],
                                                 check_test_params=True)
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, 
                         action_list=acts, max_test=2, egr_count=-1)
@@ -1626,7 +1613,7 @@
             skip_message_emit(self, "ModifyL2dstIngress test")
             return
 
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_dst'],
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_dst'],
                                                 check_test_params=True)
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, 
                         action_list=acts, max_test=2, egr_count=0,
@@ -1642,7 +1629,7 @@
             skip_message_emit(self, "ModifyL2dstMC test")
             return
 
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_dst'],
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_dst'],
                                                 check_test_params=True)
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, 
                         action_list=acts, max_test=2, egr_count=-1,
@@ -1658,7 +1645,7 @@
             skip_message_emit(self, "ModifyL2SrcMC test")
             return
 
-        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['dl_src'],
+        (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_src'],
                                                 check_test_params=True)
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, 
                         action_list=acts, max_test=2, egr_count=-1)
@@ -1674,7 +1661,7 @@
             skip_message_emit(self, "ModifyL2SrcDstMC test")
             return
 
-        mod_fields = ['dl_dst', 'dl_src']
+        mod_fields = ['eth_dst', 'eth_src']
         (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=mod_fields,
                                                 check_test_params=True)
         flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, 
@@ -1691,7 +1678,7 @@
             skip_message_emit(self, "ModifyL2DstVIDMC test")
             return
 
-        mod_fields = ['dl_dst', 'dl_vlan']
+        mod_fields = ['eth_dst', 'vlan_vid']
         (pkt, exp_pkt, acts) = pkt_action_setup(self, 
              start_field_vals={'dl_vlan_enable':True}, mod_fields=mod_fields,
                                                 check_test_params=True)
@@ -1707,11 +1694,11 @@
         sup_acts = self.supported_actions
 
         sup_map = {
-            "dl_dst" : ofp.OFPAT_SET_DL_DST,
-            "dl_src" : ofp.OFPAT_SET_DL_SRC,
+            "eth_dst" : ofp.OFPAT_SET_DL_DST,
+            "eth_src" : ofp.OFPAT_SET_DL_SRC,
             "dl_vlan_enable" : ofp.OFPAT_SET_VLAN_VID,
-            "dl_vlan" : ofp.OFPAT_SET_VLAN_VID,
-            "dl_vlan_pcp" : ofp.OFPAT_SET_VLAN_PCP,
+            "vlan_vid" : ofp.OFPAT_SET_VLAN_VID,
+            "vlan_pcp" : ofp.OFPAT_SET_VLAN_PCP,
             "ip_src" : ofp.OFPAT_SET_NW_SRC,
             "ip_dst" : ofp.OFPAT_SET_NW_DST,
             "ip_tos" : ofp.OFPAT_SET_NW_TOS,
@@ -1751,8 +1738,8 @@
         logging.info("Running flow toggle with %d flows, %d iterations" %
                        (flow_count, iter_count))
         acts = []
-        acts.append(action.action_output())
-        acts.append(action.action_output())
+        acts.append(ofp.action.output())
+        acts.append(ofp.action.output())
     
         of_ports = config["port_map"].keys()
         if len(of_ports) < 3:
@@ -1771,14 +1758,13 @@
         for toggle in range(2):
             for f_idx in range(flow_count):
                 pkt = simple_tcp_packet(tcp_sport=f_idx)
-                msg = message.flow_mod()
+                msg = ofp.message.flow_add()
                 match = packet_to_flow_match(self, pkt)
                 match.in_port = of_ports[2]
                 match.wildcards = wildcards
                 msg.match = match
                 msg.buffer_id = 0xffffffff
-                msg.command = ofp.OFPFC_ADD
-                msg.actions.add(acts[toggle])
+                msg.actions.append(acts[toggle])
                 flows[toggle].append(msg)
 
         # Show two sample flows
@@ -1923,7 +1909,7 @@
 
         delete_all_flows(self.controller)
 
-        pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=2)
+        pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=2)
         ingress_port = of_ports[0]
         egress_port = of_ports[1]
 
@@ -1943,13 +1929,13 @@
                     else:
                         new = ~orig & mask
                     setattr(match, field, new)
-                request = message.flow_mod()
+                request = ofp.message.flow_add()
                 request.match = match
                 request.buffer_id = 0xffffffff
                 request.priority = priority
-                act = action.action_output()
+                act = ofp.action.output()
                 act.port = output_port
-                request.actions.add(act)
+                request.actions.append(act)
                 logging.info("Inserting flow")
                 self.controller.message_send(request)
 
@@ -1979,26 +1965,26 @@
         wildcards = required_wildcards(self)
         # TODO in_port
         if not (wildcards & ofp.OFPFW_DL_SRC):
-            testField("dl_src", [0xff]*6)
+            testField("eth_src", [0xff]*6)
         if not (wildcards & ofp.OFPFW_DL_DST):
-            testField("dl_dst", [0xff]*6)
+            testField("eth_dst", [0xff]*6)
         if not (wildcards & ofp.OFPFW_DL_TYPE):
-            testField("dl_type", 0xffff)
+            testField("eth_type", 0xffff)
         if not (wildcards & ofp.OFPFW_DL_VLAN):
-            testField("dl_vlan", 0xfff)
-        # TODO dl_vlan_pcp
+            testField("vlan_vid", 0xfff)
+        # TODO vlan_pcp
         if not (wildcards & ofp.OFPFW_NW_SRC_ALL):
-            testField("nw_src", 0xffffffff)
+            testField("ipv4_src", 0xffffffff)
         if not (wildcards & ofp.OFPFW_NW_DST_ALL):
-            testField("nw_dst", 0xffffffff)
+            testField("ipv4_dst", 0xffffffff)
         if not (wildcards & ofp.OFPFW_NW_TOS):
-            testField("nw_tos", 0x3f)
+            testField("ip_dscp", 0x3f)
         if not (wildcards & ofp.OFPFW_NW_PROTO):
-            testField("nw_proto", 0xff)
+            testField("ip_proto", 0xff)
         if not (wildcards & ofp.OFPFW_TP_SRC):
-            testField("tp_src", 0xffff)
+            testField("tcp_src", 0xffff)
         if not (wildcards & ofp.OFPFW_TP_DST):
-            testField("tp_dst", 0xffff)
+            testField("tcp_dst", 0xffff)
 
 class DirectBadPacketBase(base_tests.SimpleDataPlane):
     """
@@ -2028,19 +2014,19 @@
         # - action
 
     def createMatch(self, **kwargs):
-        match = ofp.ofp_match()
+        match = ofp.match()
         match.wildcards = ofp.OFPFW_ALL
         fields = {
-            'dl_dst': ofp.OFPFW_DL_DST,
-            'dl_src': ofp.OFPFW_DL_SRC,
-            'dl_type': ofp.OFPFW_DL_TYPE,
-            'dl_vlan': ofp.OFPFW_DL_VLAN,
-            'nw_src': ofp.OFPFW_NW_SRC_MASK,
-            'nw_dst': ofp.OFPFW_NW_DST_MASK,
-            'nw_tos': ofp.OFPFW_NW_TOS,
-            'nw_proto': ofp.OFPFW_NW_PROTO,
-            'tp_src': ofp.OFPFW_TP_SRC,
-            'tp_dst': ofp.OFPFW_TP_DST,
+            'eth_dst': ofp.OFPFW_DL_DST,
+            'eth_src': ofp.OFPFW_DL_SRC,
+            'eth_type': ofp.OFPFW_DL_TYPE,
+            'vlan_vid': ofp.OFPFW_DL_VLAN,
+            'ipv4_src': ofp.OFPFW_NW_SRC_MASK,
+            'ipv4_dst': ofp.OFPFW_NW_DST_MASK,
+            'ip_dscp': ofp.OFPFW_NW_TOS,
+            'ip_proto': ofp.OFPFW_NW_PROTO,
+            'tcp_src': ofp.OFPFW_TP_SRC,
+            'tcp_dst': ofp.OFPFW_TP_DST,
         }
         for key in kwargs:
             setattr(match, key, kwargs[key])
@@ -2073,29 +2059,29 @@
 
         match.in_port = ingress_port
 
-        request = message.flow_mod()
+        request = ofp.message.flow_add()
         request.match = match
         request.priority = 1
 
         request.buffer_id = 0xffffffff
         for act in acts:
             act.port = egress_port
-            request.actions.add(act)
+            request.actions.append(act)
 
         logging.info("Inserting flow")
         self.controller.message_send(request)
 
         # This flow speeds up negative tests
         logging.info("Inserting catch-all flow")
-        request2 = message.flow_mod()
+        request2 = ofp.message.flow_add()
         request2.match = self.createMatch()
         request2.match.wildcards &= ~ofp.OFPFW_IN_PORT
         request2.match.in_port = ingress_port
 
         request2.priority = 0
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = ofp.OFPP_IN_PORT
-        request2.actions.add(act)
+        request2.actions.append(act)
         self.controller.message_send(request2)
 
         do_barrier(self.controller)
@@ -2155,8 +2141,8 @@
         pass
 
     def runTestWithProto(self, protoName = 'TCP'):
-        dl_dst='00:01:02:03:04:05'
-        dl_src='00:06:07:08:09:0a'
+        eth_dst='00:01:02:03:04:05'
+        eth_src='00:06:07:08:09:0a'
         ip_src='192.168.0.1'
         ip_dst='192.168.0.2'
         ip_tos=0
@@ -2174,7 +2160,7 @@
         else:
             raise Exception("Passed in unknown proto name")
 
-        match_pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+        match_pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
             scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos)/ \
             tp(sport=tcp_sport, dport=tcp_dport)
         match = packet_to_flow_match(self, match_pkt)
@@ -2183,7 +2169,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         
         def testPacket(title, pkt, result):
-            act = action.action_output()
+            act = ofp.action.output()
             pkts = [
                 [title, pkt, result]
             ]
@@ -2191,32 +2177,32 @@
         
         # Try incomplete IP headers
         testPacket("Incomplete IP header (1 bytes)",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto))[0:1],
             self.RESULT_NOMATCH,
         )
         testPacket("Incomplete IP header (2 bytes)",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto))[0:2],
             self.RESULT_NOMATCH,
         )
         testPacket("Incomplete IP header (3 bytes)",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto))[0:3],
             self.RESULT_NOMATCH,
         )
         testPacket("Incomplete IP header (12 bytes)",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto))[0:12],
             self.RESULT_NOMATCH,
         )
         testPacket("Incomplete IP header (16 bytes)",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto))[0:16],
             self.RESULT_NOMATCH,
         )
         testPacket("Incomplete IP header (19 bytes)",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto))[0:19],
             self.RESULT_NOMATCH,
         )
@@ -2226,29 +2212,29 @@
         # we initiatlize once with a non-matching full packet and once with a 
         # matching full packet.
         testPacket("Non-Matching TCP packet, warming buffer",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto)/ \
                 tp(sport=tcp_sport, dport=tcp_dport + 1),
             self.RESULT_NOMATCH,
         )
         testPacket("Missing TCP header, buffer warmed with non-match",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto),
             self.RESULT_NOMATCH,
         )
         testPacket("Matching TCP packet, warming buffer",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto)/ \
                 tp(sport=tcp_sport, dport=tcp_dport),
             self.RESULT_MATCH,
         )
         testPacket("Missing TCP header, buffer warmed with match",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto),
             self.RESULT_NOMATCH,
         )
         testPacket("Truncated TCP header: 2 bytes",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto)/ \
                 (str(tp(sport=tcp_sport, dport=tcp_dport))[0:2]),
             self.RESULT_NOMATCH,
@@ -2278,27 +2264,27 @@
             self.RESULT_NOMATCH,
         )
         testPacket("Missing TCP header, corrupt ihl",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ihl=0xf, proto=proto),
             self.RESULT_NOMATCH,
         )
         testPacket("Missing TCP header, corrupt total length",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto, len= 100),
             self.RESULT_NOMATCH,
         )
         testPacket("Missing TCP header, corrupt ihl and total length",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ihl=0xf, proto=proto, len=43),
             self.RESULT_NOMATCH,
         )
         testPacket("Incomplete IP header (12 bytes), corrupt ihl and total length",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto, ihl=10, len=43))[0:12],
             self.RESULT_NOMATCH,
         )
         testPacket("Incomplete IP header (16 bytes), corrupt ihl and total length",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 str(scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto, ihl=10, len=43))[0:16],
             self.RESULT_NOMATCH,
         )
@@ -2307,7 +2293,7 @@
         # destination ports. As that is all we care about during matching, some
         # implementations may match and some may drop the packet
         testPacket("Incomplete TCP header: src/dst port present",
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, proto=proto)/ \
                 (str(tp(sport=tcp_sport, dport=tcp_dport))[0:4]),
             self.RESULT_ANY,
@@ -2316,7 +2302,7 @@
         for i in range(1):
             for length in range(40 / 4): # IPv4 options are a maximum of 40 in length
                 bytes = "".join([("%c" % random.randint(0, 255)) for x in range(length * 4)])
-                eth = scapy.Ether(dst=dl_dst, src=dl_src)
+                eth = scapy.Ether(dst=eth_dst, src=eth_src)
                 ip = scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ihl=5 + length, proto=proto)
                 tcp = tp(sport=tcp_sport, dport=tcp_dport+1)
                 pkt = eth / ip
@@ -2327,7 +2313,7 @@
                     self.RESULT_NOMATCH
                 )
 
-                eth = scapy.Ether(dst=dl_dst, src=dl_src)
+                eth = scapy.Ether(dst=eth_dst, src=eth_src)
                 ip = scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ihl=5 + length, proto=proto)
                 tcp = tp(sport=tcp_sport, dport=tcp_dport)
                 pkt = eth / ip
@@ -2359,8 +2345,8 @@
     Verify LLC/SNAP parsing and matching. Focus on packet corruptions 
     """
     def runTest(self):
-        dl_dst='00:01:02:03:04:05'
-        dl_src='00:06:07:08:09:0a'
+        eth_dst='00:01:02:03:04:05'
+        eth_src='00:06:07:08:09:0a'
         ip_src='192.168.0.1'
         ip_dst='192.168.0.2'
         ip_tos=0
@@ -2372,19 +2358,19 @@
         IS_NOT_SNAP_IP = 3
 
         def testPacketTcpMatch(title, llc):
-            match_pkt = scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            match_pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos)/ \
                 scapy.TCP(sport=tcp_sport, dport=tcp_dport)
             match = packet_to_flow_match(self, match_pkt)
             self.assertTrue(match is not None, 
                             "Could not generate flow match from pkt")
             match.wildcards &= ~ofp.OFPFW_IN_PORT
-            act = action.action_output()
+            act = ofp.action.output()
             
             self.testPktsAgainstFlow(
                 [[
                     "TCP match - LLC frame correct length - %s" % title,
-                    scapy.Ether(dst=dl_dst, src=dl_src, type=len(llc)) / llc,
+                    scapy.Ether(dst=eth_dst, src=eth_src, type=len(llc)) / llc,
                     self.RESULT_ANY,
                 ]],
                 act, match
@@ -2395,7 +2381,7 @@
             self.testPktsAgainstFlow(
                 [[
                     "TCP match - LLC frame corrupted length - %s" % title,
-                    scapy.Ether(dst=dl_dst, src=dl_src, type=ethLen) / llc,
+                    scapy.Ether(dst=eth_dst, src=eth_src, type=ethLen) / llc,
                     self.RESULT_ANY,
                 ]],
                 act, match
@@ -2403,7 +2389,7 @@
 
         def testPacketEthSrcDstMatch(title, llc):
             # Matching based on Ethernet source and destination
-            match_pkt = scapy.Ether(dst=dl_dst, src=dl_src)
+            match_pkt = scapy.Ether(dst=eth_dst, src=eth_src)
             match = packet_to_flow_match(self, match_pkt)
             self.assertTrue(match is not None, 
                             "Could not generate flow match from pkt")
@@ -2412,10 +2398,10 @@
             self.testPktsAgainstFlow(
                 [[
                     "Eth addr match - LLC frame correct length- %s" % title,
-                    scapy.Ether(dst=dl_dst, src=dl_src, type=len(llc)) / llc,
+                    scapy.Ether(dst=eth_dst, src=eth_src, type=len(llc)) / llc,
                     self.RESULT_MATCH,
                 ]],
-                action.action_output(), match
+                ofp.action.output(), match
             )
     
             # Corrupt length field
@@ -2423,15 +2409,15 @@
             self.testPktsAgainstFlow(
                 [[
                     "Eth addr match - LLC frame corrupted length- %s" % title,
-                    scapy.Ether(dst=dl_dst, src=dl_src, type=ethLen) / llc,
+                    scapy.Ether(dst=eth_dst, src=eth_src, type=ethLen) / llc,
                     self.RESULT_ANY,
                 ]],
-                action.action_output(), match
+                ofp.action.output(), match
             )
             
         def testPacketEthSrcDstTypeMatch(title, llc, is_snap_ip):
             # Matching based on Ethernet source, destination and type
-            match_pkt = scapy.Ether(dst=dl_dst, src=dl_src, type=0x800)
+            match_pkt = scapy.Ether(dst=eth_dst, src=eth_src, type=0x800)
             match = packet_to_flow_match(self, match_pkt)
             self.assertTrue(match is not None, 
                             "Could not generate flow match from pkt")
@@ -2445,10 +2431,10 @@
             self.testPktsAgainstFlow(
                 [[
                     "Eth addr+type match - LLC frame correct length - %s" % title,
-                    scapy.Ether(dst=dl_dst, src=dl_src, type=len(llc)) / llc,
+                    scapy.Ether(dst=eth_dst, src=eth_src, type=len(llc)) / llc,
                     is_match,
                 ]],
-                action.action_output(), match
+                ofp.action.output(), match
             )
     
             # Corrupt length field
@@ -2456,10 +2442,10 @@
             self.testPktsAgainstFlow(
                 [[
                     "Eth addr+type match - LLC frame corrupted length - %s" % title,
-                    scapy.Ether(dst=dl_dst, src=dl_src, type=ethLen) / llc,
+                    scapy.Ether(dst=eth_dst, src=eth_src, type=ethLen) / llc,
                     self.RESULT_ANY,
                 ]],
-                action.action_output(), match
+                ofp.action.output(), match
             )
 
         def testPacket(title, llc, is_snap_ip):
@@ -2512,8 +2498,8 @@
     Verify LLC/SNAP parsing (valid and corrupted packets) and matching
     """
     def runTest(self):
-        dl_dst='00:01:02:03:04:05'
-        dl_src='00:06:07:08:09:0a'
+        eth_dst='00:01:02:03:04:05'
+        eth_src='00:06:07:08:09:0a'
         ip_src='192.168.0.1'
         ip_dst='192.168.0.2'
         ip_tos=0
@@ -2526,7 +2512,7 @@
         IS_NOT_SNAP = 3
 
         def testPacketEthTypeIP(title, llc, is_snap):
-            match_pkt = scapy.Ether(dst=dl_dst, src=dl_src, type=0x800)
+            match_pkt = scapy.Ether(dst=eth_dst, src=eth_src, type=0x800)
             match = packet_to_flow_match(self, match_pkt)
             self.assertTrue(match is not None, 
                             "Could not generate flow match from pkt")
@@ -2538,14 +2524,14 @@
                 result = self.RESULT_MATCH
             pkts.append([
                 "Ether type 0x800 match - %s" % title,
-                scapy.Ether(dst=dl_dst, src=dl_src, type=len(llc)) / llc,
+                scapy.Ether(dst=eth_dst, src=eth_src, type=len(llc)) / llc,
                 result,
             ])
-            act = action.action_output()
+            act = ofp.action.output()
             self.testPktsAgainstFlow(pkts, act, match)
     
         def testPacketEthTypeNotEth(title, llc, is_snap):
-            match_pkt = scapy.Ether(dst = dl_dst, src = dl_src, 
+            match_pkt = scapy.Ether(dst = eth_dst, src = eth_src, 
                                     type = ofp.OFP_DL_TYPE_NOT_ETH_TYPE)
             match = packet_to_flow_match(self, match_pkt)
             self.assertTrue(match is not None, 
@@ -2558,10 +2544,10 @@
                 result = self.RESULT_NOMATCH
             pkts.append([
                 "Ether type OFP_DL_TYPE_NOT_ETH_TYPE match - %s" % title,
-                scapy.Ether(dst=dl_dst, src=dl_src, type=len(llc)) / llc,
+                scapy.Ether(dst=eth_dst, src=eth_src, type=len(llc)) / llc,
                 result,
             ])
-            act = action.action_output()
+            act = ofp.action.output()
             self.testPktsAgainstFlow(pkts, act, match)
     
         def testPacket(title, llc, is_snap):
@@ -2625,8 +2611,8 @@
         self.testArpHandling()
 
     def testArpHandling(self):
-        dl_dst='00:01:02:03:04:05'
-        dl_src='00:06:07:08:09:0a'
+        eth_dst='00:01:02:03:04:05'
+        eth_src='00:06:07:08:09:0a'
         ip_src='192.168.0.1'
         ip_dst='192.168.0.2'
         ip_src2='192.168.1.1'
@@ -2638,7 +2624,7 @@
         def testPacket(title, arp_match, arp_pkt, result):
             pkts = []
     
-            match_pkt = scapy.Ether(dst=dl_dst, src=dl_src) / arp_match
+            match_pkt = scapy.Ether(dst=eth_dst, src=eth_src) / arp_match
             match = packet_to_flow_match(self, match_pkt)
             self.assertTrue(match is not None, 
                             "Could not generate flow match from pkt")
@@ -2646,16 +2632,16 @@
             
             pkts.append([
                 title,
-                scapy.Ether(dst=dl_dst, src=dl_src) / arp_pkt,
+                scapy.Ether(dst=eth_dst, src=eth_src) / arp_pkt,
                 result,
             ])
     
-            act = action.action_output()
+            act = ofp.action.output()
             self.testPktsAgainstFlow(pkts, act, match)
             
         testPacket("Basic ARP",
             scapy.ARP(psrc=ip_src, pdst=ip_dst, op = 1),
-            scapy.ARP(hwdst = '00:00:00:00:00:00', hwsrc = dl_src,
+            scapy.ARP(hwdst = '00:00:00:00:00:00', hwsrc = eth_src,
                       psrc = ip_src, pdst = ip_dst, hwlen = 6, plen = 4,
                       ptype = 0x800, hwtype = 1, op = 1),
             self.RESULT_MATCH
@@ -2672,8 +2658,8 @@
     Verify VLAN parsing (valid and corrupted packets) and ARP matching
     """
     def runTest(self):
-        dl_dst='00:01:02:03:04:05'
-        dl_src='00:06:07:08:09:0a'
+        eth_dst='00:01:02:03:04:05'
+        eth_src='00:06:07:08:09:0a'
         ip_src='192.168.0.1'
         ip_dst='192.168.0.2'
         ip_src2='192.168.1.1'
@@ -2695,65 +2681,65 @@
                 result,
             ])
     
-            act = action.action_output()
+            act = ofp.action.output()
             self.testPktsAgainstFlow(pkts, act, match)
 
         testPacket("Basic MAC matching - IPv4 payload",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src)),
-            scapy.Ether(dst=dl_dst, src=dl_src, type=0x800) / scapy.IP(),
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src)),
+            scapy.Ether(dst=eth_dst, src=eth_src, type=0x800) / scapy.IP(),
             self.RESULT_MATCH
         )
         testPacket("Basic MAC matching - VMware beacon - no payload",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src)),
-            scapy.Ether(dst=dl_dst, src=dl_src, type=0x8922),
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src)),
+            scapy.Ether(dst=eth_dst, src=eth_src, type=0x8922),
             self.RESULT_MATCH
         )
         testPacket("Basic MAC matching - VMware beacon - with payload",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src)),
-            scapy.Ether(dst=dl_dst, src=dl_src, type=0x8922)/ ("X" * 1),
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src)),
+            scapy.Ether(dst=eth_dst, src=eth_src, type=0x8922)/ ("X" * 1),
             self.RESULT_MATCH
         )
         testPacket("Basic MAC matching - IPv6 payload",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src)),
-            scapy.Ether(dst=dl_dst, src=dl_src) / scapy.IPv6(),
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src)),
+            scapy.Ether(dst=eth_dst, src=eth_src) / scapy.IPv6(),
             self.RESULT_MATCH
         )
         testPacket("Basic MAC matching with VLAN tag present",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src)),
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src)),
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.Dot1Q(prio=5, vlan=1000)/ \
                 scapy.IP(),
             self.RESULT_MATCH
         )
         testPacket("Basic MAC matching with VLAN tag present",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src),
-                             dl_type=0x800),
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src),
+                             eth_type=0x800),
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.Dot1Q(prio=5, vlan=1000)/ \
                 scapy.IP(),
             self.RESULT_MATCH
         )
         testPacket("Ether matching with VLAN tag present - No type match",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src),
-                             dl_type=0x801),
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src),
+                             eth_type=0x801),
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.Dot1Q(prio=5, vlan=1000)/ \
                 scapy.IP(),
             self.RESULT_NOMATCH
         )
         testPacket("Ether matching with VLAN tag present - No type match 0x8100",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src),
-                             dl_type=0x8100),
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src),
+                             eth_type=0x8100),
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.Dot1Q(prio=5, vlan=1000)/ \
                 scapy.IP(),
             self.RESULT_NOMATCH
         )
         testPacket("IP matching - VLAN tag",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src),
-                             dl_type=0x0800,
-                             nw_src=parse_ip(ip_src), nw_dst=parse_ip(ip_dst)),
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src),
+                             eth_type=0x0800,
+                             ipv4_src=parse_ip(ip_src), ipv4_dst=parse_ip(ip_dst)),
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.Dot1Q(prio=5, vlan=1000)/ \
                 scapy.IP(src=ip_src, dst=ip_dst),
             self.RESULT_MATCH
@@ -2769,8 +2755,8 @@
     the treatment of these cases, so broken out to be non-standard
     """
     def runTest(self):
-        dl_dst='00:01:02:03:04:05'
-        dl_src='00:06:07:08:09:0a'
+        eth_dst='00:01:02:03:04:05'
+        eth_src='00:06:07:08:09:0a'
         ip_src='192.168.0.1'
         ip_dst='192.168.0.2'
         ip_src2='192.168.1.1'
@@ -2792,21 +2778,21 @@
                 result,
             ])
     
-            act = action.action_output()
+            act = ofp.action.output()
             self.testPktsAgainstFlow(pkts, act, match)
         testPacket("Ether matching with double VLAN tag - Wrong type match",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src),
-                             dl_type=0x800),
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src),
+                             eth_type=0x800),
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.Dot1Q(prio=5, vlan=1000)/ \
                 scapy.Dot1Q(prio=3, vlan=1005)/ \
                 scapy.IP(),
             self.RESULT_NOMATCH
         )
         testPacket("Ether matching with double VLAN tag - Type match",
-            self.createMatch(dl_dst=parse_mac(dl_dst), dl_src=parse_mac(dl_src),
-                             dl_type=0x8100),
-            scapy.Ether(dst=dl_dst, src=dl_src)/ \
+            self.createMatch(eth_dst=parse_mac(eth_dst), eth_src=parse_mac(eth_src),
+                             eth_type=0x8100),
+            scapy.Ether(dst=eth_dst, src=eth_src)/ \
                 scapy.Dot1Q(prio=5, vlan=1000)/ \
                 scapy.Dot1Q(prio=3, vlan=1005)/ \
                 scapy.IP(),
diff --git a/tests/port_stats.py b/tests/port_stats.py
index 5e0648f..7fac164 100644
--- a/tests/port_stats.py
+++ b/tests/port_stats.py
@@ -11,10 +11,8 @@
 
 from oftest import config
 import oftest.controller as controller
-import oftest.cstruct as ofp
-import oftest.message as message
+import ofp
 import oftest.dataplane as dataplane
-import oftest.action as action
 import oftest.parse as parse
 import oftest.base_tests as base_tests
 
@@ -62,16 +60,16 @@
                     'Response packet does not match send packet')
 
 def getStats(obj, port):
-    stat_req = message.port_stats_request()
+    stat_req = ofp.message.port_stats_request()
     stat_req.port_no = port
 
     logging.info("Sending stats request")
     response, pkt = obj.controller.transact(stat_req, timeout=2)
     obj.assertTrue(response is not None, 
                     "No response to stats request")
-    obj.assertTrue(len(response.stats) == 1,
+    obj.assertTrue(len(response.entries) == 1,
                     "Did not receive port stats reply")
-    for item in response.stats:
+    for item in response.entries:
         logging.info("Sent " + str(item.tx_packets) + " packets")
         packet_sent = item.tx_packets
         packet_recv = item.rx_packets
@@ -79,22 +77,22 @@
     return packet_sent, packet_recv
 
 def getAllStats(obj):
-    stat_req = message.port_stats_request()
+    stat_req = ofp.message.port_stats_request()
     stat_req.port_no = ofp.OFPP_NONE
 
     logging.info("Sending all port stats request")
     response, pkt = obj.controller.transact(stat_req, timeout=2)
     obj.assertTrue(response is not None, 
                     "No response to stats request")
-    obj.assertTrue(len(response.stats) >= 3,
+    obj.assertTrue(len(response.entries) >= 3,
                     "Did not receive all port stats reply")
     stats = {}
-    for item in response.stats:
+    for item in response.entries:
         stats[ item.port_no ] = ( item.tx_packets, item.rx_packets )
     return stats
 
 def verifyStats(obj, port, test_timeout, packet_sent, packet_recv):
-    stat_req = message.port_stats_request()
+    stat_req = ofp.message.port_stats_request()
     stat_req.port_no = port
 
     all_packets_received = 0
@@ -106,9 +104,9 @@
                                                 timeout=test_timeout)
         obj.assertTrue(response is not None, 
                        "No response to stats request")
-        obj.assertTrue(len(response.stats) == 1,
+        obj.assertTrue(len(response.entries) == 1,
                        "Did not receive port stats reply")
-        for item in response.stats:
+        for item in response.entries:
             sent = item.tx_packets
             recv = item.rx_packets
             logging.info("Sent " + str(item.tx_packets) + " packets")
@@ -157,7 +155,7 @@
         match.wildcards &= ~ofp.OFPFW_IN_PORT
         self.assertTrue(match is not None, 
                         "Could not generate flow match from pkt")
-        act = action.action_output()
+        act = ofp.action.output()
 
         # build flow
         ingress_port = of_ports[0];
@@ -165,14 +163,14 @@
         logging.info("Ingress " + str(ingress_port) + 
                        " to egress " + str(egress_port))
         match.in_port = ingress_port
-        flow_mod_msg = message.flow_mod()
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.match = match
         flow_mod_msg.cookie = random.randint(0,9007199254740992)
         flow_mod_msg.buffer_id = 0xffffffff
         flow_mod_msg.idle_timeout = 0
         flow_mod_msg.hard_timeout = 0
         act.port = egress_port
-        flow_mod_msg.actions.add(act)
+        flow_mod_msg.actions.append(act)
        
         # send flow
         logging.info("Inserting flow")
@@ -210,15 +208,15 @@
                         "Could not generate flow match from pkt")
         match.in_port = ingress_port
         
-        flow_mod_msg = message.flow_mod()
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.match = match
         flow_mod_msg.cookie = random.randint(0,9007199254740992)
         flow_mod_msg.buffer_id = 0xffffffff
         flow_mod_msg.idle_timeout = 0
         flow_mod_msg.hard_timeout = 0
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = egress_port
-        flow_mod_msg.actions.add(act)
+        flow_mod_msg.actions.append(act)
 
         logging.info("Ingress " + str(ingress_port) + 
                        " to egress " + str(egress_port))
@@ -241,7 +239,7 @@
         pkt1 = simple_tcp_packet()
         flow_mod_msg1 = self.buildFlowModMsg(pkt1, ingress_port, egress_port1)
        
-        pkt2 = simple_tcp_packet(dl_src='0:7:7:7:7:7')
+        pkt2 = simple_tcp_packet(eth_src='0:7:7:7:7:7')
         flow_mod_msg2 = self.buildFlowModMsg(pkt2, ingress_port, egress_port2)
        
         logging.info("Inserting flow1")
@@ -287,15 +285,15 @@
                         "Could not generate flow match from pkt")
         match.in_port = ingress_port
         
-        flow_mod_msg = message.flow_mod()
+        flow_mod_msg = ofp.message.flow_add()
         flow_mod_msg.match = match
         flow_mod_msg.cookie = random.randint(0,9007199254740992)
         flow_mod_msg.buffer_id = 0xffffffff
         flow_mod_msg.idle_timeout = 0
         flow_mod_msg.hard_timeout = 0
-        act = action.action_output()
+        act = ofp.action.output()
         act.port = egress_port
-        flow_mod_msg.actions.add(act)
+        flow_mod_msg.actions.append(act)
 
         logging.info("Ingress " + str(ingress_port) + 
                        " to egress " + str(egress_port))
@@ -317,7 +315,7 @@
         pkt1 = simple_tcp_packet()
         flow_mod_msg1 = self.buildFlowModMsg(pkt1, port0, port1)
        
-        pkt2 = simple_tcp_packet(dl_src='0:7:7:7:7:7')
+        pkt2 = simple_tcp_packet(eth_src='0:7:7:7:7:7')
         flow_mod_msg2 = self.buildFlowModMsg(pkt2, port0, port2)
        
         logging.info("Inserting flow1")
diff --git a/tools/munger/Makefile b/tools/munger/Makefile
deleted file mode 100644
index c6cc8f1..0000000
--- a/tools/munger/Makefile
+++ /dev/null
@@ -1,97 +0,0 @@
-#
-# Simple make file to generate OpenFlow python files
-#
-# Fixme:  Would like pylibopenflow to be able to run remotely
-# Currently, we have to cd to it's dir and refer back to local
-
-TOP_DIR = ../..
-TOOLS_DIR = ..
-DOC_DIR = ${TOP_DIR}/doc
-TESTS_DIR = ${TOP_DIR}/tests
-
-PYLIBOF_DIR = ${TOOLS_DIR}/pylibopenflow
-
-TARGET_DIR = ${TOP_DIR}/src/python/of10
-
-# Relative to pyopenflow-pythonize exec location
-OF_HEADER = include/openflow.h
-
-# Relative to here
-ABS_OF_HEADER = ${PYLIBOF_DIR}/${OF_HEADER}
-
-PYTHONIZE = bin/pyopenflow-pythonize.py
-CSTRUCT_GEN_CMD = (cd ${PYLIBOF_DIR} && ${PYTHONIZE} -i ${OF_HEADER} \
-	${TARGET_DIR}/cstruct.py)
-CSTRUCT_AUX_INFO = ${TARGET_DIR}/class_maps.py
-
-# Dependencies for cstruct.py
-CSTRUCT_DEP = ${ABS_OF_HEADER} $(wildcard ${PYLIBOF_DIR}/pylib/*.py)
-CSTRUCT_DEP += $(wildcard ${PYLIBOF_DIR}/pylib/of/*.py) 
-
-# Generated and other files
-GEN_FILES := $(addprefix ${TARGET_DIR}/,cstruct.py message.py error.py \
-	action.py)
-# class_maps is generated as a side effect of cstruct....
-OTHER_FILES :=  $(addprefix ${TARGET_DIR}/,action_list.py parse.py \
-	controller.py dataplane.py class_maps.py)
-LINT_SOURCE := ${GEN_FILES} ${OTHER_FILES}
-LINT_FILES := $(subst .py,.log,${LINT_SOURCE})
-LINT_FILES := $(subst ${TARGET_DIR}/,lint/,${LINT_FILES})
-
-all: ${GEN_FILES}
-
-install: all
-
-# The core OpenFlow libraries generated from openflow.h
-${TARGET_DIR}/cstruct.py: ${CSTRUCT_DEP}
-	${CSTRUCT_GEN_CMD} > ${CSTRUCT_AUX_INFO}
-
-# General rule like src/message.py comes from scripts/message_gen.py
-${TARGET_DIR}/%.py: scripts/%_gen.py ${TARGET_DIR}/cstruct.py
-	python $< > $@
-
-# The pylint files
-lint/%.log: ${TARGET_DIR}/%.py
-	mkdir -p lint
-	(cd ${TARGET_DIR} && pylint -e $(notdir $<)) > $@
-
-# Note that lint has issues with scapy syntax
-lint: ${LINT_FILES}
-
-${TESTS_DIR}/oft.py:
-	ln -s oft $@
-
-# For now. just local source doc generated
-doc: ${GEN_FILES} ${OTHER_FILES} ${DOC_DIR}/Doxyfile ${TESTS_DIR}/oft.py
-	(cd ${DOC_DIR} && doxygen)
-
-clean:
-	rm -rf ${GEN_FILES} ${LINT_FILES} ${DOC_DIR}/html/*
-
-test: all
-	(cd tests && python msg_test.py) > tests/msg_test.log
-
-help:
-	@echo
-	@echo "Makefile for oftest source munger"
-	@echo "    Default builds python files and installs in ${TARGET_DIR}"
-	@echo "    make local:  Generate files and put in src/"
-	@echo
-	@echo "Targets:"
-	@echo "   all:     Puts generated .py in ${TARGET_DIR}"
-	@echo "   lint:    Puts error report in lint/*.log"
-	@echo "   doc:     Runs doxygen on generated files in ../../doc"
-	@echo "   clean:   Removes generated files"
-	@echo
-	@echo "Debug info:"
-	@echo
-	@echo "Files generated GEN_FILES:  ${GEN_FILES}"
-	@echo
-	@echo "Dependencies for cstruct.py CSTRUCT_DEP:  ${CSTRUCT_DEP}"
-	@echo
-	@echo "Already created files OTHER_FILES:  ${OTHER_FILES}"
-	@echo
-	@echo "LINT_FILES:  ${LINT_FILES}"
-
-
-.PHONY: all local install help doc lint clean test
diff --git a/tools/munger/scripts/action_gen.py b/tools/munger/scripts/action_gen.py
deleted file mode 100644
index e4f2350..0000000
--- a/tools/munger/scripts/action_gen.py
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/python
-#
-# This python script generates action subclasses
-#
-
-import re
-import sys
-sys.path.append("../../src/python/of10")
-from cstruct import *
-from class_maps import class_to_members_map
-
-print """
-# Python OpenFlow action wrapper classes
-
-from cstruct import *
-
-"""
-
-################################################################
-#
-# Action subclasses
-#
-################################################################
-
-action_structs = [
-    'output',
-    'vlan_vid',
-    'vlan_pcp',
-    'dl_addr',
-    'nw_addr',
-    'tp_port',
-    'nw_tos',
-    'vendor_header']
-
-action_types = [
-    'output',
-    'set_vlan_vid',
-    'set_vlan_pcp',
-    'strip_vlan',
-    'set_dl_src',
-    'set_dl_dst',
-    'set_nw_src',
-    'set_nw_dst',
-    'set_nw_tos',
-    'set_tp_src',
-    'set_tp_dst',
-    'enqueue',
-    'vendor'
-]
-action_types.sort()
-
-action_class_map = {
-    'output' : 'ofp_action_output',
-    'set_vlan_vid' : 'ofp_action_vlan_vid',
-    'set_vlan_pcp' : 'ofp_action_vlan_pcp',
-    'strip_vlan' : 'ofp_action_header',
-    'set_dl_src' : 'ofp_action_dl_addr',
-    'set_dl_dst' : 'ofp_action_dl_addr',
-    'set_nw_src' : 'ofp_action_nw_addr',
-    'set_nw_dst' : 'ofp_action_nw_addr',
-    'set_nw_tos' : 'ofp_action_nw_tos',
-    'set_tp_src' : 'ofp_action_tp_port',
-    'set_tp_dst' : 'ofp_action_tp_port',
-    'enqueue' : 'ofp_action_enqueue',
-    'vendor' : 'ofp_action_vendor_header'
-}
-
-template = """
-class --TYPE--(--PARENT_TYPE--):
-    \"""
-    Wrapper class for --TYPE-- action object
-
-    --DOC_INFO--
-    \"""
-    def __init__(self, **kwargs):
-        --PARENT_TYPE--.__init__(self)
-        self.type = --ACTION_NAME--
-        self.len = self.__len__()
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-    def show(self, prefix=''):
-        outstr = prefix + "action_--TYPE--\\n"
-        outstr += --PARENT_TYPE--.show(self, prefix)
-        return outstr
-
-action_--TYPE-- = --TYPE-- # for backwards compatibility
-"""
-
-if __name__ == '__main__':
-    for (t, parent) in action_class_map.items():
-        if not parent in class_to_members_map.keys():
-            doc_info = "Unknown parent action class: " + parent
-        else:
-            doc_info = "Data members inherited from " + parent + ":\n"
-            for var in class_to_members_map[parent]:
-                doc_info += "    @arg " + var + "\n"
-        action_name = "OFPAT_" + t.upper()
-        to_print = re.sub('--TYPE--', t, template)
-        to_print = re.sub('--PARENT_TYPE--', parent, to_print)
-        to_print = re.sub('--ACTION_NAME--', action_name, to_print)
-        to_print = re.sub('--DOC_INFO--', doc_info, to_print)
-        print to_print
-
-    # Generate a list of action classes
-    print "action_class_list = ("
-    prev = None
-    for (t, parent) in action_class_map.items():
-        if prev:
-            print "    action_" + prev + ","
-        prev = t
-    print "    action_" + prev + ")"
diff --git a/tools/munger/scripts/error_gen.py b/tools/munger/scripts/error_gen.py
deleted file mode 100644
index b1f360e..0000000
--- a/tools/munger/scripts/error_gen.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/python
-#
-# This python script generates error subclasses
-#
-
-import re
-import sys
-sys.path.append("../../src/python/of10")
-from cstruct import *
-from class_maps import class_to_members_map
-
-print """
-# Python OpenFlow error wrapper classes
-
-from cstruct import *
-
-"""
-
-################################################################
-#
-# Error message subclasses
-#
-################################################################
-
-# Template for error subclasses
-
-template = """
-class --TYPE--_error_msg(ofp_error_msg):
-    \"""
-    Wrapper class for --TYPE-- error message class
-
-    Data members inherited from ofp_error_msg:
-    @arg type
-    @arg code
-    @arg data: Binary string following message members
-    
-    \"""
-    def __init__(self):
-        ofp_error_msg.__init__(self)
-        self.header = ofp_header()
-        self.header.type = OFPT_ERROR
-        self.type = --ERROR_NAME--
-        self.data = ""
-
-    def pack(self, assertstruct=True):
-        self.header.length = self.__len__()
-        packed = self.header.pack()
-        packed += ofp_error_msg.pack(self)
-        packed += self.data
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_error_msg.unpack(self, binary_string)
-        self.data = binary_string
-        return ""
-
-    def __len__(self):
-        return OFP_HEADER_BYTES + OFP_ERROR_MSG_BYTES + len(self.data)
-
-    def show(self, prefix=''):
-        outstr = prefix + "--TYPE--_error_msg\\m"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_error_msg.show(self, prefix + '  ')
-        outstr += prefix + "data is of length " + str(len(self.data)) + '\\n'
-        ##@todo Consider trying to parse the string
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_error_msg.__eq__(self, other) and
-                self.data == other.data)
-
-    def __ne__(self, other): return not self.__eq__(other)
-"""
-
-error_types = [
-    'hello_failed',
-    'bad_request',
-    'bad_action',
-    'flow_mod_failed',
-    'port_mod_failed',
-    'queue_op_failed']
-
-for t in error_types:
-    error_name = "OFPET_" + t.upper()
-    to_print = re.sub('--TYPE--', t, template)
-    to_print = re.sub('--ERROR_NAME--', error_name, to_print)
-    print to_print
diff --git a/tools/munger/scripts/message_gen.py b/tools/munger/scripts/message_gen.py
deleted file mode 100644
index ff535f7..0000000
--- a/tools/munger/scripts/message_gen.py
+++ /dev/null
@@ -1,817 +0,0 @@
-#!/usr/bin/python
-#
-# This python script generates wrapper functions for OpenFlow messages
-#
-# See the doc string below for more info
-#
-
-# To do:
-#    Default type values for messages
-#    Generate all message objects
-#    Action list objects?
-#    Autogen lengths when possible
-#    Dictionaries for enum strings
-#    Resolve sub struct initializers (see ofp_flow_mod)
-
-
-"""
-Generate wrapper classes for OpenFlow messages
-
-(C) Copyright Stanford University
-Date February 2010
-Created by dtalayco
-
-Attempting to follow http://www.python.org/dev/peps/pep-0008/
-The main exception is that our class names do not use CamelCase
-so as to more closely match the original C code names.
-
-This file is meant to generate a file of_wrapper.py which imports
-the base classes generated form automatic processing of openflow.h
-and produces wrapper classes for each OpenFlow message type.
-
-This file will normally be included in of_message.py which provides
-additional hand-generated work.
-
-There are two types of structures/classes here: base components and
-message classes.
-
-Base components are the base data classes which are fixed
-length structures including:
-    ofp_header
-    Each ofp_action structure
-    ofp_phy_port
-    The array elements of all the stats reply messages
-The base components are to be imported from a file of_header.py.
-
-Message classes define a complete message on the wire.  These are
-comprised of possibly variable length lists of possibly variably
-typed objects from the base component list above.
-
-Each OpenFlow message has a header and zero or more fixed length
-members (the "core members" of the class) followed by zero or more
-variable length lists.
-
-The wrapper classes should live in their own name space, probably
-of_message.  Automatically generated base component and skeletons for
-the message classes are assumed generated and the wrapper classes
-will inherit from those.
-
-Every message class must implement pack and unpack functions to
-convert between the class and a string representing what goes on the
-wire.
-
-For unpacking, the low level (base-component) classes must implement
-their own unpack functions.  A single top level unpack function
-will do the parsing and call the lower layer unpack functions as
-appropriate.
-
-Every base and message class should implement a show function to
-(recursively) display the contents of the object.
-
-Certain OpenFlow message types are further subclassed.  These include
-stats_request, stats_reply and error.
-
-"""
-
-# Don't generate header object in messages
-# Map each message to a body that doesn't include the header
-# The body has does not include variable length info at the end
-
-import re
-import string
-import sys
-sys.path.append("../../src/python/of10")
-from cstruct import *
-from class_maps import class_to_members_map
-
-message_top_matter = """
-# Python OpenFlow message wrapper classes
-
-from cstruct import *
-from action_list import action_list
-from error import *
-
-# Define templates for documentation
-class ofp_template_msg:
-    \"""
-    Sample base class for template_msg; normally auto generated
-    This class should live in the of_header name space and provides the
-    base class for this type of message.  It will be wrapped for the
-    high level API.
-
-    \"""
-    def __init__(self):
-        \"""
-        Constructor for base class
-
-        \"""
-        self.header = ofp_header()
-        # Additional base data members declared here
-
-    # Normally will define pack, unpack, __len__ functions
-
-class template_msg(ofp_template_msg):
-    \"""
-    Sample class wrapper for template_msg
-    This class should live in the of_message name space and provides the
-    high level API for an OpenFlow message object.  These objects must
-    implement the functions indicated in this template.
-
-    \"""
-    def __init__(self):
-        \"""
-        Constructor
-        Must set the header type value appropriately for the message
-
-        \"""
-
-        ##@var header
-        # OpenFlow message header: length, version, xid, type
-        ofp_template_msg.__init__(self)
-        self.header = ofp_header()
-        # For a real message, will be set to an integer
-        self.header.type = "TEMPLATE_MSG_VALUE"
-    def pack(self):
-        \"""
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        \"""
-        pass
-    def unpack(self, binary_string):
-        \"""
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-
-        @return Typically returns the remainder of binary_string that
-        was not parsed.  May give a warning if that string is non-empty
-
-        \"""
-        pass
-    def __len__(self):
-        \"""
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        \"""
-        pass
-    def show(self, prefix=''):
-        \"""
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        \"""
-        pass
-    def __eq__(self, other):
-        \"""
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        \"""
-        pass
-    def __ne__(self, other):
-        \"""
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        \"""
-        pass
-"""
-
-# Dictionary mapping wrapped classes to the auto-generated structure
-# underlieing the class (body only, not header or var-length data)
-message_class_map = {
-    "hello"                         : "ofp_header",
-    "error"                         : "ofp_error_msg",
-    "echo_request"                  : "ofp_header",
-    "echo_reply"                    : "ofp_header",
-    "vendor"                        : "ofp_vendor_header",
-    "features_request"              : "ofp_header",
-    "features_reply"                : "ofp_switch_features",
-    "get_config_request"            : "ofp_header",
-    "get_config_reply"              : "ofp_switch_config",
-    "set_config"                    : "ofp_switch_config",
-    "packet_in"                     : "ofp_packet_in",
-    "flow_removed"                  : "ofp_flow_removed",
-    "port_status"                   : "ofp_port_status",
-    "packet_out"                    : "ofp_packet_out",
-    "flow_mod"                      : "ofp_flow_mod",
-    "port_mod"                      : "ofp_port_mod",
-    "stats_request"                 : "ofp_stats_request",
-    "stats_reply"                   : "ofp_stats_reply",
-    "barrier_request"               : "ofp_header",
-    "barrier_reply"                 : "ofp_header",
-    "queue_get_config_request"      : "ofp_queue_get_config_request",
-    "queue_get_config_reply"        : "ofp_queue_get_config_reply"
-}
-
-# These messages have a string member at the end of the data
-string_members = [
-    "hello",
-    "error",
-    "echo_request",
-    "echo_reply",
-    "vendor",
-    "packet_in",
-    "packet_out"
-]
-
-# These messages have a list (with the given name) in the data,
-# after the core members; the type is given for validation
-list_members = {
-    "features_reply"                : ('ports', None),
-    "packet_out"                    : ('actions', 'action_list'),
-    "flow_mod"                      : ('actions', 'action_list'),
-    "queue_get_config_reply"        : ('queues', None)
-}
-
-_ind = "    "
-
-def _p1(s): print _ind + s
-def _p2(s): print _ind * 2 + s
-def _p3(s): print _ind * 3 + s
-def _p4(s): print _ind * 4 + s
-
-# Okay, this gets kind of ugly:
-# There are three variables:  
-# has_core_members:  If parent class is not ofp_header, has inheritance
-# has_list: Whether class has trailing array or class
-# has_string: Whether class has trailing string
-
-def gen_message_wrapper(msg):
-    """
-    Generate a wrapper for the given message based on above info
-    @param msg String identifying the message name for the class
-    """
-
-    msg_name = "OFPT_" + msg.upper()
-    parent = message_class_map[msg]
-
-    has_list = False    # Has trailing list
-    has_core_members = False
-    has_string = False  # Has trailing string
-    if parent != 'ofp_header':
-        has_core_members = True
-    if msg in list_members.keys():
-        (list_var, list_type) = list_members[msg]
-        has_list = True
-    if msg in string_members:
-        has_string = True
-
-    if has_core_members:
-        print "class " + msg + "(" + parent + "):"
-    else:
-        print "class " + msg + ":"
-    _p1('"""')
-    _p1("Wrapper class for " + msg)
-    print
-    _p1("OpenFlow message header: length, version, xid, type")
-    _p1("@arg length: The total length of the message")
-    _p1("@arg version: The OpenFlow version (" + str(OFP_VERSION) + ")")
-    _p1("@arg xid: The transaction ID")
-    _p1("@arg type: The message type (" + msg_name + "=" + 
-        str(eval(msg_name)) + ")")
-    print
-    if has_core_members and parent in class_to_members_map.keys():
-        _p1("Data members inherited from " + parent + ":")
-        for var in class_to_members_map[parent]:
-            _p1("@arg " + var)
-    if has_list:
-        if list_type == None:
-            _p1("@arg " + list_var + ": Variable length array of TBD")
-        else:
-            _p1("@arg " + list_var + ": Object of type " + list_type);
-    if has_string:
-        _p1("@arg data: Binary string following message members")
-    print
-    _p1('"""')
-
-    print
-    _p1("def __init__(self, **kwargs):")
-    if has_core_members:
-        _p2(parent + ".__init__(self)")
-    _p2("self.header = ofp_header()")
-    _p2("self.header.type = " + msg_name)
-    if has_list:
-        _p2('self.' + list_var + ' = []')
-    if has_string:
-        _p2('self.data = ""')
-    _p2('for (k, v) in kwargs.items():')
-    _p3('if hasattr(self, k):')
-    _p4('setattr(self, k, v)')
-    _p3('else:')
-    _p4('raise NameError("field %s does not exist in %s" % (k, self.__class__))')
-    if has_list and list_type != None:
-        _p2('# Coerce keyword arg into list type')
-        _p2('self.%(list_var)s = %(list_type)s(self.%(list_var)s)' % dict(list_type=list_type, list_var=list_var))
-
-    print """
-
-    def pack(self):
-        \"""
-        Pack object into string
-
-        @return The packed string which can go on the wire
-
-        \"""
-        self.header.length = len(self)
-        packed = self.header.pack()
-"""
-
-    # Have to special case the action length calculation for pkt out
-    if msg == 'packet_out':
-        _p2('self.actions_len = len(self.actions)')
-    if has_core_members:
-        _p2("packed += " + parent + ".pack(self)")
-    if has_list:
-        if list_type == None:
-            _p2('for obj in self.' + list_var + ':')
-            _p3('packed += obj.pack()')
-        else:
-            _p2('packed += self.' + list_var + '.pack()')
-    if has_string:
-        _p2('packed += self.data')
-    _p2("return packed")
-
-    print """
-    def unpack(self, binary_string):
-        \"""
-        Unpack object from a binary string
-
-        @param binary_string The wire protocol byte string holding the object
-        represented as an array of bytes.
-        @return The remainder of binary_string that was not parsed.
-
-        \"""
-        binary_string = self.header.unpack(binary_string)
-"""
-    if has_core_members:
-        _p2("binary_string = " + parent + ".unpack(self, binary_string)")
-    if has_list:
-        if msg == "features_reply":  # Special case port parsing
-            # For now, cheat and assume the rest of the message is port list
-            _p2("while len(binary_string) >= OFP_PHY_PORT_BYTES:")
-            _p3("new_port = ofp_phy_port()")
-            _p3("binary_string = new_port.unpack(binary_string)")
-            _p3("self.ports.append(new_port)")
-        elif list_type == None:
-            _p2("for obj in self." + list_var + ":")
-            _p3("binary_string = obj.unpack(binary_string)")
-        elif msg == "packet_out":  # Special case this
-            _p2('binary_string = self.actions.unpack(' + 
-                'binary_string, bytes=self.actions_len)')
-        elif msg == "flow_mod":  # Special case this
-            _p2("ai_len = self.header.length - (OFP_FLOW_MOD_BYTES + " + 
-                "OFP_HEADER_BYTES)")
-            _p2("binary_string = self.actions.unpack(binary_string, " +
-                "bytes=ai_len)")
-        else:
-            _p2("binary_string = self." + list_var + ".unpack(binary_string)")
-    if has_string:
-        _p2("self.data = binary_string")
-        _p2("binary_string = ''")
-    else:
-        _p2("# Fixme: If no self.data, add check for data remaining")
-    _p2("return binary_string")
-
-    print """
-    def __len__(self):
-        \"""
-        Return the length of this object once packed into a string
-
-        @return An integer representing the number bytes in the packed
-        string.
-
-        \"""
-        length = OFP_HEADER_BYTES
-"""
-    if has_core_members:
-        _p2("length += " + parent + ".__len__(self)")
-    if has_list:
-        if list_type == None:
-            _p2("for obj in self." + list_var + ":")
-            _p3("length += len(obj)")
-        else:
-            _p2("length += len(self." + list_var + ")")
-    if has_string:
-        _p2("length += len(self.data)")
-    _p2("return length")
-
-    print """
-    def show(self, prefix=''):
-        \"""
-        Generate a string (with multiple lines) describing the contents
-        of the object in a readable manner
-
-        @param prefix Pre-pended at the beginning of each line.
-
-        \"""
-"""
-    _p2("outstr = prefix + '" + msg + " (" + msg_name + ")\\n'")
-    _p2("prefix += '  '")
-    _p2("outstr += prefix + 'ofp header\\n'")
-    _p2("outstr += self.header.show(prefix + '  ')")
-    if has_core_members:
-        _p2("outstr += " + parent + ".show(self, prefix)")
-    if has_list:
-        if list_type == None:
-            _p2('outstr += prefix + "Array ' + list_var + '\\n"')
-            _p2('for obj in self.' + list_var +':')
-            _p3("outstr += obj.show(prefix + '  ')")
-        else:
-            _p2('outstr += prefix + "List ' + list_var + '\\n"')
-            _p2('outstr += self.' + list_var + ".show(prefix + '  ')")
-    if has_string:
-        _p2("outstr += prefix + 'data is of length ' + str(len(self.data)) + '\\n'")
-        _p2("##@todo Fix this circular reference")
-        _p2("# if len(self.data) > 0:")
-        _p3("# obj = of_message_parse(self.data)")
-        _p3("# if obj != None:")
-        _p4("# outstr += obj.show(prefix)")
-        _p3("# else:")
-        _p4('# outstr += prefix + "Unable to parse data\\n"')
-    _p2('return outstr')
-
-    print """
-    def __eq__(self, other):
-        \"""
-        Return True if self and other hold the same data
-
-        @param other Other object in comparison
-
-        \"""
-        if type(self) != type(other): return False
-        if not self.header.__eq__(other.header): return False
-"""
-    if has_core_members:
-        _p2("if not " + parent + ".__eq__(self, other): return False")
-    if has_string:
-        _p2("if self.data != other.data: return False")
-    if has_list:
-        _p2("if self." + list_var + " != other." + list_var + ": return False")
-    _p2("return True")
-
-    print """
-    def __ne__(self, other):
-        \"""
-        Return True if self and other do not hold the same data
-
-        @param other Other object in comparison
-
-        \"""
-        return not self.__eq__(other)
-    """
-
-
-################################################################
-#
-# Stats request subclasses
-# description_request, flow, aggregate, table, port, vendor
-#
-################################################################
-
-# table and desc stats requests are special with empty body
-extra_ofp_stats_req_defs = """
-# Stats request bodies for desc and table stats are not defined in the
-# OpenFlow header;  We define them here.  They are empty classes, really
-
-class ofp_desc_stats_request:
-    \"""
-    Forced definition of ofp_desc_stats_request (empty class)
-    \"""
-    def __init__(self):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_desc_stats_request (empty)\\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_DESC_STATS_REQUEST_BYTES = 0
-
-class ofp_table_stats_request:
-    \"""
-    Forced definition of ofp_table_stats_request (empty class)
-    \"""
-    def __init__(self):
-        pass
-    def pack(self, assertstruct=True):
-        return ""
-    def unpack(self, binary_string):
-        return binary_string
-    def __len__(self):
-        return 0
-    def show(self, prefix=''):
-        return prefix + "ofp_table_stats_request (empty)\\n"
-    def __eq__(self, other):
-        return type(self) == type(other)
-    def __ne__(self, other):
-        return type(self) != type(other)
-
-OFP_TABLE_STATS_REQUEST_BYTES = 0
-
-"""
-
-stats_request_template = """
-class --TYPE--_stats_request(ofp_stats_request, ofp_--TYPE--_stats_request):
-    \"""
-    Wrapper class for --TYPE-- stats request message
-    \"""
-    def __init__(self, **kwargs):
-        self.header = ofp_header()
-        ofp_stats_request.__init__(self)
-        ofp_--TYPE--_stats_request.__init__(self)
-        self.header.type = OFPT_STATS_REQUEST
-        self.type = --STATS_NAME--
-        for (k, v) in kwargs.items():
-            if hasattr(self, k):
-                setattr(self, k, v)
-            else:
-                raise NameError("field %s does not exist in %s" % (k, self.__class__))
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_request.pack(self)
-        packed += ofp_--TYPE--_stats_request.pack(self)
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_request.unpack(self, binary_string)
-        binary_string = ofp_--TYPE--_stats_request.unpack(self, binary_string)
-        if len(binary_string) != 0:
-            print "ERROR unpacking --TYPE--: extra data"
-        return binary_string
-
-    def __len__(self):
-        return len(self.header) + OFP_STATS_REQUEST_BYTES + \\
-               OFP_--TYPE_UPPER--_STATS_REQUEST_BYTES
-
-    def show(self, prefix=''):
-        outstr = prefix + "--TYPE--_stats_request\\n"
-        outstr += prefix + "ofp header:\\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_request.show(self)
-        outstr += ofp_--TYPE--_stats_request.show(self)
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_request.__eq__(self, other) and
-                ofp_--TYPE--_stats_request.__eq__(self, other))
-
-    def __ne__(self, other): return not self.__eq__(other)
-"""
-
-################################################################
-#
-# Stats replies always have an array at the end.
-# For aggregate and desc, these arrays are always of length 1
-# This array is always called stats
-#
-################################################################
-
-
-# Template for objects stats reply messages
-stats_reply_template = """
-class --TYPE--_stats_reply(ofp_stats_reply):
-    \"""
-    Wrapper class for --TYPE-- stats reply
-    \"""
-    def __init__(self):
-        self.header = ofp_header()
-        ofp_stats_reply.__init__(self)
-        self.header.type = OFPT_STATS_REPLY
-        self.type = --STATS_NAME--
-        # stats: Array of type --TYPE--_stats_entry
-        self.stats = []
-
-    def pack(self, assertstruct=True):
-        self.header.length = len(self)
-        packed = self.header.pack()
-        packed += ofp_stats_reply.pack(self)
-        for obj in self.stats:
-            packed += obj.pack()
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = self.header.unpack(binary_string)
-        binary_string = ofp_stats_reply.unpack(self, binary_string)
-        dummy = --TYPE--_stats_entry()
-        while len(binary_string) >= len(dummy):
-            obj = --TYPE--_stats_entry()
-            binary_string = obj.unpack(binary_string)
-            self.stats.append(obj)
-        if len(binary_string) != 0:
-            print "ERROR unpacking --TYPE-- stats string: extra bytes"
-        return binary_string
-
-    def __len__(self):
-        length = len(self.header) + OFP_STATS_REPLY_BYTES
-        for obj in self.stats:
-            length += len(obj)
-        return length
-
-    def show(self, prefix=''):
-        outstr = prefix + "--TYPE--_stats_reply\\n"
-        outstr += prefix + "ofp header:\\n"
-        outstr += self.header.show(prefix + '  ')
-        outstr += ofp_stats_reply.show(self)
-        outstr += prefix + "Stats array of length " + str(len(self.stats)) + '\\n'
-        for obj in self.stats:
-            outstr += obj.show()
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (self.header == other.header and
-                ofp_stats_reply.__eq__(self, other) and
-                self.stats == other.stats)
-
-    def __ne__(self, other): return not self.__eq__(other)
-"""
-
-#
-# To address variations in stats reply bodies, the following
-# "_entry" classes are defined for each element in the reply
-#
-
-extra_stats_entry_defs = """
-# Stats entries define the content of one element in a stats
-# reply for the indicated type; define _entry for consistency
-
-aggregate_stats_entry = ofp_aggregate_stats_reply
-desc_stats_entry = ofp_desc_stats
-port_stats_entry = ofp_port_stats
-queue_stats_entry = ofp_queue_stats
-table_stats_entry = ofp_table_stats
-"""
-
-# Special case flow_stats to handle actions_list
-
-flow_stats_entry_def = """
-#
-# Flow stats entry contains an action list of variable length, so
-# it is done by hand
-#
-
-class flow_stats_entry(ofp_flow_stats):
-    \"""
-    Special case flow stats entry to handle action list object
-    \"""
-    def __init__(self):
-        ofp_flow_stats.__init__(self)
-        self.actions = action_list()
-
-    def pack(self, assertstruct=True):
-        self.length = len(self)
-        packed = ofp_flow_stats.pack(self, assertstruct)
-        packed += self.actions.pack()
-        if len(packed) != self.length:
-            print("ERROR: flow_stats_entry pack length not equal",
-                  self.length, len(packed))
-        return packed
-
-    def unpack(self, binary_string):
-        binary_string = ofp_flow_stats.unpack(self, binary_string)
-        ai_len = self.length - OFP_FLOW_STATS_BYTES
-        if ai_len < 0:
-            print("ERROR: flow_stats_entry unpack length too small",
-                  self.length)
-        binary_string = self.actions.unpack(binary_string, bytes=ai_len)
-        return binary_string
-
-    def __len__(self):
-        return OFP_FLOW_STATS_BYTES + len(self.actions)
-
-    def show(self, prefix=''):
-        outstr = prefix + "flow_stats_entry\\n"
-        outstr += ofp_flow_stats.show(self, prefix + '  ')
-        outstr += self.actions.show(prefix + '  ')
-        return outstr
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        return (ofp_flow_stats.__eq__(self, other) and 
-                self.actions == other.actions)
-
-    def __ne__(self, other): return not self.__eq__(other)
-"""
-
-stats_types = [
-    'aggregate',
-    'desc',
-    'flow',
-    'port',
-    'queue',
-    'table']
-
-if __name__ == '__main__':
-
-    print message_top_matter
-
-    print """
-################################################################
-#
-# OpenFlow Message Definitions
-#
-################################################################
-"""
-
-    msg_types = message_class_map.keys()
-    msg_types.sort()
-
-    for t in msg_types:
-        gen_message_wrapper(t)
-        print
-
-    print """
-################################################################
-#
-# Stats request and reply subclass definitions
-#
-################################################################
-"""
-
-    print extra_ofp_stats_req_defs
-    print extra_stats_entry_defs
-    print flow_stats_entry_def
-
-    # Generate stats request and reply subclasses
-    for t in stats_types:
-        stats_name = "OFPST_" + t.upper()
-        to_print = re.sub('--TYPE--', t, stats_request_template)
-        to_print = re.sub('--TYPE_UPPER--', t.upper(), to_print)
-        to_print = re.sub('--STATS_NAME--', stats_name, to_print)
-        print to_print
-        to_print = re.sub('--TYPE--', t, stats_reply_template)
-        to_print = re.sub('--STATS_NAME--', stats_name, to_print)
-        print to_print
-
-    # Lastly, generate a tuple containing all the message classes
-    print """
-message_type_list = (
-    aggregate_stats_reply,
-    aggregate_stats_request,
-    bad_action_error_msg,
-    bad_request_error_msg,
-    barrier_reply,
-    barrier_request,
-    desc_stats_reply,
-    desc_stats_request,
-    echo_reply,
-    echo_request,
-    features_reply,
-    features_request,
-    flow_mod,
-    flow_mod_failed_error_msg,
-    flow_removed,
-    flow_stats_reply,
-    flow_stats_request,
-    get_config_reply,
-    get_config_request,
-    hello,
-    hello_failed_error_msg,
-    packet_in,
-    packet_out,
-    port_mod,
-    port_mod_failed_error_msg,
-    port_stats_reply,
-    port_stats_request,
-    port_status,
-    queue_get_config_reply,
-    queue_get_config_request,
-    queue_op_failed_error_msg,
-    queue_stats_reply,
-    queue_stats_request,
-    set_config,
-    table_stats_reply,
-    table_stats_request,
-    vendor
-    )
-"""
-
-#
-# OFP match variants
-#  ICMP 0x801 (?) ==> icmp_type/code replace tp_src/dst
-#
-
-
diff --git a/tools/munger/tests/defs.py b/tools/munger/tests/defs.py
deleted file mode 100644
index 5cb779f..0000000
--- a/tools/munger/tests/defs.py
+++ /dev/null
@@ -1,193 +0,0 @@
-import sys
-sys.path.append('../../../src/python/oftest/protocol')
-from message import *
-from action import *
-from error import *
-from class_maps import *
-
-ofmsg_class_map_to_parents = {
-    action_enqueue                     : [ofp_action_enqueue],
-    action_output                      : [ofp_action_output],
-    action_set_dl_dst                  : [ofp_action_dl_addr],
-    action_set_dl_src                  : [ofp_action_dl_addr],
-    action_set_nw_dst                  : [ofp_action_nw_addr],
-    action_set_nw_src                  : [ofp_action_nw_addr],
-    action_set_nw_tos                  : [ofp_action_nw_tos],
-    action_set_tp_dst                  : [ofp_action_tp_port],
-    action_set_tp_src                  : [ofp_action_tp_port],
-    action_set_vlan_pcp                : [ofp_action_vlan_pcp],
-    action_set_vlan_vid                : [ofp_action_vlan_vid],
-    action_strip_vlan                  : [ofp_action_header],
-    action_vendor                      : [ofp_action_vendor_header],
-    aggregate_stats_entry              : [],
-    aggregate_stats_reply              : [ofp_stats_reply],
-    aggregate_stats_request            : [ofp_stats_request,
-                                          ofp_aggregate_stats_request],
-    bad_action_error_msg               : [ofp_error_msg],
-    bad_request_error_msg              : [ofp_error_msg],
-    barrier_reply                      : [],
-    barrier_request                    : [],
-    desc_stats_entry                   : [],
-    desc_stats_reply                   : [ofp_stats_reply],
-    desc_stats_request                 : [ofp_stats_request,
-                                          ofp_desc_stats_request],
-    echo_reply                         : [],
-    echo_request                       : [],
-    error                              : [ofp_error_msg],
-    features_reply                     : [ofp_switch_features],
-    features_request                   : [],
-    flow_mod                           : [ofp_flow_mod],
-    flow_mod_failed_error_msg          : [ofp_error_msg],
-    flow_removed                       : [ofp_flow_removed],
-    flow_stats_entry                   : [ofp_flow_stats],
-    flow_stats_reply                   : [ofp_stats_reply],
-    flow_stats_request                 : [ofp_stats_request,
-                                          ofp_flow_stats_request],
-    get_config_reply                   : [ofp_switch_config],
-    get_config_request                 : [],
-    hello                              : [],
-    hello_failed_error_msg             : [ofp_error_msg],
-    packet_in                          : [ofp_packet_in],
-    packet_out                         : [ofp_packet_out],
-    port_mod                           : [ofp_port_mod],
-    port_mod_failed_error_msg          : [ofp_error_msg],
-    port_stats_entry                   : [],
-    port_stats_reply                   : [ofp_stats_reply],
-    port_stats_request                 : [ofp_stats_request,
-                                          ofp_port_stats_request],
-    port_status                        : [ofp_port_status],
-    queue_get_config_reply             : [ofp_queue_get_config_reply],
-    queue_get_config_request           : [ofp_queue_get_config_request],
-    queue_op_failed_error_msg          : [ofp_error_msg],
-    queue_stats_entry                  : [],
-    queue_stats_reply                  : [ofp_stats_reply],
-    queue_stats_request                : [ofp_stats_request,
-                                          ofp_queue_stats_request],
-    set_config                         : [ofp_switch_config],
-    stats_reply                        : [ofp_stats_reply],
-    stats_request                      : [ofp_stats_request],
-    table_stats_entry                  : [],
-    table_stats_reply                  : [ofp_stats_reply],
-    table_stats_request                : [ofp_stats_request,
-                                          ofp_table_stats_request],
-    vendor                             : [ofp_vendor_header]
-}
-
-ofmsg_names = {
-    action_enqueue                     : 'action_enqueue',
-    action_output                      : 'action_output',
-    action_set_dl_dst                  : 'action_set_dl_dst',
-    action_set_dl_src                  : 'action_set_dl_src',
-    action_set_nw_dst                  : 'action_set_nw_dst',
-    action_set_nw_src                  : 'action_set_nw_src',
-    action_set_nw_tos                  : 'action_set_nw_tos',
-    action_set_tp_dst                  : 'action_set_tp_dst',
-    action_set_tp_src                  : 'action_set_tp_src',
-    action_set_vlan_pcp                : 'action_set_vlan_pcp',
-    action_set_vlan_vid                : 'action_set_vlan_vid',
-    action_strip_vlan                  : 'action_strip_vlan',
-    action_vendor                      : 'action_vendor',
-    aggregate_stats_entry              : 'aggregate_stats_entry',
-    aggregate_stats_reply              : 'aggregate_stats_reply',
-    aggregate_stats_request            : 'aggregate_stats_request',
-    bad_action_error_msg               : 'bad_action_error_msg',
-    bad_request_error_msg              : 'bad_request_error_msg',
-    barrier_reply                      : 'barrier_reply',
-    barrier_request                    : 'barrier_request',
-    desc_stats_entry                   : 'desc_stats_entry',
-    desc_stats_reply                   : 'desc_stats_reply',
-    desc_stats_request                 : 'desc_stats_request',
-    echo_reply                         : 'echo_reply',
-    echo_request                       : 'echo_request',
-    error                              : 'error',
-    features_reply                     : 'features_reply',
-    features_request                   : 'features_request',
-    flow_mod                           : 'flow_mod',
-    flow_mod_failed_error_msg          : 'flow_mod_failed_error_msg',
-    flow_removed                       : 'flow_removed',
-    flow_stats_entry                   : 'flow_stats_entry',
-    flow_stats_reply                   : 'flow_stats_reply',
-    flow_stats_request                 : 'flow_stats_request',
-    get_config_reply                   : 'get_config_reply',
-    get_config_request                 : 'get_config_request',
-    hello                              : 'hello',
-    hello_failed_error_msg             : 'hello_failed_error_msg',
-    ofp_desc_stats_request             : 'ofp_desc_stats_request',
-    ofp_table_stats_request            : 'ofp_table_stats_request',
-    packet_in                          : 'packet_in',
-    packet_out                         : 'packet_out',
-    port_mod                           : 'port_mod',
-    port_mod_failed_error_msg          : 'port_mod_failed_error_msg',
-    port_stats_entry                   : 'port_stats_entry',
-    port_stats_reply                   : 'port_stats_reply',
-    port_stats_request                 : 'port_stats_request',
-    port_status                        : 'port_status',
-    queue_get_config_reply             : 'queue_get_config_reply',
-    queue_get_config_request           : 'queue_get_config_request',
-    queue_op_failed_error_msg          : 'queue_op_failed_error_msg',
-    queue_stats_entry                  : 'queue_stats_entry',
-    queue_stats_reply                  : 'queue_stats_reply',
-    queue_stats_request                : 'queue_stats_request',
-    set_config                         : 'set_config',
-    stats_reply                        : 'stats_reply',
-    stats_request                      : 'stats_request',
-    table_stats_entry                  : 'table_stats_entry',
-    table_stats_reply                  : 'table_stats_reply',
-    table_stats_request                : 'table_stats_request',
-    vendor                             : 'vendor'
-}
-
-stats_entry_types = [
-    aggregate_stats_entry,
-    desc_stats_entry,
-    port_stats_entry,
-    queue_stats_entry,
-    table_stats_entry
-]
-
-##@var A list of all OpenFlow messages including subtyped messages
-of_messages = [
-    aggregate_stats_reply,
-    aggregate_stats_request,
-    bad_action_error_msg,
-    bad_request_error_msg,
-    barrier_reply,
-    barrier_request,
-    desc_stats_reply,
-    desc_stats_request,
-    echo_reply,
-    echo_request,
-    features_reply,
-    features_request,
-    flow_mod,
-    flow_mod_failed_error_msg,
-    flow_removed,
-    flow_stats_reply,
-    flow_stats_request,
-    get_config_reply,
-    get_config_request,
-    hello,
-    hello_failed_error_msg,
-    packet_in,
-    packet_out,
-    port_mod,
-    port_mod_failed_error_msg,
-    port_stats_reply,
-    port_stats_request,
-    port_status,
-    queue_get_config_reply,
-    queue_get_config_request,
-    queue_op_failed_error_msg,
-    queue_stats_reply,
-    queue_stats_request,
-    set_config,
-    table_stats_reply,
-    table_stats_request,
-    vendor
-]
-
-# header_fields = ['version', 'xid']
-# fixed_header_fields = ['type', 'length']
-
-all_objs = ofmsg_class_map_to_parents.keys()
-all_objs.sort()
diff --git a/tools/munger/tests/msg_test.py b/tools/munger/tests/msg_test.py
deleted file mode 100644
index e816cc1..0000000
--- a/tools/munger/tests/msg_test.py
+++ /dev/null
@@ -1,215 +0,0 @@
-import sys
-sys.path.append('../../../src/python/oftest')
-
-from parse import of_message_parse
-from parse import of_header_parse
-
-from defs import *
-
-def error_out(string):
-    print >> sys.stderr, string
-    print string
-
-def obj_comp(orig, new, objname, errstr=None):
-    """
-    Compare two objects
-    """
-    dump = False        
-    if not errstr:
-        errstr = "(unknown)"
-    errstr += " " + objname
-    if not new:
-        error_out("ERROR: obj comp, new is None for " + errstr)
-        dump = True
-    elif type(orig) != type(new):
-        error_out("ERROR: type mismatch for " + errstr + " ")
-        dump = True
-    elif orig != new:
-        error_out("ERROR: " + errstr + " orig != new")
-        dump = True
-    if dump:
-        print "Dump of mismatch for " + errstr
-        print "type orig " + str(type(orig))
-        print "orig length ", len(orig)
-        orig.show("  ")
-        if new:
-            print "type new" + str(type(new))
-            print "new length ", len(new)
-            new.show("  ")
-        print
-
-
-# Generate a long action list
-
-def action_list_create(n=10):
-    """
-    Create an action list
-
-    @param n The number of actions to put in the list
-
-    Cycle through the list of all actions, adding each type
-    """
-
-    al = action_list()
-    for i in range(n):
-        idx = i % len(action_class_list)
-        cls = action_class_list[idx]()
-        al.add(cls)
-    return al
-
-# Test classes with action lists
-def class_action_test():
-    """
-    Test objects that use action lists
-    """
-
-    print "Testing action lists:  flow mod, packet out, flow stats"
-    for acount in [0, 1, 5, 16, 34]:
-        print "  " + str(acount) + " actions in list"
-        obj = flow_mod()
-        obj.actions = action_list_create(acount)
-        packed = obj.pack()
-        header = of_header_parse(packed)
-        obj_check = flow_mod()
-        if obj_check.unpack(packed) != "":
-            error_out("ERROR: flow mod action list test extra " +
-                      "string on unpack")
-        obj_comp(obj, obj_check, 'flow_mod', "unpack test " + str(acount))
-        obj_check = of_message_parse(packed)
-        obj_comp(obj, obj_check, 'flow_mod', "parse test " + str(acount))
-        # obj.show()
-
-        # packet out with and without data
-        obj = packet_out()
-        obj.actions = action_list_create(acount)
-        packed = obj.pack()
-        header = of_header_parse(packed)
-        obj_check = packet_out()
-        if obj_check.unpack(packed) != "":
-            error_out("ERROR: packet out packet_out test extra " +
-                      "string on unpack")
-        obj_comp(obj, obj_check, 'packet_out', "unpack test " + str(acount))
-        obj_check = of_message_parse(packed)
-        obj_comp(obj, obj_check, 'packet_out', "parse test " + str(acount))
-        # obj.show()
-
-        obj = packet_out()
-        obj.actions = action_list_create(acount)
-        obj.data = "short test string for packet data"
-        packed = obj.pack()
-        header = of_header_parse(packed)
-        obj_check = packet_out()
-        if obj_check.unpack(packed) != "":
-            error_out("ERROR: packet out packet_out test extra " +
-                      "string on unpack")
-        obj_comp(obj, obj_check, 'packet_out', "unpack test " + str(acount))
-        obj_check = of_message_parse(packed)
-        obj_comp(obj, obj_check, 'packet_out', "parse test " + str(acount))
-        # obj.show()
-
-        # flow stats entry (not a message)
-        obj = flow_stats_entry()
-        obj.actions = action_list_create(acount)
-        packed = obj.pack()
-        obj_check = flow_stats_entry()
-        if obj_check.unpack(packed) != "":
-            error_out("ERROR: packet out flow stats test extra " +
-                      "string on unpack")
-        obj_comp(obj, obj_check, 'packet_out', "unpack test " + str(acount))
-        # obj.show()
-
-print "Generating all classes with no data init"
-print
-for cls in all_objs:
-    print "Creating class " + ofmsg_names[cls]
-    obj = cls()
-    print ofmsg_names[cls] + " length: " + str(len(obj))
-    obj.show("  ")
-    print
-
-print "End of class generation"
-print
-print
-
-print "Generating messages, packing, showing (to verify len)"
-print "and calling self unpack"
-print
-for cls in all_objs:
-    print "Pack/unpack test for class " + ofmsg_names[cls]
-    obj = cls()
-    packed = obj.pack()
-    obj_check = cls()
-    string = obj_check.unpack(packed)
-    if string != "":
-        print >> sys.stderr, "WARNING: " + ofmsg_names[cls] + \
-            ", unpack returned string " + string
-    obj_comp(obj, obj_check, ofmsg_names[cls], "pack/unpack")
-
-print "End of class pack check"
-print
-print
-
-
-print "Testing message parsing"
-print
-for cls in all_objs:
-    # Can only parse real messages
-    if not cls in of_messages:
-        print "Not testing " + ofmsg_names[cls]
-        continue
-    print "Parse test for class " + ofmsg_names[cls]
-    obj = cls()
-    packed = obj.pack()
-    header = of_header_parse(packed)
-    obj_check = of_message_parse(packed)
-    obj_comp(obj, obj_check, ofmsg_names[cls], "parse test")
-
-print "End of parse testing"
-print
-print
-
-class_action_test()
-print
-print
-
-#
-# TO DO
-#     Generate varying actions lists and attach to flow_mod,
-# packet out and flow_stats_entry objects.
-#     Generate varying lists of stats entries for replies in
-# flow_stats_reply, table_stats_reply, port_stats_reply and
-# queue_stats_reply
-#     Create and test packet-to-flow function
-
-
-f = flow_stats_reply()
-ent = flow_stats_entry()
-
-
-act = action_strip_vlan()
-alist = action_list()
-alist.add(act)
-
-act = action_set_tp_dst()
-act.tp_port = 17
-
-m = ofp_match()
-m.wildcards = OFPFW_IN_PORT + OFPFW_DL_VLAN + OFPFW_DL_SRC
-
-#
-# Need: Easy reference from action to data members
-m.in_port = 12
-m.dl_src= [1,2,3,4,5,6]
-m.dl_dst= [11,22,23,24,25,26]
-m.dl_vlan = 83
-m.dl_vlan_pcp = 1
-m.dl_type = 0x12
-m.nw_tos = 3
-m.nw_proto = 0x300
-m.nw_src = 0x232323
-m.nw_dst = 0x3232123
-m.tp_src = 32
-m.tp_dst = 2
-
-m.show()
-
diff --git a/tools/pylibopenflow/.gitignore b/tools/pylibopenflow/.gitignore
deleted file mode 100644
index 2f836aa..0000000
--- a/tools/pylibopenflow/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*~
-*.pyc
diff --git a/tools/pylibopenflow/bin/cstruct2py-get-struct.py b/tools/pylibopenflow/bin/cstruct2py-get-struct.py
deleted file mode 100755
index d78d7c8..0000000
--- a/tools/pylibopenflow/bin/cstruct2py-get-struct.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env python
-"""This script reads struct from C/C++ header file and output query
-
-Author ykk
-Date June 2009
-"""
-import sys
-import getopt
-import cheader
-import c2py
-
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> header_files... struct_name\n"+\
-          "Options:\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          "-c/--cstruct\n\tPrint C struct\n"+\
-          "-n/--name\n\tPrint names of struct\n"+\
-          "-s/--size\n\tPrint size of struct\n"+\
-          ""
-          
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "hcsn",
-                               ["help","cstruct","size","names"])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-#Check there is at least 1 input file and struct name
-if (len(args) < 2):
-    usage()
-    sys.exit(2)
-    
-#Parse options
-##Print C struct
-printc = False
-##Print names
-printname = False
-##Print size
-printsize = False
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    elif (opt in ("-s","--size")): 
-        printsize = True
-    elif (opt in ("-c","--cstruct")): 
-        printc = True
-    elif (opt in ("-n","--names")): 
-        printname = True
-    else:
-        print "Unhandled option :"+opt
-        sys.exit(1)
-
-headerfile = cheader.cheaderfile(args[:-1])
-cstruct = headerfile.structs[args[-1].strip()]
-cs2p = c2py.cstruct2py()
-pattern = cs2p.get_pattern(cstruct)
-
-#Print C struct
-if (printc):
-    print cstruct
-
-#Print pattern
-print "Python pattern = "+pattern
-
-#Print name
-if (printname):
-    print cstruct.get_names()
-
-#Print size
-if (printsize):
-    print "Size = "+str(cs2p.get_size(pattern))
diff --git a/tools/pylibopenflow/bin/cstruct2py-pythonize.py b/tools/pylibopenflow/bin/cstruct2py-pythonize.py
deleted file mode 100755
index 39508cf..0000000
--- a/tools/pylibopenflow/bin/cstruct2py-pythonize.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env python
-"""This script reads struct
-
-Author ykk
-Date Jan 2010
-"""
-import sys
-import getopt
-import cpythonize
-import cheader
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> header_files... output_file\n"+\
-          "Options:\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          ""
-
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "h",
-                               ["help"])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-   
-#Parse options
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    else:
-        print "Unhandled option :"+opt
-        sys.exit(2)
-
-#Check there is at least 1 input file with 1 output file
-if (len(args) < 2):
-    usage()
-    sys.exit(2)
-
-ch = cheader.cheaderfile(args[:-1])
-py = cpythonize.pythonizer(ch)
-fileRef = open(args[len(args)-1], "w")
-for l in py.pycode():
-    fileRef.write(l+"\n")
-fileRef.close()
-
diff --git a/tools/pylibopenflow/bin/cstruct2py-query-cheader.py b/tools/pylibopenflow/bin/cstruct2py-query-cheader.py
deleted file mode 100755
index ed82316..0000000
--- a/tools/pylibopenflow/bin/cstruct2py-query-cheader.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python
-"""This script reads C/C++ header file and output query
-
-Author ykk
-Date June 2009
-"""
-import sys
-import getopt
-import cheader
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> header_file_1 header_file_2 ...\n"+\
-          "Options:\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          "-E/--enums\n\tPrint all enumerations\n"+\
-          "-e/--enum\n\tPrint specified enumeration\n"+\
-          "-M/--macros\n\tPrint all macros\n"+\
-          "-m/--macro\n\tPrint value of macro\n"+\
-          "-S/--structs\n\tPrint all structs\n"+\
-          "-s/--struct\n\tPrint struct\n"+\
-          "-n/--name-only\n\tPrint names only\n"+\
-          "-P/--print-no-comment\n\tPrint with comment removed only\n"+\
-          ""
-          
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "hMm:Ee:Ss:nP",
-                               ["help","macros","macro=","enums","enum=",
-                                "structs","struct="
-                                "name-only","print-no-comment"])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-#Check there is at least input file
-if (len(args) < 1):
-    usage()
-    sys.exit(2)
-
-#Parse options
-##Print names only
-nameOnly = False
-##Print all structs?
-allStructs = False
-##Query specific struct
-struct=""
-##Print all enums?
-allEnums = False
-##Query specific enum
-enum=""
-##Print all macros?
-allMacros = False
-##Query specific macro
-macro=""
-##Print without comment
-printNoComment=False
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    elif (opt in ("-S","--structs")): 
-        allStructs = True
-    elif (opt in ("-s","--struct")): 
-        struct = arg
-    elif (opt in ("-M","--macros")): 
-        allMacros = True
-    elif (opt in ("-m","--macro")): 
-        macro=arg
-    elif (opt in ("-E","--enums")): 
-        allEnums = True
-    elif (opt in ("-e","--enum")): 
-        enum = arg
-    elif (opt in ("-n","--name-only")): 
-        nameOnly = True
-    elif (opt in ("-P","--print-no-comment")): 
-        printNoComment = True
-    else:
-        assert (False,"Unhandled option :"+opt)
-
-headerfile = cheader.cheaderfile(args)
-if (printNoComment):
-    for line in headerfile.content:
-        print line
-    sys.exit(0)
-    
-#Print all macros
-if (allMacros):
-    for (macroname, value) in headerfile.macros.items():
-        if (nameOnly):
-            print macroname
-        else:
-            print macroname+"\t=\t"+str(value)
-#Print specified macro
-if (macro != ""):
-    try:
-        print macro+"="+headerfile.macros[macro]
-    except KeyError:
-        print "Macro "+macro+" not found!"
-
-#Print all structs
-if (allStructs):
-    for (structname, value) in headerfile.structs.items():
-        if (nameOnly):
-            print structname
-        else:
-            print str(value)+"\n"
-
-#Print specified struct
-if (struct != ""):
-    try:
-        print str(headerfile.structs[struct])
-    except KeyError:
-        print "Struct "+struct+" not found!"
-
-#Print all enumerations
-if (allEnums):
-    for (enumname, values) in headerfile.enums.items():
-        print enumname
-        if (not nameOnly):
-            for enumval in values:
-                try:
-                    print "\t"+enumval+"="+\
-                          str(headerfile.enum_values[enumval])
-                except KeyError:
-                    print enumval+" not found in enum!";
-
-#Print specifed enum
-if (enum != ""):
-    try:
-        for enumval in headerfile.enums[enum]:
-            try:
-                print enumval+"="+str(headerfile.enum_values[enumval])
-            except KeyError:
-                print enumval+" not found in enum!";
-    except KeyError:
-        print "Enumeration "+enum+" not found!"
diff --git a/tools/pylibopenflow/bin/pyopenflow-get-struct.py b/tools/pylibopenflow/bin/pyopenflow-get-struct.py
deleted file mode 100755
index d07d85e..0000000
--- a/tools/pylibopenflow/bin/pyopenflow-get-struct.py
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python
-"""This script reads struct from OpenFlow header file and output query
-
-(C) Copyright Stanford University
-Author ykk
-Date October 2009
-"""
-import sys
-import getopt
-import openflow
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> struct_name\n"+\
-          "Options:\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          "-c/--cstruct\n\tPrint C struct\n"+\
-          "-n/--name\n\tPrint names of struct\n"+\
-          "-s/--size\n\tPrint size of struct\n"+\
-          ""
-          
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "hcsn",
-                               ["help","cstruct","size","names"])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-#Check there is only struct name
-if not (len(args) == 1):
-    usage()
-    sys.exit(2)
-    
-#Parse options
-##Print C struct
-printc = False
-##Print names
-printname = False
-##Print size
-printsize = False
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    elif (opt in ("-s","--size")): 
-        printsize = True
-    elif (opt in ("-c","--cstruct")): 
-        printc = True
-    elif (opt in ("-n","--names")): 
-        printname = True
-    else:
-        assert (False,"Unhandled option :"+opt)
-
-pyopenflow = openflow.messages()
-cstruct = pyopenflow.structs[args[0].strip()]
-pattern = pyopenflow.get_pattern(cstruct)
-
-#Print C struct
-if (printc):
-    print cstruct
-
-#Print pattern
-print "Python pattern = "+str(pattern)
-
-#Print name
-if (printname):
-    print cstruct.get_names()
-
-#Print size
-if (printsize):
-    print "Size = "+str(pyopenflow.get_size(pattern))
-
diff --git a/tools/pylibopenflow/bin/pyopenflow-lavi-pythonize.py b/tools/pylibopenflow/bin/pyopenflow-lavi-pythonize.py
deleted file mode 100755
index 914a424..0000000
--- a/tools/pylibopenflow/bin/pyopenflow-lavi-pythonize.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env python
-"""This script generate class files for messenger and lavi in NOX, 
-specifically it creates a Python class for each data structure.
-
-(C) Copyright Stanford University
-Author ykk
-Date January 2010
-"""
-import sys
-import os.path
-import getopt
-import cheader
-import lavi.pythonize
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> nox_dir\n"+\
-          "Options:\n"+\
-          "-i/--input-dir\n\tSpecify input directory (nox src directory)\n"+\
-          "-t/--template\n\tSpecify (non-default) template file\n"+\
-          "-n/--no-lavi\n\tSpecify that LAVI's file will not be created\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          ""
-          
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "hm:n",
-                               ["help","messenger-template","no-lavi"])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-#Check there is only NOX directory given
-if not (len(args) == 1):
-    usage()
-    sys.exit(2)
-
-#Parse options
-##Output LAVI
-outputlavi=True
-##Template file
-templatefile="include/messenger.template.py"
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    elif (opt in ("-t","--template")):
-        templatefile=arg
-    elif (opt in ("-n","--no-lavi")):
-        outputlavi=False
-    else:
-        print "Unhandled option:"+opt
-        sys.exit(2)
-
-#Check for header file in NOX directory
-if not (os.path.isfile(args[0]+"/src/nox/coreapps/messenger/message.hh")):
-    print "Messenger header file not found!"
-    sys.exit(2)
-if (outputlavi):
-    if not (os.path.isfile(args[0]+"/src/nox/netapps/lavi/lavi-message.hh")):
-        print "LAVI message header file not found!"
-        sys.exit(2)
-
-#Get headerfile and pythonizer
-msgheader = cheader.cheaderfile(args[0]+"/src/nox/coreapps/messenger/message.hh")
-mpynizer = lavi.pythonize.msgpythonizer(msgheader)
-if (outputlavi):
-    laviheader = cheader.cheaderfile([args[0]+"/src/nox/coreapps/messenger/message.hh",
-                                      args[0]+"/src/nox/netapps/lavi/lavi-message.hh"])
-    lpynizer = lavi.pythonize.lavipythonizer(laviheader)
-    
-#Generate Python code for messenger
-fileRef = open(args[0]+"/src/nox/coreapps/messenger/messenger.py", "w")
-for x in mpynizer.pycode(templatefile):
-    fileRef.write(x+"\n")
-fileRef.write("\n")
-fileRef.close()
-
-if (outputlavi):
-    fileRef = open(args[0]+"/src/nox/netapps/lavi/lavi.py", "w")
-    for x in lpynizer.pycode(templatefile):
-        fileRef.write(x.replace("def __init__(self,ipAddr,portNo=2603,debug=False):",
-                                "def __init__(self,ipAddr,portNo=2503,debug=False):").\
-                      replace("def __init__(self, ipAddr, portNo=1304,debug=False):",
-                              "def __init__(self, ipAddr, portNo=1305,debug=False):")+\
-                      "\n")
-    fileRef.write("\n")
-    fileRef.close()
diff --git a/tools/pylibopenflow/bin/pyopenflow-load-controller.py b/tools/pylibopenflow/bin/pyopenflow-load-controller.py
deleted file mode 100755
index 715a73a..0000000
--- a/tools/pylibopenflow/bin/pyopenflow-load-controller.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python
-"""This script fakes as n OpenFlow switch and
-load the controller with k packets per second.
-
-(C) Copyright Stanford University
-Author ykk
-Date January 2010
-"""
-import sys
-import getopt
-import struct
-import openflow
-import time
-import output
-import of.msg
-import of.simu
-import of.network
-import dpkt.ethernet
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> controller\n"+\
-          "Options:\n"+\
-          "-p/--port\n\tSpecify port number\n"+\
-          "-v/--verbose\n\tPrint message exchange\n"+\
-          "-r/--rate\n\tSpecify rate per switch to send packets (default=1)\n"+\
-          "-d/--duration\n\tSpecify duration of load test in seconds (default=5)\n"+\
-          "-s/--switch\n\tSpecify number of switches (default=1)\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          ""
-          
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "hvp:s:d:r:",
-                               ["help","verbose","port=",
-                                "switch=","duration=","rate="])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-#Check there is only controller
-if not (len(args) == 1):
-    usage()
-    sys.exit(2)
-    
-#Parse options
-##Duration
-duration = 5
-##Rate
-rate = 1.0
-##Switch number
-swno = 1
-##Port to connect to
-port = 6633
-##Set output mode
-output.set_mode("INFO")
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    elif (opt in ("-v","--verbose")):
-        output.set_mode("DBG")
-    elif (opt in ("-p","--port")):
-        port=int(arg)
-    elif (opt in ("-s","--switch")):
-        swno=int(arg)
-    elif (opt in ("-d","--duration")):
-        duration=int(arg)
-    elif (opt in ("-r","--rate")):
-        rate=float(arg)
-    else:
-        print "Unhandled option :"+opt
-        sys.exit(2)
-
-#Form packet
-pkt = dpkt.ethernet.Ethernet()
-pkt.type = dpkt.ethernet.ETH_MIN
-pkt.dst = '\xFF\xFF\xFF\xFF\xFF\xFF'
-
-#Connect to controller
-ofmsg = openflow.messages()
-parser = of.msg.parser(ofmsg)
-ofnet = of.simu.network()
-for i in range(1,swno+1):
-    ofsw = of.simu.switch(ofmsg, args[0], port,
-                          dpid=i,
-                          parser=parser)
-    ofnet.add_switch(ofsw)
-    ofsw.send_hello()
-    
-output.info("Running "+str(swno)+" switches at "+str(rate)+\
-            " packets per seconds for "+str(duration)+" s")
-
-starttime = time.time()
-running = True
-interval = 1.0/(rate*swno)
-ntime=time.time()+(interval/10.0)
-swindex = 0
-pcount = 0
-rcount = 0
-while running:
-    ctime = time.time()
-    time.sleep(max(0,min(ntime-ctime,interval/10.0)))
-
-    if ((ctime-starttime) <= duration):
-        #Send packet if time's up
-        if (ctime >= ntime):
-            ntime += interval
-            pkt.src = struct.pack("Q",pcount)[:6]
-            ofnet.switches[swindex].send_packet(1,10,pkt.pack()+'A'*3)
-            pcount += 1
-            swno += 1
-            if (swno >= len(ofnet.switches)):
-                swno=0
-
-        #Process any received message
-        (ofsw, msg) = ofnet.connections.msgreceive()
-        while (msg != None):
-            dic = ofmsg.peek_from_front("ofp_header", msg)
-            if (dic["type"][0] == ofmsg.get_value("OFPT_FLOW_MOD")):
-                output.dbg("Received flow mod")
-                rcount += 1
-            ofsw.receive_openflow(msg)
-            (ofsw, msg) = ofnet.connections.msgreceive()
-    else:
-        running = False
-    
-output.info("Sent "+str(pcount)+" packets at rate "+\
-            str(float(pcount)/float(duration))+" and received "+\
-            str(rcount)+" back")
diff --git a/tools/pylibopenflow/bin/pyopenflow-ping-controller.py b/tools/pylibopenflow/bin/pyopenflow-ping-controller.py
deleted file mode 100755
index cae3a43..0000000
--- a/tools/pylibopenflow/bin/pyopenflow-ping-controller.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python
-"""This script fakes as an OpenFlow switch to the controller
-
-(C) Copyright Stanford University
-Author ykk
-Date October 2009
-"""
-import sys
-import getopt
-import openflow
-import time
-import output
-import of.msg
-import of.simu
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> controller\n"+\
-          "Options:\n"+\
-          "-p/--port\n\tSpecify port number\n"+\
-          "-v/--verbose\n\tPrint message exchange\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          ""
-          
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "hvp:",
-                               ["help","verbose","port="])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-#Check there is only controller
-if not (len(args) == 1):
-    usage()
-    sys.exit(2)
-    
-#Parse options
-##Port to connect to
-port = 6633
-##Set output mode
-output.set_mode("INFO")
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    elif (opt in ("-v","--verbose")):
-        output.set_mode("DBG")
-    elif (opt in ("-p","--port")):
-        port=int(arg)
-    else:
-        assert (False,"Unhandled option :"+opt)
-
-#Connect to controller
-ofmsg = openflow.messages()
-parser = of.msg.parser(ofmsg)
-ofsw = of.simu.switch(ofmsg, args[0], port,
-                      dpid=int("0xcafecafe",16),
-                      parser=parser)
-ofsw.send_hello()
-#Send echo and wait
-xid = 22092009
-running = True
-ofsw.send_echo(xid)
-starttime = time.time()
-while running:
-    msg = ofsw.connection.msgreceive(True, 0.00001)
-    pkttime = time.time()
-    dic = ofmsg.peek_from_front("ofp_header", msg)
-    if (dic["type"][0] == ofmsg.get_value("OFPT_ECHO_REPLY") and
-        dic["xid"][0] == xid):
-        #Check reply for echo request
-        output.info("Received echo reply after "+\
-                    str((pkttime-starttime)*1000)+" ms", "ping-controller")
-        running = False
-    else:
-        ofsw.receive_openflow(msg)
diff --git a/tools/pylibopenflow/bin/pyopenflow-pythonize.py b/tools/pylibopenflow/bin/pyopenflow-pythonize.py
deleted file mode 100755
index 6da4af9..0000000
--- a/tools/pylibopenflow/bin/pyopenflow-pythonize.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env python
-"""This script generate openflow-packets.py which
-creates Python class for each data structure in openflow.h.
-
-(C) Copyright Stanford University
-Author ykk
-Date December 2009
-"""
-import sys
-#@todo Fix this include path mechanism
-sys.path.append('./bin')
-sys.path.append('./pylib')
-import getopt
-import openflow
-import time
-import output
-import of.pythonize
-
-def usage():
-    """Display usage
-    """
-    print "Usage "+sys.argv[0]+" <options> output_file\n"+\
-          "Options:\n"+\
-          "-i/--input\n\tSpecify (non-default) OpenFlow header\n"+\
-          "-t/--template\n\tSpecify (non-default) template file\n"+\
-          "-h/--help\n\tPrint this usage guide\n"+\
-          ""
-          
-#Parse options and arguments
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "hi:t:",
-                               ["help","input","template"])
-except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-
-#Check there is only output file
-if not (len(args) == 1):
-    usage()
-    sys.exit(2)
-
-#Parse options
-##Input
-headerfile=None
-##Template file
-templatefile=None
-for opt,arg in opts:
-    if (opt in ("-h","--help")):
-        usage()
-        sys.exit(0)
-    elif (opt in ("-i","--input")):
-        headerfile=arg
-    elif (opt in ("-t","--template")):
-        templatefile=arg
-    else:
-        print "Unhandled option:"+opt
-        sys.exit(2)
-
-#Generate Python code
-ofmsg = openflow.messages(headerfile)
-pynizer = of.pythonize.pythonizer(ofmsg)
-
-fileRef = open(args[0], "w")
-for x in pynizer.pycode(templatefile):
-    fileRef.write(x+"\n")
-fileRef.write("\n")
-fileRef.close()
diff --git a/tools/pylibopenflow/include/Put_C_header_files_here b/tools/pylibopenflow/include/Put_C_header_files_here
deleted file mode 100644
index e69de29..0000000
--- a/tools/pylibopenflow/include/Put_C_header_files_here
+++ /dev/null
diff --git a/tools/pylibopenflow/include/messenger.template.py b/tools/pylibopenflow/include/messenger.template.py
deleted file mode 100644
index 25e7c76..0000000
--- a/tools/pylibopenflow/include/messenger.template.py
+++ /dev/null
@@ -1,115 +0,0 @@
-import socket
-import select
-
-## This module provides library to send and receive messages to NOX's messenger
-#
-# This is a rewrite of noxmsg.py from OpenRoads (OpenFlow Wireless)
-#
-# @author ykk (Stanford University)
-# @date January, 2010
-# @see messenger
-
-def stringarray(string):
-    """Output array of binary values in string.
-    """
-    arrstr = ""
-    if (len(string) != 0):
-        for i in range(0,len(string)):
-            arrstr += "%x " % struct.unpack("=B",string[i])[0]
-    return arrstr
-
-def printarray(string):
-    """Print array of binary values
-    """
-    print "Array of length "+str(len(string))
-    print stringarray(string)
-
-class channel:
-    """TCP channel to communicate to NOX with.
-    """
-    def __init__(self,ipAddr,portNo=2603,debug=False):
-        """Initialize with socket
-        """
-        ##Socket reference for channel
-        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        self.sock.connect((ipAddr,portNo))
-        self.debug = debug
-        ##Internal buffer for receiving
-        self.__buffer = ""
-        ##Internal reference to header
-        self.__header = messenger_msg()
-
-    def baresend(self, msg):
-        """Send bare message"""
-        self.sock.send(msg)
-
-    def send(self,msg):
-        """Send message
-        """
-        msgh = messenger_msg()
-        remaining = msgh.unpack(msg)
-        if (msgh.length != len(msg)):
-            msgh.length = len(msg)
-            msg = msgh.pack()+remaining
-        self.baresend(msg)
-        if (self.debug):
-            printarray(msg)
-        
-    def receive(self, recvLen=0,timeout=0):
-        """Receive command
-        If length == None, nonblocking receive (return None or message)
-        With nonblocking receive, timeout is used for select statement
-
-        If length is zero, return single message
-        """            
-        if (recvLen==0):
-            #Receive full message
-            msg=""
-            length=len(self.__header)
-            while (len(msg) < length):
-                msg+=self.sock.recv(1)
-                #Get length
-                if (len(msg) == length):
-                    self.__header.unpack(msg)
-                    length=self.__header.length
-            return msg
-        elif (recvLen==None):
-            #Non-blocking receive
-            ready_to_read = select.select([self.sock],[],[],timeout)[0]
-            if (ready_to_read):
-                self.__buffer += self.sock.recv(1)
-            if (len(self.__buffer) >= len(self.__header)):
-                self.__header.unpack(self.__buffer)
-                if (self.__header.length == len(self.__buffer)):
-                    msg = self.__buffer
-                    self.__buffer = ""
-                    return msg
-            return None
-        else:
-            #Fixed length blocking receive
-            return self.sock.recv(recvLen)
-
-    def __del__(self):
-        """Terminate connection
-        """
-        emsg = messenger_msg()
-        emsg.type = MSG_DISCONNECT
-        emsg.length = len(emsg)
-        self.send(emsg.pack())
-        self.sock.shutdown(1)
-        self.sock.close()
-
-class sslChannel(channel):
-    """SSL channel to communicate to NOX with.
-    """
-    def __init__(self, ipAddr, portNo=1304,debug=False):
-        """Initialize with SSL sock
-        """
-        NOXChannel.__init__(self, ipAddr, portNo,debug)
-        ##Reference to SSL socket for channel
-        self.sslsock = socket.ssl(self.sock)
-
-    def baresend(self, msg):
-        """Send bare message"""
-        self.sslsock.write(msg)
-
diff --git a/tools/pylibopenflow/include/openflow.h b/tools/pylibopenflow/include/openflow.h
deleted file mode 100644
index c0b5090..0000000
--- a/tools/pylibopenflow/include/openflow.h
+++ /dev/null
@@ -1,970 +0,0 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
- * Junior University
- *
- * We are making the OpenFlow specification and associated documentation
- * (Software) available for public use and benefit with the expectation
- * that others will use, modify and enhance the Software and contribute
- * those enhancements back to the community. However, since we would
- * like to make the Software available for broadest use, with as few
- * restrictions as possible permission is hereby granted, free of
- * charge, to any person obtaining a copy of this Software to deal in
- * the Software under the copyrights without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * The name and trademarks of copyright holder(s) may NOT be used in
- * advertising or publicity pertaining to the Software or any
- * derivatives without specific, written prior permission.
- */
-
-/* OpenFlow: protocol between controller and datapath. */
-
-#ifndef OPENFLOW_OPENFLOW_H
-#define OPENFLOW_OPENFLOW_H 1
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-#ifdef SWIG
-#define OFP_ASSERT(EXPR)        /* SWIG can't handle OFP_ASSERT. */
-#elif !defined(__cplusplus)
-/* Build-time assertion for use in a declaration context. */
-#define OFP_ASSERT(EXPR)                                                \
-        extern int (*build_assert(void))[ sizeof(struct {               \
-                    unsigned int build_assert_failed : (EXPR) ? 1 : -1; })]
-#else /* __cplusplus */
-#define OFP_ASSERT(_EXPR) typedef int build_assert_failed[(_EXPR) ? 1 : -1]
-#endif /* __cplusplus */
-
-#ifndef SWIG
-#define OFP_PACKED __attribute__((packed))
-#else
-#define OFP_PACKED              /* SWIG doesn't understand __attribute. */
-#endif
-
-/* Version number:
- * Non-experimental versions released: 0x01
- * Experimental versions released: 0x81 -- 0x99
- */
-/* The most significant bit being set in the version field indicates an
- * experimental OpenFlow version.
- */
-#define OFP_VERSION   0x01
-
-#define OFP_MAX_TABLE_NAME_LEN 32
-#define OFP_MAX_PORT_NAME_LEN  16
-
-#define OFP_TCP_PORT  6633
-#define OFP_SSL_PORT  6633
-
-#define OFP_ETH_ALEN 6          /* Bytes in an Ethernet address. */
-
-/* Port numbering.  Physical ports are numbered starting from 1. */
-enum ofp_port {
-    /* Maximum number of physical switch ports. */
-    OFPP_MAX = 0xff00,
-
-    /* Fake output "ports". */
-    OFPP_IN_PORT    = 0xfff8,  /* Send the packet out the input port.  This
-                                  virtual port must be explicitly used
-                                  in order to send back out of the input
-                                  port. */
-    OFPP_TABLE      = 0xfff9,  /* Perform actions in flow table.
-                                  NB: This can only be the destination
-                                  port for packet-out messages. */
-    OFPP_NORMAL     = 0xfffa,  /* Process with normal L2/L3 switching. */
-    OFPP_FLOOD      = 0xfffb,  /* All physical ports except input port and
-                                  those disabled by STP. */
-    OFPP_ALL        = 0xfffc,  /* All physical ports except input port. */
-    OFPP_CONTROLLER = 0xfffd,  /* Send to controller. */
-    OFPP_LOCAL      = 0xfffe,  /* Local openflow "port". */
-    OFPP_NONE       = 0xffff   /* Not associated with a physical port. */
-};
-
-enum ofp_type {
-    /* Immutable messages. */
-    OFPT_HELLO,               /* Symmetric message */
-    OFPT_ERROR,               /* Symmetric message */
-    OFPT_ECHO_REQUEST,        /* Symmetric message */
-    OFPT_ECHO_REPLY,          /* Symmetric message */
-    OFPT_VENDOR,              /* Symmetric message */
-
-    /* Switch configuration messages. */
-    OFPT_FEATURES_REQUEST,    /* Controller/switch message */
-    OFPT_FEATURES_REPLY,      /* Controller/switch message */
-    OFPT_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REPLY,    /* Controller/switch message */
-    OFPT_SET_CONFIG,          /* Controller/switch message */
-
-    /* Asynchronous messages. */
-    OFPT_PACKET_IN,           /* Async message */
-    OFPT_FLOW_REMOVED,        /* Async message */
-    OFPT_PORT_STATUS,         /* Async message */
-
-    /* Controller command messages. */
-    OFPT_PACKET_OUT,          /* Controller/switch message */
-    OFPT_FLOW_MOD,            /* Controller/switch message */
-    OFPT_PORT_MOD,            /* Controller/switch message */
-
-    /* Statistics messages. */
-    OFPT_STATS_REQUEST,       /* Controller/switch message */
-    OFPT_STATS_REPLY,         /* Controller/switch message */
-
-    /* Barrier messages. */
-    OFPT_BARRIER_REQUEST,     /* Controller/switch message */
-    OFPT_BARRIER_REPLY,       /* Controller/switch message */
-
-    /* Queue Configuration messages. */
-    OFPT_QUEUE_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_QUEUE_GET_CONFIG_REPLY     /* Controller/switch message */
-
-};
-
-/* Header on all OpenFlow packets. */
-struct ofp_header {
-    uint8_t version;    /* OFP_VERSION. */
-    uint8_t type;       /* One of the OFPT_ constants. */
-    uint16_t length;    /* Length including this ofp_header. */
-    uint32_t xid;       /* Transaction id associated with this packet.
-                           Replies use the same id as was in the request
-                           to facilitate pairing. */
-};
-OFP_ASSERT(sizeof(struct ofp_header) == 8);
-
-/* OFPT_HELLO.  This message has an empty body, but implementations must
- * ignore any data included in the body, to allow for future extensions. */
-struct ofp_hello {
-    struct ofp_header header;
-};
-
-#define OFP_DEFAULT_MISS_SEND_LEN   128
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0,  /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1,  /* Drop fragments. */
-    OFPC_FRAG_REASM    = 2,  /* Reassemble (only if OFPC_IP_REASM set). */
-    OFPC_FRAG_MASK     = 3
-};
-
-/* Switch configuration. */
-struct ofp_switch_config {
-    struct ofp_header header;
-    uint16_t flags;             /* OFPC_* flags. */
-    uint16_t miss_send_len;     /* Max bytes of new flow that datapath should
-                                   send to the controller. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_config) == 12);
-
-/* Capabilities supported by the datapath. */
-enum ofp_capabilities {
-    OFPC_FLOW_STATS     = 1 << 0,  /* Flow statistics. */
-    OFPC_TABLE_STATS    = 1 << 1,  /* Table statistics. */
-    OFPC_PORT_STATS     = 1 << 2,  /* Port statistics. */
-    OFPC_STP            = 1 << 3,  /* 802.1d spanning tree. */
-    OFPC_RESERVED       = 1 << 4,  /* Reserved, must be zero. */
-    OFPC_IP_REASM       = 1 << 5,  /* Can reassemble IP fragments. */
-    OFPC_QUEUE_STATS    = 1 << 6,  /* Queue statistics. */
-    OFPC_ARP_MATCH_IP   = 1 << 7   /* Match IP addresses in ARP pkts. */
-};
-
-/* Flags to indicate behavior of the physical port.  These flags are
- * used in ofp_phy_port to describe the current configuration.  They are
- * used in the ofp_port_mod message to configure the port's behavior.
- */
-enum ofp_port_config {
-    OFPPC_PORT_DOWN    = 1 << 0,  /* Port is administratively down. */
-
-    OFPPC_NO_STP       = 1 << 1,  /* Disable 802.1D spanning tree on port. */
-    OFPPC_NO_RECV      = 1 << 2,  /* Drop all packets except 802.1D spanning
-                                     tree packets. */
-    OFPPC_NO_RECV_STP  = 1 << 3,  /* Drop received 802.1D STP packets. */
-    OFPPC_NO_FLOOD     = 1 << 4,  /* Do not include this port when flooding. */
-    OFPPC_NO_FWD       = 1 << 5,  /* Drop packets forwarded to port. */
-    OFPPC_NO_PACKET_IN = 1 << 6   /* Do not send packet-in msgs for port. */
-};
-
-/* Current state of the physical port.  These are not configurable from
- * the controller.
- */
-enum ofp_port_state {
-    OFPPS_LINK_DOWN   = 1 << 0, /* No physical link present. */
-
-    /* The OFPPS_STP_* bits have no effect on switch operation.  The
-     * controller must adjust OFPPC_NO_RECV, OFPPC_NO_FWD, and
-     * OFPPC_NO_PACKET_IN appropriately to fully implement an 802.1D spanning
-     * tree. */
-    OFPPS_STP_LISTEN  = 0 << 8, /* Not learning or relaying frames. */
-    OFPPS_STP_LEARN   = 1 << 8, /* Learning but not relaying frames. */
-    OFPPS_STP_FORWARD = 2 << 8, /* Learning and relaying frames. */
-    OFPPS_STP_BLOCK   = 3 << 8, /* Not part of spanning tree. */
-    OFPPS_STP_MASK    = 3 << 8  /* Bit mask for OFPPS_STP_* values. */
-};
-
-/* Features of physical ports available in a datapath. */
-enum ofp_port_features {
-    OFPPF_10MB_HD    = 1 << 0,  /* 10 Mb half-duplex rate support. */
-    OFPPF_10MB_FD    = 1 << 1,  /* 10 Mb full-duplex rate support. */
-    OFPPF_100MB_HD   = 1 << 2,  /* 100 Mb half-duplex rate support. */
-    OFPPF_100MB_FD   = 1 << 3,  /* 100 Mb full-duplex rate support. */
-    OFPPF_1GB_HD     = 1 << 4,  /* 1 Gb half-duplex rate support. */
-    OFPPF_1GB_FD     = 1 << 5,  /* 1 Gb full-duplex rate support. */
-    OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
-    OFPPF_COPPER     = 1 << 7,  /* Copper medium. */
-    OFPPF_FIBER      = 1 << 8,  /* Fiber medium. */
-    OFPPF_AUTONEG    = 1 << 9,  /* Auto-negotiation. */
-    OFPPF_PAUSE      = 1 << 10, /* Pause. */
-    OFPPF_PAUSE_ASYM = 1 << 11  /* Asymmetric pause. */
-};
-
-/* Description of a physical port */
-struct ofp_phy_port {
-    uint16_t port_no;
-    uint8_t hw_addr[OFP_ETH_ALEN];
-    char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */
-
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t state;         /* Bitmap of OFPPS_* flags. */
-
-    /* Bitmaps of OFPPF_* that describe features.  All bits zeroed if
-     * unsupported or unavailable. */
-    uint32_t curr;          /* Current features. */
-    uint32_t advertised;    /* Features being advertised by the port. */
-    uint32_t supported;     /* Features supported by the port. */
-    uint32_t peer;          /* Features advertised by peer. */
-};
-OFP_ASSERT(sizeof(struct ofp_phy_port) == 48);
-
-/* Switch features. */
-struct ofp_switch_features {
-    struct ofp_header header;
-    uint64_t datapath_id;   /* Datapath unique ID.  The lower 48-bits are for
-                               a MAC address, while the upper 16-bits are
-                               implementer-defined. */
-
-    uint32_t n_buffers;     /* Max packets buffered at once. */
-
-    uint8_t n_tables;       /* Number of tables supported by datapath. */
-    uint8_t pad[3];         /* Align to 64-bits. */
-
-    /* Features. */
-    uint32_t capabilities;  /* Bitmap of support "ofp_capabilities". */
-    uint32_t actions;       /* Bitmap of supported "ofp_action_type"s. */
-
-    /* Port info.*/
-    struct ofp_phy_port ports[0];  /* Port definitions.  The number of ports
-                                      is inferred from the length field in
-                                      the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_features) == 32);
-
-/* What changed about the physical port */
-enum ofp_port_reason {
-    OFPPR_ADD,              /* The port was added. */
-    OFPPR_DELETE,           /* The port was removed. */
-    OFPPR_MODIFY            /* Some attribute of the port has changed. */
-};
-
-/* A physical port has changed in the datapath */
-struct ofp_port_status {
-    struct ofp_header header;
-    uint8_t reason;          /* One of OFPPR_*. */
-    uint8_t pad[7];          /* Align to 64-bits. */
-    struct ofp_phy_port desc;
-};
-OFP_ASSERT(sizeof(struct ofp_port_status) == 64);
-
-/* Modify behavior of the physical port */
-struct ofp_port_mod {
-    struct ofp_header header;
-    uint16_t port_no;
-    uint8_t hw_addr[OFP_ETH_ALEN]; /* The hardware address is not
-                                      configurable.  This is used to
-                                      sanity-check the request, so it must
-                                      be the same as returned in an
-                                      ofp_phy_port struct. */
-
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t mask;          /* Bitmap of OFPPC_* flags to be changed. */
-
-    uint32_t advertise;     /* Bitmap of "ofp_port_features"s.  Zero all
-                               bits to prevent any action taking place. */
-    uint8_t pad[4];         /* Pad to 64-bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_mod) == 32);
-
-/* Why is this packet being sent to the controller? */
-enum ofp_packet_in_reason {
-    OFPR_NO_MATCH,          /* No matching flow. */
-    OFPR_ACTION             /* Action explicitly output to controller. */
-};
-
-/* Packet received on port (datapath -> controller). */
-struct ofp_packet_in {
-    struct ofp_header header;
-    uint32_t buffer_id;     /* ID assigned by datapath. */
-    uint16_t total_len;     /* Full length of frame. */
-    uint16_t in_port;       /* Port on which frame was received. */
-    uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */
-    uint8_t pad;
-    uint8_t data[0];        /* Ethernet frame, halfway through 32-bit word,
-                               so the IP header is 32-bit aligned.  The
-                               amount of data is inferred from the length
-                               field in the header.  Because of padding,
-                               offsetof(struct ofp_packet_in, data) ==
-                               sizeof(struct ofp_packet_in) - 2. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_in) == 20);
-
-enum ofp_action_type {
-    OFPAT_OUTPUT,           /* Output to switch port. */
-    OFPAT_SET_VLAN_VID,     /* Set the 802.1q VLAN id. */
-    OFPAT_SET_VLAN_PCP,     /* Set the 802.1q priority. */
-    OFPAT_STRIP_VLAN,       /* Strip the 802.1q header. */
-    OFPAT_SET_DL_SRC,       /* Ethernet source address. */
-    OFPAT_SET_DL_DST,       /* Ethernet destination address. */
-    OFPAT_SET_NW_SRC,       /* IP source address. */
-    OFPAT_SET_NW_DST,       /* IP destination address. */
-    OFPAT_SET_NW_TOS,       /* IP ToS (DSCP field, 6 bits). */
-    OFPAT_SET_TP_SRC,       /* TCP/UDP source port. */
-    OFPAT_SET_TP_DST,       /* TCP/UDP destination port. */
-    OFPAT_ENQUEUE,          /* Output to queue.  */
-    OFPAT_VENDOR = 0xffff
-};
-
-/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
- * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
- * number of bytes to send.  A 'max_len' of zero means no bytes of the
- * packet should be sent.*/
-struct ofp_action_output {
-    uint16_t type;                  /* OFPAT_OUTPUT. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t port;                  /* Output port. */
-    uint16_t max_len;               /* Max length to send to controller. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_output) == 8);
-
-/* The VLAN id is 12 bits, so we can use the entire 16 bits to indicate
- * special conditions.  All ones is used to match that no VLAN id was
- * set. */
-#define OFP_VLAN_NONE      0xffff
-
-/* Action structure for OFPAT_SET_VLAN_VID. */
-struct ofp_action_vlan_vid {
-    uint16_t type;                  /* OFPAT_SET_VLAN_VID. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t vlan_vid;              /* VLAN id. */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_vlan_vid) == 8);
-
-/* Action structure for OFPAT_SET_VLAN_PCP. */
-struct ofp_action_vlan_pcp {
-    uint16_t type;                  /* OFPAT_SET_VLAN_PCP. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t vlan_pcp;               /* VLAN priority. */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_vlan_pcp) == 8);
-
-/* Action structure for OFPAT_SET_DL_SRC/DST. */
-struct ofp_action_dl_addr {
-    uint16_t type;                  /* OFPAT_SET_DL_SRC/DST. */
-    uint16_t len;                   /* Length is 16. */
-    uint8_t dl_addr[OFP_ETH_ALEN];  /* Ethernet address. */
-    uint8_t pad[6];
-};
-OFP_ASSERT(sizeof(struct ofp_action_dl_addr) == 16);
-
-/* Action structure for OFPAT_SET_NW_SRC/DST. */
-struct ofp_action_nw_addr {
-    uint16_t type;                  /* OFPAT_SET_TW_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint32_t nw_addr;               /* IP address. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_addr) == 8);
-
-/* Action structure for OFPAT_SET_TP_SRC/DST. */
-struct ofp_action_tp_port {
-    uint16_t type;                  /* OFPAT_SET_TP_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t tp_port;               /* TCP/UDP port. */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_tp_port) == 8);
-
-/* Action structure for OFPAT_SET_NW_TOS. */
-struct ofp_action_nw_tos {
-    uint16_t type;                  /* OFPAT_SET_TW_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t nw_tos;                 /* IP ToS (DSCP field, 6 bits). */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_tos) == 8);
-
-/* Action header for OFPAT_VENDOR. The rest of the body is vendor-defined. */
-struct ofp_action_vendor_header {
-    uint16_t type;                  /* OFPAT_VENDOR. */
-    uint16_t len;                   /* Length is a multiple of 8. */
-    uint32_t vendor;                /* Vendor ID, which takes the same form
-                                       as in "struct ofp_vendor_header". */
-};
-OFP_ASSERT(sizeof(struct ofp_action_vendor_header) == 8);
-
-/* Action header that is common to all actions.  The length includes the
- * header and any padding used to make the action 64-bit aligned.
- * NB: The length of an action *must* always be a multiple of eight. */
-struct ofp_action_header {
-    uint16_t type;                  /* One of OFPAT_*. */
-    uint16_t len;                   /* Length of action, including this
-                                       header.  This is the length of action,
-                                       including any padding to make it
-                                       64-bit aligned. */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
-
-/* Send packet (controller -> datapath). */
-struct ofp_packet_out {
-    struct ofp_header header;
-    uint32_t buffer_id;           /* ID assigned by datapath (-1 if none). */
-    uint16_t in_port;             /* Packet's input port (OFPP_NONE if none). */
-    uint16_t actions_len;         /* Size of action array in bytes. */
-    struct ofp_action_header actions[0]; /* Actions. */
-    /* uint8_t data[0]; */        /* Packet data.  The length is inferred
-                                     from the length field in the header.
-                                     (Only meaningful if buffer_id == -1.) */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_out) == 16);
-
-enum ofp_flow_mod_command {
-    OFPFC_ADD,              /* New flow. */
-    OFPFC_MODIFY,           /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT,    /* Modify entry strictly matching wildcards */
-    OFPFC_DELETE,           /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT    /* Strictly match wildcards and priority. */
-};
-
-/* Flow wildcards. */
-enum ofp_flow_wildcards {
-    OFPFW_IN_PORT  = 1 << 0,  /* Switch input port. */
-    OFPFW_DL_VLAN  = 1 << 1,  /* VLAN id. */
-    OFPFW_DL_SRC   = 1 << 2,  /* Ethernet source address. */
-    OFPFW_DL_DST   = 1 << 3,  /* Ethernet destination address. */
-    OFPFW_DL_TYPE  = 1 << 4,  /* Ethernet frame type. */
-    OFPFW_NW_PROTO = 1 << 5,  /* IP protocol. */
-    OFPFW_TP_SRC   = 1 << 6,  /* TCP/UDP source port. */
-    OFPFW_TP_DST   = 1 << 7,  /* TCP/UDP destination port. */
-
-    /* IP source address wildcard bit count.  0 is exact match, 1 ignores the
-     * LSB, 2 ignores the 2 least-significant bits, ..., 32 and higher wildcard
-     * the entire field.  This is the *opposite* of the usual convention where
-     * e.g. /24 indicates that 8 bits (not 24 bits) are wildcarded. */
-    OFPFW_NW_SRC_SHIFT = 8,
-    OFPFW_NW_SRC_BITS = 6,
-    OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT,
-    OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT,
-
-    /* IP destination address wildcard bit count.  Same format as source. */
-    OFPFW_NW_DST_SHIFT = 14,
-    OFPFW_NW_DST_BITS = 6,
-    OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT,
-    OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT,
-
-    OFPFW_DL_VLAN_PCP = 1 << 20,  /* VLAN priority. */
-    OFPFW_NW_TOS = 1 << 21,  /* IP ToS (DSCP field, 6 bits). */
-
-    /* Wildcard all fields. */
-    OFPFW_ALL = ((1 << 22) - 1)
-};
-
-/* The wildcards for ICMP type and code fields use the transport source
- * and destination port fields, respectively. */
-#define OFPFW_ICMP_TYPE OFPFW_TP_SRC
-#define OFPFW_ICMP_CODE OFPFW_TP_DST
-
-/* Values below this cutoff are 802.3 packets and the two bytes
- * following MAC addresses are used as a frame length.  Otherwise, the
- * two bytes are used as the Ethernet type.
- */
-#define OFP_DL_TYPE_ETH2_CUTOFF   0x0600
-
-/* Value of dl_type to indicate that the frame does not include an
- * Ethernet type.
- */
-#define OFP_DL_TYPE_NOT_ETH_TYPE  0x05ff
-
-/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
- * special conditions.  All ones indicates that no VLAN id was set.
- */
-#define OFP_VLAN_NONE      0xffff
-
-/* Fields to match against flows */
-struct ofp_match {
-    uint32_t wildcards;        /* Wildcard fields. */
-    uint16_t in_port;          /* Input switch port. */
-    uint8_t dl_src[OFP_ETH_ALEN]; /* Ethernet source address. */
-    uint8_t dl_dst[OFP_ETH_ALEN]; /* Ethernet destination address. */
-    uint16_t dl_vlan;          /* Input VLAN id. */
-    uint8_t dl_vlan_pcp;       /* Input VLAN priority. */
-    uint8_t pad1[1];           /* Align to 64-bits */
-    uint16_t dl_type;          /* Ethernet frame type. */
-    uint8_t nw_tos;            /* IP ToS (actually DSCP field, 6 bits). */
-    uint8_t nw_proto;          /* IP protocol or lower 8 bits of
-                                * ARP opcode. */
-    uint8_t pad2[2];           /* Align to 64-bits */
-    uint32_t nw_src;           /* IP source address. */
-    uint32_t nw_dst;           /* IP destination address. */
-    uint16_t tp_src;           /* TCP/UDP source port. */
-    uint16_t tp_dst;           /* TCP/UDP destination port. */
-};
-OFP_ASSERT(sizeof(struct ofp_match) == 40);
-
-/* The match fields for ICMP type and code use the transport source and
- * destination port fields, respectively. */
-#define icmp_type tp_src
-#define icmp_code tp_dst
-
-/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
- * is permanent. */
-#define OFP_FLOW_PERMANENT 0
-
-/* By default, choose a priority in the middle. */
-#define OFP_DEFAULT_PRIORITY 0x8000
-
-enum ofp_flow_mod_flags {
-    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
-                                    * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
-    OFPFF_EMERG         = 1 << 2   /* Remark this is for emergency. */
-};
-
-/* Flow setup and teardown (controller -> datapath). */
-struct ofp_flow_mod {
-    struct ofp_header header;
-    struct ofp_match match;      /* Fields to match */
-    uint64_t cookie;             /* Opaque controller-issued identifier. */
-
-    /* Flow actions. */
-    uint16_t command;             /* One of OFPFC_*. */
-    uint16_t idle_timeout;        /* Idle time before discarding (seconds). */
-    uint16_t hard_timeout;        /* Max time before discarding (seconds). */
-    uint16_t priority;            /* Priority level of flow entry. */
-    uint32_t buffer_id;           /* Buffered packet to apply to (or -1).
-                                     Not meaningful for OFPFC_DELETE*. */
-    uint16_t out_port;            /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output port.  A value of OFPP_NONE
-                                     indicates no restriction. */
-    uint16_t flags;               /* One of OFPFF_*. */
-    struct ofp_action_header actions[0]; /* The action length is inferred
-                                            from the length field in the
-                                            header. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_mod) == 72);
-
-/* Why was this flow removed? */
-enum ofp_flow_removed_reason {
-    OFPRR_IDLE_TIMEOUT,         /* Flow idle time exceeded idle_timeout. */
-    OFPRR_HARD_TIMEOUT,         /* Time exceeded hard_timeout. */
-    OFPRR_DELETE                /* Evicted by a DELETE flow mod. */
-};
-
-/* Flow removed (datapath -> controller). */
-struct ofp_flow_removed {
-    struct ofp_header header;
-    struct ofp_match match;   /* Description of fields. */
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-
-    uint16_t priority;        /* Priority level of flow entry. */
-    uint8_t reason;           /* One of OFPRR_*. */
-    uint8_t pad[1];           /* Align to 32-bits. */
-
-    uint32_t duration_sec;    /* Time flow was alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow was alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t idle_timeout;    /* Idle timeout from original flow mod. */
-    uint8_t pad2[2];          /* Align to 64-bits. */
-    uint64_t packet_count;
-    uint64_t byte_count;
-};
-OFP_ASSERT(sizeof(struct ofp_flow_removed) == 88);
-
-/* Values for 'type' in ofp_error_message.  These values are immutable: they
- * will not change in future versions of the protocol (although new values may
- * be added). */
-enum ofp_error_type {
-    OFPET_HELLO_FAILED,         /* Hello protocol failed. */
-    OFPET_BAD_REQUEST,          /* Request was not understood. */
-    OFPET_BAD_ACTION,           /* Error in action description. */
-    OFPET_FLOW_MOD_FAILED,      /* Problem modifying flow entry. */
-    OFPET_PORT_MOD_FAILED,      /* Port mod request failed. */
-    OFPET_QUEUE_OP_FAILED       /* Queue operation failed. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
- * ASCII text string that may give failure details. */
-enum ofp_hello_failed_code {
-    OFPHFC_INCOMPATIBLE,        /* No compatible version. */
-    OFPHFC_EPERM                /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_request_code {
-    OFPBRC_BAD_VERSION,         /* ofp_header.version not supported. */
-    OFPBRC_BAD_TYPE,            /* ofp_header.type not supported. */
-    OFPBRC_BAD_STAT,            /* ofp_stats_request.type not supported. */
-    OFPBRC_BAD_VENDOR,          /* Vendor not supported (in ofp_vendor_header
-                                 * or ofp_stats_request or ofp_stats_reply). */
-    OFPBRC_BAD_SUBTYPE,         /* Vendor subtype not supported. */
-    OFPBRC_EPERM,               /* Permissions error. */
-    OFPBRC_BAD_LEN,             /* Wrong request length for type. */
-    OFPBRC_BUFFER_EMPTY,        /* Specified buffer has already been used. */
-    OFPBRC_BUFFER_UNKNOWN       /* Specified buffer does not exist. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_action_code {
-    OFPBAC_BAD_TYPE,           /* Unknown action type. */
-    OFPBAC_BAD_LEN,            /* Length problem in actions. */
-    OFPBAC_BAD_VENDOR,         /* Unknown vendor id specified. */
-    OFPBAC_BAD_VENDOR_TYPE,    /* Unknown action type for vendor id. */
-    OFPBAC_BAD_OUT_PORT,       /* Problem validating output action. */
-    OFPBAC_BAD_ARGUMENT,       /* Bad action argument. */
-    OFPBAC_EPERM,              /* Permissions error. */
-    OFPBAC_TOO_MANY,           /* Can't handle this many actions. */
-    OFPBAC_BAD_QUEUE           /* Problem validating output queue. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_flow_mod_failed_code {
-    OFPFMFC_ALL_TABLES_FULL,    /* Flow not added because of full tables. */
-    OFPFMFC_OVERLAP,            /* Attempted to add overlapping flow with
-                                 * CHECK_OVERLAP flag set. */
-    OFPFMFC_EPERM,              /* Permissions error. */
-    OFPFMFC_BAD_EMERG_TIMEOUT,  /* Flow not added because of non-zero idle/hard
-                                 * timeout. */
-    OFPFMFC_BAD_COMMAND,        /* Unknown command. */
-    OFPFMFC_UNSUPPORTED         /* Unsupported action list - cannot process in
-                                 * the order specified. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_port_mod_failed_code {
-    OFPPMFC_BAD_PORT,            /* Specified port does not exist. */
-    OFPPMFC_BAD_HW_ADDR,         /* Specified hardware address is wrong. */
-};
-
-/* ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request */
-enum ofp_queue_op_failed_code {
-    OFPQOFC_BAD_PORT,           /* Invalid port (or port does not exist). */
-    OFPQOFC_BAD_QUEUE,          /* Queue does not exist. */
-    OFPQOFC_EPERM               /* Permissions error. */
-};
-
-/* OFPT_ERROR: Error message (datapath -> controller). */
-struct ofp_error_msg {
-    struct ofp_header header;
-
-    uint16_t type;
-    uint16_t code;
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_msg) == 12);
-
-enum ofp_stats_types {
-    /* Description of this OpenFlow switch.
-     * The request body is empty.
-     * The reply body is struct ofp_desc_stats. */
-    OFPST_DESC,
-
-    /* Individual flow statistics.
-     * The request body is struct ofp_flow_stats_request.
-     * The reply body is an array of struct ofp_flow_stats. */
-    OFPST_FLOW,
-
-    /* Aggregate flow statistics.
-     * The request body is struct ofp_aggregate_stats_request.
-     * The reply body is struct ofp_aggregate_stats_reply. */
-    OFPST_AGGREGATE,
-
-    /* Flow table statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_table_stats. */
-    OFPST_TABLE,
-
-    /* Physical port statistics.
-     * The request body is struct ofp_port_stats_request.
-     * The reply body is an array of struct ofp_port_stats. */
-    OFPST_PORT,
-
-    /* Queue statistics for a port
-     * The request body defines the port
-     * The reply body is an array of struct ofp_queue_stats */
-    OFPST_QUEUE,
-
-    /* Vendor extension.
-     * The request and reply bodies begin with a 32-bit vendor ID, which takes
-     * the same form as in "struct ofp_vendor_header".  The request and reply
-     * bodies are otherwise vendor-defined. */
-    OFPST_VENDOR = 0xffff
-};
-
-struct ofp_stats_request {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REQ_* flags (none yet defined). */
-    uint8_t body[0];            /* Body of the request. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_request) == 12);
-
-enum ofp_stats_reply_flags {
-    OFPSF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
-};
-
-struct ofp_stats_reply {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REPLY_* flags. */
-    uint8_t body[0];            /* Body of the reply. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_reply) == 12);
-
-#define DESC_STR_LEN   256
-#define SERIAL_NUM_LEN 32
-/* Body of reply to OFPST_DESC request.  Each entry is a NULL-terminated
- * ASCII string. */
-struct ofp_desc_stats {
-    char mfr_desc[DESC_STR_LEN];       /* Manufacturer description. */
-    char hw_desc[DESC_STR_LEN];        /* Hardware description. */
-    char sw_desc[DESC_STR_LEN];        /* Software description. */
-    char serial_num[SERIAL_NUM_LEN];   /* Serial number. */
-    char dp_desc[DESC_STR_LEN];        /* Human readable description of datapath. */
-};
-OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056);
-
-/* Body for ofp_stats_request of type OFPST_FLOW. */
-struct ofp_flow_stats_request {
-    struct ofp_match match;   /* Fields to match. */
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats),
-                                 0xff for all tables or 0xfe for emergency. */
-    uint8_t pad;              /* Align to 32 bits. */
-    uint16_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_NONE
-                                 indicates no restriction. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 44);
-
-/* Body of reply to OFPST_FLOW request. */
-struct ofp_flow_stats {
-    uint16_t length;          /* Length of this entry. */
-    uint8_t table_id;         /* ID of table flow came from. */
-    uint8_t pad;
-    struct ofp_match match;   /* Description of fields. */
-    uint32_t duration_sec;    /* Time flow has been alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow has been alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t priority;        /* Priority of the entry. Only meaningful
-                                 when this is not an exact-match entry. */
-    uint16_t idle_timeout;    /* Number of seconds idle before expiration. */
-    uint16_t hard_timeout;    /* Number of seconds before expiration. */
-    uint8_t pad2[6];          /* Align to 64-bits. */
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-    uint64_t packet_count;    /* Number of packets in flow. */
-    uint64_t byte_count;      /* Number of bytes in flow. */
-    struct ofp_action_header actions[0]; /* Actions. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats) == 88);
-
-/* Body for ofp_stats_request of type OFPST_AGGREGATE. */
-struct ofp_aggregate_stats_request {
-    struct ofp_match match;   /* Fields to match. */
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats)
-                                 0xff for all tables or 0xfe for emergency. */
-    uint8_t pad;              /* Align to 32 bits. */
-    uint16_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_NONE
-                                 indicates no restriction. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 44);
-
-/* Body of reply to OFPST_AGGREGATE request. */
-struct ofp_aggregate_stats_reply {
-    uint64_t packet_count;    /* Number of packets in flows. */
-    uint64_t byte_count;      /* Number of bytes in flows. */
-    uint32_t flow_count;      /* Number of flows. */
-    uint8_t pad[4];           /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
-
-/* Body of reply to OFPST_TABLE request. */
-struct ofp_table_stats {
-    uint8_t table_id;        /* Identifier of table.  Lower numbered tables
-                                are consulted first. */
-    uint8_t pad[3];          /* Align to 32-bits. */
-    char name[OFP_MAX_TABLE_NAME_LEN];
-    uint32_t wildcards;      /* Bitmap of OFPFW_* wildcards that are
-                                supported by the table. */
-    uint32_t max_entries;    /* Max number of entries supported. */
-    uint32_t active_count;   /* Number of active entries. */
-    uint64_t lookup_count;   /* Number of packets looked up in table. */
-    uint64_t matched_count;  /* Number of packets that hit table. */
-};
-OFP_ASSERT(sizeof(struct ofp_table_stats) == 64);
-
-/* Body for ofp_stats_request of type OFPST_PORT. */
-struct ofp_port_stats_request {
-    uint16_t port_no;        /* OFPST_PORT message must request statistics
-                              * either for a single port (specified in
-                              * port_no) or for all ports (if port_no ==
-                              * OFPP_NONE). */
-    uint8_t pad[6];
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8);
-
-/* Body of reply to OFPST_PORT request. If a counter is unsupported, set
- * the field to all ones. */
-struct ofp_port_stats {
-    uint16_t port_no;
-    uint8_t pad[6];          /* Align to 64-bits. */
-    uint64_t rx_packets;     /* Number of received packets. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t rx_bytes;       /* Number of received bytes. */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t rx_dropped;     /* Number of packets dropped by RX. */
-    uint64_t tx_dropped;     /* Number of packets dropped by TX. */
-    uint64_t rx_errors;      /* Number of receive errors.  This is a super-set
-                                of more specific receive errors and should be
-                                greater than or equal to the sum of all
-                                rx_*_err values. */
-    uint64_t tx_errors;      /* Number of transmit errors.  This is a super-set
-                                of more specific transmit errors and should be
-                                greater than or equal to the sum of all
-                                tx_*_err values (none currently defined.) */
-    uint64_t rx_frame_err;   /* Number of frame alignment errors. */
-    uint64_t rx_over_err;    /* Number of packets with RX overrun. */
-    uint64_t rx_crc_err;     /* Number of CRC errors. */
-    uint64_t collisions;     /* Number of collisions. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats) == 104);
-
-/* Vendor extension. */
-struct ofp_vendor_header {
-    struct ofp_header header;   /* Type OFPT_VENDOR. */
-    uint32_t vendor;            /* Vendor ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by OpenFlow
-                                 *   consortium. */
-    /* Vendor-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_vendor_header) == 12);
-
-/* All ones is used to indicate all queues in a port (for stats retrieval). */
-#define OFPQ_ALL      0xffffffff
-
-/* Min rate > 1000 means not configured. */
-#define OFPQ_MIN_RATE_UNCFG      0xffff
-
-enum ofp_queue_properties {
-    OFPQT_NONE = 0,       /* No property defined for queue (default). */
-    OFPQT_MIN_RATE,       /* Minimum datarate guaranteed. */
-                          /* Other types should be added here
-                           * (i.e. max rate, precedence, etc). */
-};
-
-/* Common description for a queue. */
-struct ofp_queue_prop_header {
-    uint16_t property;    /* One of OFPQT_. */
-    uint16_t len;         /* Length of property, including this header. */
-    uint8_t pad[4];       /* 64-bit alignemnt. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_header) == 8);
-
-/* Min-Rate queue property description. */
-struct ofp_queue_prop_min_rate {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MIN, len: 16. */
-    uint16_t rate;        /* In 1/10 of a percent; >1000 -> disabled. */
-    uint8_t pad[6];       /* 64-bit alignment */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_min_rate) == 16);
-
-/* Full description for a queue. */
-struct ofp_packet_queue {
-    uint32_t queue_id;     /* id for the specific queue. */
-    uint16_t len;          /* Length in bytes of this queue desc. */
-    uint8_t pad[2];        /* 64-bit alignment. */
-    struct ofp_queue_prop_header properties[0]; /* List of properties. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_queue) == 8);
-
-/* Query for port queue configuration. */
-struct ofp_queue_get_config_request {
-    struct ofp_header header;
-    uint16_t port;         /* Port to be queried. Should refer
-                              to a valid physical port (i.e. < OFPP_MAX) */
-    uint8_t pad[2];        /* 32-bit alignment. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_request) == 12);
-
-/* Queue configuration for a given port. */
-struct ofp_queue_get_config_reply {
-    struct ofp_header header;
-    uint16_t port;
-    uint8_t pad[6];
-    struct ofp_packet_queue queues[0]; /* List of configured queues. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_reply) == 16);
-
-/* OFPAT_ENQUEUE action struct: send packets to given queue on port. */
-struct ofp_action_enqueue {
-    uint16_t type;            /* OFPAT_ENQUEUE. */
-    uint16_t len;             /* Len is 16. */
-    uint16_t port;            /* Port that queue belongs. Should
-                                 refer to a valid physical port
-                                 (i.e. < OFPP_MAX) or OFPP_IN_PORT. */
-    uint8_t pad[6];           /* Pad for 64-bit alignment. */
-    uint32_t queue_id;        /* Where to enqueue the packets. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_enqueue) == 16);
-
-struct ofp_queue_stats_request {
-    uint16_t port_no;        /* All ports if OFPT_ALL. */
-    uint8_t pad[2];          /* Align to 32-bits. */
-    uint32_t queue_id;       /* All queues if OFPQ_ALL. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8);
-
-struct ofp_queue_stats {
-    uint16_t port_no;
-    uint8_t pad[2];          /* Align to 32-bits. */
-    uint32_t queue_id;       /* Queue i.d */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t tx_errors;      /* Number of packets dropped due to overrun. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats) == 32);
-
-#endif /* openflow/openflow.h */
diff --git a/tools/pylibopenflow/include/pyopenflow.template.py b/tools/pylibopenflow/include/pyopenflow.template.py
deleted file mode 100644
index 29b59f4..0000000
--- a/tools/pylibopenflow/include/pyopenflow.template.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import socket
-
-class ofsocket:
-	"""OpenFlow scoket
-	"""
-	def __init__(self, socket):
-		"""Initialize with socket
-		"""
-		##Reference to socket
-		self.socket = socket
-
-	def send(self, msg):
-		"""Send message
-		"""
-		ofph = ofp_header()
-		remaining = ofph.unpack(msg)
-		if (ofph.length != len(msg)):
-			ofph.length = len(msg)
-			msg = ofph.pack()+remaining
-		self.socket.send(msg)
-
diff --git a/tools/pylibopenflow/pylib/c2py.py b/tools/pylibopenflow/pylib/c2py.py
deleted file mode 100644
index b699c5e..0000000
--- a/tools/pylibopenflow/pylib/c2py.py
+++ /dev/null
@@ -1,154 +0,0 @@
-"""This module converts C types to Python struct pattern string.
-
-Date June 2009
-Created by ykk
-"""
-import cheader
-import struct
-
-class cstruct2py:
-    """Class converts C struct to Python struct pattern string
-
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self):
-        """Initialize
-        """
-        ##Mapping
-        self.structmap = {}
-        self.structmap["char"] = "c"
-        self.structmap["signed char"] = "b"
-        self.structmap["uint8_t"]=\
-            self.structmap["unsigned char"] = "B"
-        self.structmap["short"] = "h"
-        self.structmap["uint16_t"] =\
-            self.structmap["unsigned short"] = "H"
-        self.structmap["int"] = "i"
-        self.structmap["unsigned int"] = "I"
-        self.structmap["long"] = "l"
-        self.structmap["uint32_t"] =\
-            self.structmap["unsigned long"] = "L"
-        self.structmap["long long"] = "q"
-        self.structmap["uint64_t"] =\
-            self.structmap["unsigned long long"] = "Q"
-        self.structmap["float"] = "f"
-        self.structmap["double"] = "d"
-
-    def get_pattern(self,ctype):
-        """Get pattern string for ctype.
-        Return None if ctype is not expanded.
-        """
-        if (ctype.expanded):
-            if (isinstance(ctype, cheader.cprimitive)):
-                return self.structmap[ctype.typename]
-            elif (isinstance(ctype, cheader.cstruct)):
-                string=""
-                for member in ctype.members:
-                    string += self.get_pattern(member)
-                return string
-            elif (isinstance(ctype, cheader.carray)):
-                if (ctype.size == 0):
-                    return ""
-                else:
-                    string = self.get_pattern(ctype.object)
-                    return string * ctype.size
-        return None
-        
-    def get_size(self, ctype, prefix="!"):
-        """Return size of struct or pattern specified
-        """
-        if (isinstance(ctype, str)):
-            return struct.calcsize(ctype)
-        elif (isinstance(ctype, cheader.ctype)):
-            return struct.calcsize(prefix + self.get_pattern(ctype))
-        else:
-            return 0
-
-class structpacker:
-    """Pack/unpack packets with ctype.
-    
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, prefix=""):
-        """Initialize with prefix to struct
-        """
-        ##Reference to prefix
-        self.prefix = prefix
-        
-    def pack(self, ctype, *arg):
-        """Pack packet accordingly ctype or pattern provided.
-        Return struct packed.
-        """
-        if (isinstance(ctype, str)):
-            return struct.pack(self.prefix+ctype, *arg)
-        elif (isinstance(ctype, cheader.ctype)):
-            return struct.pack(self.prefix+cstruct2py.get_pattern(ctype),
-                               *arg)
-        else:
-            return None
-
-    def unpack_from_front(self, ctype, binaryString, returnDictionary=True):
-        """Unpack packet using front of packet,
-        accordingly ctype or pattern provided.
-
-        Return (dictionary of values indexed by arg name, 
-        remaining binary string) if ctype is cheader.ctype
-        and returnDictionary is True, 
-        else return (array of data unpacked, remaining binary string).
-        """
-        pattern = ""
-        if (isinstance(ctype, str)):
-            pattern = ctype
-        elif (isinstance(ctype, cheader.ctype)):
-            pattern = cstruct2py.get_pattern(ctype)
-        else:
-            return None
-        dsize = struct.calcsize(pattern)
-
-        if (dsize > len(binaryString)):
-            return None
-
-        return (structpacker.peek_from_front(self, pattern, binaryString, returnDictionary),
-                binaryString[dsize:])
-
-    def peek_from_front(self, ctype, binaryString, returnDictionary=True):
-        """Unpack packet using front of packet,
-        accordingly ctype or pattern provided.
-
-        Return dictionary of values indexed by arg name,
-        if ctype is cheader.ctype and returnDictionary is True, 
-        else return array of data unpacked.
-        """
-        pattern = self.prefix
-        if (isinstance(ctype, str)):
-            pattern += ctype
-        elif (isinstance(ctype, cheader.ctype)):
-            pattern += cstruct2py.get_pattern(ctype)
-        else:
-            return None
-        dsize = struct.calcsize(pattern)
-        if (dsize > len(binaryString)):
-            return None
-        data = struct.unpack(pattern, binaryString[0:dsize])
-        
-        #Return values
-        if (isinstance(ctype, str) or
-            (not returnDictionary)):
-            return data
-        else:
-            return self.data2dic(data, ctype)
-
-    def data2dic(self,ctype,data):
-        """Convert data to dictionary
-        """
-        valDic = {}
-        names = ctype.get_names()
-        for name in names:
-            valDic[name] = []
-        for d in data:
-            name = names.pop(0)
-            valDic[name].append(d)
-        return valDic
-
diff --git a/tools/pylibopenflow/pylib/cheader.py b/tools/pylibopenflow/pylib/cheader.py
deleted file mode 100644
index a23e1eb..0000000
--- a/tools/pylibopenflow/pylib/cheader.py
+++ /dev/null
@@ -1,434 +0,0 @@
-"""This module parse and store a C/C++ header file.
-
-Date June 2009
-Created by ykk
-"""
-import re
-from config import *
-
-class textfile:
-    """Class to handle text file.
-    
-    Date June 2009
-    Created by ykk
-    """
-    def __init__(self, filename):
-        """Initialize filename with no content.
-        """
-        ##Filename
-        if (isinstance(filename, str)):
-            self.filename = []
-            self.filename.append(filename)
-        else:
-            self.filename = filename
-        ##Content
-        self.content = []
-
-    def read(self):
-        """Read file
-        """
-        for filename in self.filename:
-            fileRef = open(filename, "r")
-            for line in fileRef:
-                self.content.append(line)
-            fileRef.close()        
-
-class ctype:
-    """Class to represent types in C
-    """
-    def __init__(self,typename, name=None, expanded=False):
-        """Initialize
-        """
-        ##Name
-        self.name = name
-        ##Type of primitive
-        self.typename = typename
-        ##Expanded
-        self.expanded = expanded
-
-    def expand(self, cheader):
-        """Expand type if applicable
-        """
-        raise NotImplementedError()
-
-    def get_names(self):
-        """Return name of variables
-        """
-        raise NotImplementedError()
-
-class cprimitive(ctype):
-    """Class to represent C primitive
-
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self,typename, name=None):
-        """Initialize and store primitive
-        """
-        ctype.__init__(self, typename, name, True)
-
-    def __str__(self):
-        """Return string representation
-        """
-        if (self.name == None):
-            return self.typename
-        else:
-            return self.typename+" "+str(self.name)
-
-    def expand(self, cheader):
-        """Expand type if applicable
-        """
-        pass
-    
-    def get_names(self):
-        """Return name of variables
-        """
-        namelist = []
-        namelist.append(self.name)
-        return namelist
-
-class cstruct(ctype):
-    """Class to represent C struct
-
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, typename, name=None):
-        """Initialize struct
-        """
-        ctype.__init__(self, typename, name)
-        ##List of members in struct
-        self.members = []
-    
-    def __str__(self):
-        """Return string representation
-        """
-        string = "struct "+self.typename
-        if (self.name != None):
-            string += " "+self.name
-        if (len(self.members) == 0):
-            return string
-        #Add members
-        string +=" {\n"
-        for member in self.members:
-            string += "\t"+str(member)
-            if (not isinstance(member, cstruct)):
-                string += ";"
-            string += "\n"
-        string +="};"
-        return string
-
-    def expand(self, cheader):
-        """Expand struct
-        """
-        self.expanded = True
-        #Expanded each member
-        for member in self.members:
-            if (isinstance(member, cstruct) and 
-                (not member.expanded)):
-                try:
-                    if (not cheader.structs[member.typename].expanded):
-                        cheader.structs[member.typename].expand(cheader)
-                    member.members=cheader.structs[member.typename].members[:]
-                    member.expanded = True
-                except KeyError:
-                    self.expanded=False
-            else:
-                member.expand(cheader)
-
-    def get_names(self):
-        """Return name of variables
-        """
-        namelist = []
-        for member in self.members:
-            if (isinstance(member, cstruct)):
-                tmplist = member.get_names()
-                for item in tmplist:
-                    namelist.append(member.name+"."+item)
-            else:
-                namelist.extend(member.get_names())
-        return namelist
-
-
-class carray(ctype):
-    """Class to represent C array
-
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, typename, name, isPrimitive, size):
-        """Initialize array of object.
-        """
-        ctype.__init__(self, typename, name,
-                       (isinstance(size, int) and isPrimitive))
-        ##Object reference
-        if (isPrimitive):
-            self.object = cprimitive(typename, name)
-        else:
-            self.object = cstruct(typename, name)
-        ##Size of array
-        self.size = size
-        
-    def __str__(self):
-        """Return string representation
-        """
-        return str(self.object)+"["+str(self.size)+"]"
-
-    def expand(self, cheader):
-        """Expand array
-        """
-        self.expanded = True
-        if (not self.object.expanded):
-            if (isinstance(self.object, cstruct)):
-                cheader.structs[self.object.typename].expand(cheader)
-                self.object.members=cheader.structs[self.object.typename].members[:]    
-            else:
-                self.object.expand(cheader)
-
-        if (not isinstance(self.size, int)):
-            val = cheader.get_value(self.size)
-            if (val == None):
-                self.expanded = False
-            else:
-                try:
-                    self.size = int(val)
-                except ValueError:
-                    self.size = val
-                    self.expanded = False
-
-    def get_names(self):
-        """Return name of variables
-        """
-        namelist = []
-        for i in range(0,self.size):
-            namelist.append(self.object.name)
-        return namelist
-
-class ctype_parser:
-    """Class to check c types
-
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self):
-        """Initialize
-        """
-        self.CPrimitives = ["char","signed char","unsigned char",
-                            "short","unsigned short",
-                            "int","unsigned int",
-                            "long","unsigned long",
-                            "long long","unsigned long long",
-                            "float","double",
-                            "uint8_t","uint16_t","uint32_t","uint64_t"]
-
-    def is_primitive(self,type):
-        """Check type given is primitive.
-
-        Return true if valid, and false otherwise
-        """
-        if (type in self.CPrimitives):
-            return True
-        else:
-            return False
-
-    def is_array(self, string):
-        """Check if string declares an array
-        """
-        parts=string.strip().split()
-        if (len(parts) <= 1):
-            return False
-        else:
-            pattern = re.compile("\[.*?\]", re.MULTILINE)
-            values = pattern.findall(string)
-            if (len(values) == 1):
-                return True
-            else:
-                return False
-
-    def parse_array(self, string):
-        """Parse array from string.
-        Return occurrence and name.
-        """
-        pattern = re.compile("\[.*?\]", re.MULTILINE)
-        namepattern = re.compile(".*?\[", re.MULTILINE)
-        values = pattern.findall(string)
-        if (len(values) != 1):
-            return (1,string)
-        else:
-            val = values[0][1:-1]
-            try:
-                sizeval = int(val)
-            except ValueError:
-                if (val==""):
-                    sizeval = 0
-                else:
-                    sizeval = val
-            return (sizeval,
-                    namepattern.findall(string)[0].strip()[0:-1])
-
-    def parse_type(self, string):
-        """Parse string and return cstruct or cprimitive.
-        Else return None
-        """
-        parts=string.strip().split()
-        if (len(parts) >= 2):
-            if (parts[0].strip() == "struct"):
-                typename = " ".join(parts[1:-1])
-            else:
-                typename = " ".join(parts[:-1])
-            (size, name) = self.parse_array(parts[-1])
-            if IGNORE_ZERO_ARRAYS and size == 0:
-                return None
-            #Create appropriate type
-            if (size != 1):
-                #Array
-                return carray(typename, name, 
-                              self.is_primitive(typename),size)
-            else:
-                #Not array
-                if IGNORE_OFP_HEADER and typename == "ofp_header":
-                    return None
-                if (self.is_primitive(typename)):
-                    return cprimitive(typename, name)
-                else:
-                    return cstruct(typename, name)
-        else:
-            return None
-
-class cheaderfile(textfile):
-    """Class to handle C header file.
-    
-    Date June 2009
-    Created by ykk
-    """
-    def __init__(self, filename):
-        """Initialize filename and read from file
-        """
-        textfile.__init__(self,filename)
-        self.read()
-        self.__remove_comments()
-        ##Dictionary of macros
-        self.macros = {}
-        self.__get_macros()
-        ##Dictionary of enumerations
-        self.enums = {}
-        self.enum_values = {}
-        self.__get_enum()
-        self.__get_enum_values()
-        ##Dictionary of structs
-        self.structs = {}
-        self.__get_struct()
-
-    def get_enum_name(self, enum, value):
-        """Return name of variable in enum
-        """
-        for e in self.enums[enum]:
-            if (self.enum_values[e] == value):
-                return e
-
-    def eval_value(self, value):
-        """Evaluate value string
-        """
-        try:
-            return eval(value, self.enum_values)
-        except:
-            return value.strip()
-
-    def get_value(self, name):
-        """Get value for variable name,
-        searching through enum and macros.
-        Else return None
-        """
-        try:
-            return self.enum_values[name]
-        except KeyError:
-            try:
-                return self.macros[name]
-            except KeyError:
-                return None
-
-    def __remove_comments(self):
-        """Remove all comments
-        """
-        fileStr = "".join(self.content)
-        pattern = re.compile("\\\.*?\n", re.MULTILINE)
-        fileStr = pattern.sub("",fileStr)
-        pattern = re.compile(r"/\*.*?\*/", re.MULTILINE|re.DOTALL)
-        fileStr = pattern.sub("",fileStr)
-        pattern = re.compile("//.*$", re.MULTILINE)
-        fileStr = pattern.sub("",fileStr)
-        self.content = fileStr.split('\n')
-
-    def __get_struct(self):
-        """Get all structs
-        """
-        typeparser = ctype_parser()
-        fileStr = "".join(self.content)
-        #Remove attribute
-        attrpattern = re.compile("} __attribute__ \(\((.+?)\)\);", re.MULTILINE)
-        attrmatches = attrpattern.findall(fileStr)
-        for amatch in attrmatches:
-            fileStr=fileStr.replace(" __attribute__ (("+amatch+"));",";")
-        #Find all structs
-        pattern = re.compile("struct[\w\s]*?{.*?};", re.MULTILINE)
-        matches = pattern.findall(fileStr)
-        #Process each struct
-        namepattern = re.compile("struct(.+?)[ {]", re.MULTILINE)
-        pattern = re.compile("{(.+?)};", re.MULTILINE)
-        for match in matches:
-            structname = namepattern.findall(match)[0].strip()
-            if (len(structname) != 0):
-                values = pattern.findall(match)[0].strip().split(";")
-                cstru = cstruct(structname)
-                for val in values:
-                    presult = typeparser.parse_type(val)
-                    if (presult != None):
-                        cstru.members.append(presult)
-                self.structs[structname] = cstru
-        #Expand all structs
-        for (structname, struct) in self.structs.items():
-            struct.expand(self)
-
-    def __get_enum(self):
-        """Get all enumeration
-        """
-        fileStr = "".join(self.content)
-        #Find all enumerations
-        pattern = re.compile("enum[\w\s]*?{.*?}", re.MULTILINE)
-        matches = pattern.findall(fileStr)
-        #Process each enumeration
-        namepattern = re.compile("enum(.+?){", re.MULTILINE)
-        pattern = re.compile("{(.+?)}", re.MULTILINE)
-        for match in matches:
-            values = pattern.findall(match)[0].strip().split(",")
-            #Process each value in enumeration
-            enumList = []
-            value = 0
-            for val in values:
-                if not (val.strip() == ""):
-                    valList=val.strip().split("=")
-                    enumList.append(valList[0].strip())
-                    if (len(valList) == 1):
-                        self.enum_values[valList[0].strip()] = value
-                        value += 1
-                    else:
-                        self.enum_values[valList[0].strip()] = self.eval_value(valList[1].strip())
-                    self.enums[namepattern.findall(match)[0].strip()] = enumList
-
-    def __get_enum_values(self):
-        """Patch unresolved enum values
-        """
-        for name,enumval in self.enum_values.items():
-            if isinstance(enumval,str):
-                self.enum_values[name] = self.eval_value(enumval)
-        
-    def __get_macros(self):
-        """Extract macros
-        """
-        for line in self.content:
-            if (line[0:8] == "#define "):
-                lineList = line[8:].split()
-                if (len(lineList) >= 2):
-                    self.macros[lineList[0]] = self.eval_value("".join(lineList[1:]))
-                else:
-                    self.macros[lineList[0]] = ""
diff --git a/tools/pylibopenflow/pylib/config.py b/tools/pylibopenflow/pylib/config.py
deleted file mode 100644
index 61c903d..0000000
--- a/tools/pylibopenflow/pylib/config.py
+++ /dev/null
@@ -1,29 +0,0 @@
-
-# of_message specific controls
-
-# Do not include any arrays marked [0]
-IGNORE_ZERO_ARRAYS = True
-
-# Do not include the ofp_header as a member in any structure
-# This allows messages to be consistently generated as:
-#   explicit header declaration
-#   core member declaration
-#   variable length data
-IGNORE_OFP_HEADER = True
-
-# Generate object equality functions
-GEN_OBJ_EQUALITY = True
-
-# Generate object show functions
-GEN_OBJ_SHOW = True
-
-# Generate lists of enum values
-GEN_ENUM_VALUES_LIST = False
-
-# Generate dictionary of enum strings to values
-GEN_ENUM_DICTIONARY = True
-
-# Auxilary info:  Stuff written to stdout for additional processing
-# Currently generates a (python) map from a class to a list of
-# the data members; used for documentation
-GEN_AUX_INFO = True
diff --git a/tools/pylibopenflow/pylib/cpythonize.py b/tools/pylibopenflow/pylib/cpythonize.py
deleted file mode 100644
index 22b5214..0000000
--- a/tools/pylibopenflow/pylib/cpythonize.py
+++ /dev/null
@@ -1,571 +0,0 @@
-"""This module generate Python code for C structs.
-
-Date January 2010
-Created by ykk
-"""
-import sys
-import cheader
-import c2py
-import datetime
-import struct
-import re
-from config import *
-
-def _space_to(n, str):
-    """
-    Generate a string of spaces to achieve width n given string str
-    If length of str >= n, return one space
-    """
-    spaces = n - len(str)
-    if spaces > 0:
-        return " " * spaces
-    return " "
-
-class rules:
-    """Class that specify rules for pythonization
-
-    Date January 2010
-    Created by ykk
-    """
-    def __init__(self):
-        """Initialize rules
-        """
-        ##Default values for members
-        self.default_values = {}
-        #Default values for struct
-        self.struct_default = {}
-        ##What is a tab
-        self.tab = "    "
-        ##Macros to exclude
-        self.excluded_macros = []
-        ##Enforce mapping
-        self.enforced_maps = {}
-
-    def get_enforced_map(self, structname):
-        """Get code to enforce mapping
-        """
-        code = []
-        try:
-            mapping = self.enforced_maps[structname]
-        except KeyError:
-            return None
-        for (x,xlist) in mapping:
-            code.append("if (not (self."+x+" in "+xlist+")):")
-            code.append(self.tab+"return (False, \""+x+" must have values from "+xlist+"\")")
-        return code
-        
-
-    def get_struct_default(self, structname, fieldname):
-        """Get code to set defaults for member struct
-        """
-        try:
-            return "."+fieldname+self.struct_default[(structname, fieldname)]
-        except KeyError:
-            return None
-        
-    def get_default_value(self, structname, fieldname):
-        """Get default value for struct's field
-        """
-        try:
-            return self.default_values[(structname, fieldname)]
-        except KeyError:
-            return 0
-
-    def include_macro(self, name):
-        """Check if macro should be included
-        """
-        return not (name in self.excluded_macros)
-
-class pythonizer:
-    """Class that pythonize C structures
-
-    Date January 2010
-    Created by ykk
-    """
-    def __init__(self, cheaderfile, pyrules = None, tab="    "):
-        """Initialize
-        """
-        ##Rules
-        if (pyrules == None):
-            self.rules = rules()
-        else:
-            self.rules = pyrules
-        ##What is a tab (same as rules)
-        self.tab = str(tab)
-        self.rules.tab = self.tab
-        ##Reference to C header file
-        self.cheader = cheaderfile
-        ##Reference to cstruct2py
-        self.__c2py = c2py.cstruct2py()
-        ##Code for assertion
-        self.__assertcode = []
-
-    def pycode(self,preamble=None):
-        """Return pythonized code
-        """
-        code = []
-        code.append("import struct")
-        code.append("")
-        if (preamble != None):
-            fileRef = open(preamble,"r")
-            for l in fileRef:
-                code.append(l[:-1])
-            fileRef.close()
-        code.append("# Structure definitions")
-        for name,struct in self.cheader.structs.items():
-            code.extend(self.pycode_struct(struct))
-            code.append("")
-        code.append("# Enumerated type definitions")
-        for name,enum in self.cheader.enums.items():
-            code.extend(self.pycode_enum(name,enum))
-            if GEN_ENUM_DICTIONARY:
-                code.extend(self.pycode_enum_map(name,enum))
-            code.append("")
-        code.append("# Values from macro definitions")
-        for name,macro in self.cheader.macros.items():
-            code.extend(self.pycode_macro(name))
-        code.append("")
-        code.append("# Basic structure size definitions.")
-        if IGNORE_OFP_HEADER:
-            code.append("# Does not include ofp_header members.")
-        if IGNORE_ZERO_ARRAYS:
-            code.append("# Does not include variable length arrays.")
-        struct_keys = self.cheader.structs.keys()
-        struct_keys.sort()
-        for name in struct_keys:
-            struct = self.cheader.structs[name]
-            code.append(self.pycode_struct_size(name, struct))
-        if GEN_AUX_INFO:
-            self.gen_struct_map()
-
-        return code
-
-    def pycode_enum(self, name, enum):
-        """Return Python array for enum
-        """
-        code=[]
-        code.append(name+" = "+str(enum))
-        ev = []
-        for e in enum:
-            v = self.cheader.get_value(e)
-            ev.append(v)
-            code.append(e+"%s= "%_space_to(36,e)+str(v))
-        if GEN_ENUM_VALUES_LIST:
-            code.append(name+"_values = "+str(ev))
-        return code
-
-    def pycode_enum_map(self, name, enum):
-        """Return Python dictionary for enum
-        """
-        code = []
-        code.append(name+"_map = {")
-        first = 1
-        for e in enum:
-            v = self.cheader.get_value(e)
-            if first:
-                prev_e = e
-                prev_v = v
-                first = 0
-            else:
-                code.append(self.tab + "%s%s: '%s'," %
-                            (prev_v, _space_to(32, str(prev_v)), prev_e))
-                prev_e = e
-                prev_v = v
-        code.append(self.tab + "%s%s: '%s'" %
-                            (prev_v, _space_to(32, str(prev_v)), prev_e))
-        code.append("}")
-        return code
-
-    def pycode_macro(self,name):
-        """Return Python dict for macro
-        """
-        code = []
-        if (self.rules.include_macro(name)):
-            code.append(name+" = "+str(self.cheader.get_value(name)))
-        return code
-
-    def pycode_struct_size(self, name, struct):
-        """Return one liner giving the structure size in bytes
-        """
-        pattern = '!' + self.__c2py.get_pattern(struct)
-        bytes = self.__c2py.get_size(pattern)
-        code = name.upper() + "_BYTES = " + str(bytes)
-        return code
-
-    def pycode_struct(self, struct_in):
-        """Return Python class code given C struct.
-
-        Returns None if struct_in is not cheader.cstruct.
-        Else return list of strings that codes Python class.
-        """
-        if (not isinstance(struct_in, cheader.cstruct)):
-            return None
-
-        code=[]
-        self.__assertcode = []
-        code.extend(self.codeheader(struct_in))
-        code.extend(self.codeinit(struct_in))
-        code.append("")
-        code.extend(self.codeassert(struct_in))
-        code.append("")
-        code.extend(self.codepack(struct_in))
-        code.append("")
-        code.extend(self.codeunpack(struct_in))
-        code.append("")
-        code.extend(self.codelen(struct_in))
-        code.append("")
-        if GEN_OBJ_EQUALITY:
-            code.extend(self.codeeq(struct_in))
-            code.append("")
-        if GEN_OBJ_SHOW:
-            code.extend(self.codeshow(struct_in))
-            code.append("")
-        return code
-
-    def codeheader(self, struct_in):
-        """Return Python code for header
-        """
-        code=[]
-        code.append("class "+struct_in.typename+":")
-        code.append(self.tab+"\"\"\"Automatically generated Python class for "+struct_in.typename)
-        code.append("")
-        code.append(self.tab+"Date "+str(datetime.date.today()))
-        code.append(self.tab+"Created by "+self.__module__+"."+self.__class__.__name__)
-        if IGNORE_OFP_HEADER:
-            code.append(self.tab+"Core structure: Messages do not include ofp_header")
-        if IGNORE_ZERO_ARRAYS:
-            code.append(self.tab+"Does not include var-length arrays")
-        code.append(self.tab+"\"\"\"")
-        return code
-
-    def codeinit(self, struct_in):
-        """Return Python code for init function
-        """
-        code = []
-        code.append(self.tab+"def __init__(self):")
-        code.append(self.tab*2+"\"\"\"Initialize")
-        code.append(self.tab*2+"Declare members and default values")
-        code.append(self.tab*2+"\"\"\"")
-        code.extend(self.codemembers(struct_in,self.tab*2+"self"))
-        return code
-
-    def codemembers(self, struct_in, prepend=""):
-        """Return members of class
-        """
-        code = []
-        for member in struct_in.members:
-            if (isinstance(member, cheader.cstruct)):
-                code.append(prepend+"."+member.name+" = "+member.typename+"()")
-                struct_default = self.rules.get_struct_default(struct_in.typename, member.name)
-                if (struct_default != None):
-                    code.append(prepend+struct_default)
-                self.__structassert(member, (prepend+"."+member.name).strip())
-            elif (isinstance(member, cheader.carray)):
-                if (member.typename == "char"):
-                    initvalue = "\"\""
-                    self.__stringassert(member, (prepend+"."+member.name).strip())
-                else:
-                    if (isinstance(member.object, cheader.cprimitive)):
-                        initvalue="0"
-                    else:
-                        initvalue="None"
-                    initvalue=(initvalue+",")*member.size
-                    initvalue="["+initvalue[:-1]+"]"
-                    self.__arrayassert(member, (prepend+"."+member.name).strip())
-                code.append(prepend+"."+member.name+"= "+initvalue)
-            else:
-                code.append(prepend+"."+member.name+" = "+
-                            str(self.rules.get_default_value(struct_in.typename, member.name)))
-        return code
-
-    def gen_struct_map(self, file=None):
-        if not file:
-            file = sys.stdout
-        print >> file
-        print >> file, "# Class to array member map"
-        print >> file, "class_to_members_map = {"
-        for name, struct in self.cheader.structs.items():
-            if not len(struct.members):
-                continue
-            s =  "    '" + name + "'"
-            print >> file, s + _space_to(36, s) + ": ["
-            prev = None
-            for member in struct.members:
-                if re.search('pad', member.name):
-                    continue
-                if prev:
-                    print _space_to(39, "") + "'" + prev + "',"
-                prev = member.name
-            print >> file, _space_to(39, "") + "'" + prev + "'"
-            print >> file, _space_to(38, "") + "],"
-        print >> file, "    '_ignore' : []"
-        print >> file, "}"
-
-    def __structassert(self, cstruct, cstructname):
-        """Return code to check for C array
-        """
-        self.__assertcode.append(self.tab*2+"if(not isinstance("+cstructname+", "+cstruct.typename+")):")
-        self.__assertcode.append(self.tab*3+"return (False, \""+cstructname+" is not class "+cstruct.typename+" as expected.\")")        
-
-    def __addassert(self, prefix):
-        code = []
-        code.append(prefix+"if(not self.__assert()[0]):")
-        code.append(prefix+self.tab+"return None")        
-        return code
-
-    def __stringassert(self, carray, carrayname):
-        """Return code to check for C array
-        """
-        self.__assertcode.append(self.tab*2+"if(not isinstance("+carrayname+", str)):")
-        self.__assertcode.append(self.tab*3+"return (False, \""+carrayname+" is not string as expected.\")")        
-        self.__assertcode.append(self.tab*2+"if(len("+carrayname+") > "+str(carray.size)+"):")      
-        self.__assertcode.append(self.tab*3+"return (False, \""+carrayname+" is not of size "+str(carray.size)+" as expected.\")")
-
-    def __arrayassert(self, carray, carrayname):
-        """Return code to check for C array
-        """
-        if (carray.size == 0):
-            return
-        self.__assertcode.append(self.tab*2+"if(not isinstance("+carrayname+", list)):")
-        self.__assertcode.append(self.tab*3+"return (False, \""+carrayname+" is not list as expected.\")")
-        self.__assertcode.append(self.tab*2+"if(len("+carrayname+") != "+str(carray.size)+"):")
-        self.__assertcode.append(self.tab*3+"return (False, \""+carrayname+" is not of size "+str(carray.size)+" as expected.\")") 
-
-    def codeassert(self, struct_in):
-        """Return code for sanity checking
-        """
-        code = []
-        code.append(self.tab+"def __assert(self):")
-        code.append(self.tab*2+"\"\"\"Sanity check")
-        code.append(self.tab*2+"\"\"\"")
-        enforce = self.rules.get_enforced_map(struct_in.typename)
-        if (enforce != None):
-            for line in enforce:
-                code.append(self.tab*2+line)
-        code.extend(self.__assertcode)
-        code.append(self.tab*2+"return (True, None)")
-        return code
-
-    def codepack(self, struct_in, prefix="!"):
-        """Return code that pack struct
-        """
-        code = []
-        code.append(self.tab+"def pack(self, assertstruct=True):")
-        code.append(self.tab*2+"\"\"\"Pack message")
-        code.append(self.tab*2+"Packs empty array used as placeholder")
-        code.append(self.tab*2+"\"\"\"")
-        code.append(self.tab*2+"if(assertstruct):")
-        code.extend(self.__addassert(self.tab*3))
-        code.append(self.tab*2+"packed = \"\"")
-        primPattern = ""
-        primMemberNames = []
-        for member in struct_in.members:
-            if (isinstance(member, cheader.cprimitive)):
-                #Primitives
-                primPattern += self.__c2py.structmap[member.typename]
-                primMemberNames.append("self."+member.name)
-            else:
-                (primPattern, primMemberNames) = \
-                              self.__codepackprimitive(code, primPattern,
-                                                       primMemberNames, prefix)
-                if (isinstance(member, cheader.cstruct)):
-                    #Struct
-                    code.append(self.tab*2+"packed += self."+member.name+".pack()")
-                elif (isinstance(member, cheader.carray) and member.typename == "char"):
-                    #String
-                    code.append(self.tab*2+"packed += self."+member.name+".ljust("+\
-                                str(member.size)+",'\\0')")
-                elif (isinstance(member, cheader.carray) and \
-                      isinstance(member.object, cheader.cprimitive)):
-                    #Array of Primitives
-                    expandedarr = ""
-                    if (member.size != 0):
-                        for x in range(0, member.size):
-                            expandedarr += ", self."+member.name+"["+\
-                                           str(x).strip()+"]"
-                        code.append(self.tab*2+"packed += struct.pack(\""+prefix+\
-                                    self.__c2py.structmap[member.object.typename]*member.size+\
-                                    "\""+expandedarr+")")
-                    else:
-                        code.append(self.tab*2+"for i in self."+member.name+":")
-                        code.append(self.tab*3+"packed += struct.pack(\""+\
-                                    prefix+self.__c2py.get_pattern(member.object)+\
-                                    "\",i)")
-                elif (isinstance(member, cheader.carray) and \
-                      isinstance(member.object, cheader.cstruct)):
-                    #Array of struct
-                    if (member.size != 0):
-                        for x in range(0, member.size):
-                            code.append(self.tab*2+"packed += self."+member.name+"["+\
-                                        str(x).strip()+"].pack()")
-                    else:
-                        code.append(self.tab*2+"for i in self."+member.name+":")
-                        code.append(self.tab*3+"packed += i.pack(assertstruct)")
-        #Clear remaining fields
-        (primPattern, primMemberNames) = \
-                      self.__codepackprimitive(code, primPattern,
-                                               primMemberNames, prefix)
-        code.append(self.tab*2+"return packed")
-        return code
-
-    def __codepackprimitive(self, code, primPattern, primMemberNames, prefix):
-        """Return code for packing primitives
-        """
-        if (primPattern != ""):
-            #Clear prior primitives
-            code.append(self.tab*2+"packed += struct.pack(\""+\
-                        prefix+primPattern+"\", "+\
-                        str(primMemberNames).replace("'","")[1:-1]+")")
-        return ("",[])
-
-    def codelen(self, struct_in):
-        """Return code to return length
-        """
-        pattern = "!" + self.__c2py.get_pattern(struct_in)
-        code = []
-        code.append(self.tab+"def __len__(self):")
-        code.append(self.tab*2+"\"\"\"Return length of message")
-        code.append(self.tab*2+"\"\"\"")
-        code.append(self.tab*2+"l = "+str(self.__c2py.get_size(pattern)))
-        for member in struct_in.members:
-            if (isinstance(member, cheader.carray) and member.size == 0):
-                if (isinstance(member.object, cheader.cstruct)):
-                    code.append(self.tab*2+"for i in self."+member.name+":")
-                    # FIXME:  Is this right?  Doesn't seem to be called
-                    code.append(self.tab*3+"l += i.length()")
-                else:
-                    pattern="!"+self.__c2py.get_pattern(member.object)
-                    size=self.__c2py.get_size(pattern)
-                    code.append(self.tab*2+"l += len(self."+member.name+")*"+str(size))
-        code.append(self.tab*2+"return l")
-        return code
-
-    def codeeq(self, struct_in):
-        """Return code to return equality comparisons
-        """
-        code = []
-        code.append(self.tab+"def __eq__(self, other):")
-        code.append(self.tab*2+"\"\"\"Return True if self and other have same values")
-        code.append(self.tab*2+"\"\"\"")
-        code.append(self.tab*2+"if type(self) != type(other): return False")
-        for member in struct_in.members:
-            code.append(self.tab*2 + "if self." + member.name + " !=  other." +
-                        member.name + ": return False")
-        code.append(self.tab*2+"return True")
-        code.append("")
-        code.append(self.tab+"def __ne__(self, other): return not self.__eq__(other)")
-        return code
-
-    def codeshow(self, struct_in):
-        """Return code to print basic members of structure
-        """
-        code = []
-        code.append(self.tab+"def show(self, prefix=''):")
-        code.append(self.tab*2+"\"\"\"" + "Generate string showing basic members of structure")
-        code.append(self.tab*2+"\"\"\"")
-        code.append(self.tab*2+"outstr = ''")
-        for member in struct_in.members:
-            if re.search('pad', member.name):
-                continue
-            elif (isinstance(member, cheader.cstruct)):
-                code.append(self.tab*2 + "outstr += prefix + '" + 
-                            member.name + ": \\n' ")
-                code.append(self.tab*2 + "outstr += self." + member.name + 
-                            ".show(prefix + '  ')")
-            elif (isinstance(member, cheader.carray) and
-                  not isinstance(member.object, cheader.cprimitive)):
-                code.append(self.tab*2 + "outstr += prefix + '" + member.name +
-                            ": \\n' ")
-                code.append(self.tab*2 + "for obj in self." + member.name + ":")
-                code.append(self.tab*3 + "outstr += obj.show(prefix + '  ')")
-            else:
-                code.append(self.tab*2 + "outstr += prefix + '" + member.name +
-                            ": ' + str(self." + member.name + ") + '\\n'")
-        code.append(self.tab*2+"return outstr")
-        return code
-
-    def codeunpack(self, struct_in, prefix="!"):
-        """Return code that unpack struct
-        """
-        pattern = self.__c2py.get_pattern(struct_in)
-        structlen = self.__c2py.get_size(prefix + pattern)
-        code = []
-        code.append(self.tab+"def unpack(self, binaryString):")
-        code.append(self.tab*2+"\"\"\"Unpack message")
-        code.append(self.tab*2+"Do not unpack empty array used as placeholder")
-        code.append(self.tab*2+"since they can contain heterogeneous type")
-        code.append(self.tab*2+"\"\"\"")
-        code.append(self.tab*2+"if (len(binaryString) < "+str(structlen)+"):")
-        code.append(self.tab*3+"return binaryString")
-        offset = 0
-        primPattern = ""
-        primMemberNames = []
-        for member in struct_in.members:
-            if (isinstance(member, cheader.cprimitive)):
-                #Primitives
-                primPattern += self.__c2py.structmap[member.typename]
-                primMemberNames.append("self."+member.name)
-            else:
-                (primPattern, primMemberNames, offset) = \
-                              self.__codeunpackprimitive(code, offset, primPattern,
-                                                         primMemberNames, prefix)
-                if (isinstance(member, cheader.cstruct)):
-                    #Struct
-                    code.append(self.tab*2+"self."+member.name+\
-                                ".unpack(binaryString["+str(offset)+":])")
-                    pattern = self.__c2py.get_pattern(member)
-                    offset += self.__c2py.get_size(prefix+pattern)
-                elif (isinstance(member, cheader.carray) and member.typename == "char"):
-                    #String
-                    code.append(self.tab*2+"self."+member.name+\
-                                " = binaryString["+str(offset)+":"+\
-                                str(offset+member.size)+"].replace(\"\\0\",\"\")")
-                    offset += member.size
-                elif (isinstance(member, cheader.carray) and \
-                      isinstance(member.object, cheader.cprimitive)):
-                    #Array of Primitives
-                    expandedarr = ""
-                    if (member.size != 0):
-                        arrpattern = self.__c2py.structmap[member.object.typename]*member.size
-                        for x in range(0, member.size):
-                            expandedarr += "self."+member.name+"["+\
-                                           str(x).strip()+"], "
-                        code.append(self.tab*2 + "fmt = '" + prefix+arrpattern + "'")
-                        code.append(self.tab*2 + "start = " + str(offset))
-                        code.append(self.tab*2 + "end = start + struct.calcsize(fmt)")
-                        code.append(self.tab*2 + "("+expandedarr[:-2] + 
-                                    ") = struct.unpack(fmt, binaryString[start:end])")
-                        offset += struct.calcsize(prefix + arrpattern)
-                elif (isinstance(member, cheader.carray) and \
-                      isinstance(member.object, cheader.cstruct)):
-                    #Array of struct
-                    astructlen = self.__c2py.get_size("!"+self.__c2py.get_pattern(member.object))
-                    for x in range(0, member.size):
-                        code.append(self.tab*2+"self."+member.name+"["+str(x)+"]"+\
-                                ".unpack(binaryString["+str(offset)+":])")
-                        offset += astructlen
-        #Clear remaining fields
-        (primPattern, primMemberNames, offset) = \
-                      self.__codeunpackprimitive(code, offset, primPattern,
-                                                 primMemberNames, prefix)
-        code.append(self.tab*2+"return binaryString["+str(structlen)+":]");
-        return code
-
-    def __codeunpackprimitive(self, code, offset, primPattern,
-                              primMemberNames, prefix):
-        """Return code for unpacking primitives
-        """
-        if (primPattern != ""):
-            #Clear prior primitives
-            code.append(self.tab*2 + "fmt = '" + prefix + primPattern + "'")
-            code.append(self.tab*2 + "start = " + str(offset))
-            code.append(self.tab*2 + "end = start + struct.calcsize(fmt)")
-            if len(primMemberNames) == 1:
-                code.append(self.tab*2 + "(" + str(primMemberNames[0]) + 
-                            ",) = struct.unpack(fmt, binaryString[start:end])")
-            else:
-                code.append(self.tab*2+"("+str(primMemberNames).replace("'","")[1:-1]+
-                            ") = struct.unpack(fmt,  binaryString[start:end])")
-
-        return ("",[], offset+struct.calcsize(prefix+primPattern))
-
diff --git a/tools/pylibopenflow/pylib/lavi/__init__.py b/tools/pylibopenflow/pylib/lavi/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tools/pylibopenflow/pylib/lavi/__init__.py
+++ /dev/null
diff --git a/tools/pylibopenflow/pylib/lavi/pythonize.py b/tools/pylibopenflow/pylib/lavi/pythonize.py
deleted file mode 100644
index 3c150aa..0000000
--- a/tools/pylibopenflow/pylib/lavi/pythonize.py
+++ /dev/null
@@ -1,74 +0,0 @@
-"""This module generate Python code for LAVI and messenger
-
-(C) Copyright Stanford University
-Date January 2010
-Created by ykk
-"""
-import cpythonize
-
-class msgrules(cpythonize.rules):
-    """Class that specify rules for pythonization of messenger
-
-    (C) Copyright Stanford University
-    Date January 2010
-    Created by ykk
-    """
-    def __init__(self):
-        """Initialize rules
-        """
-        cpythonize.rules.__init__(self)
-        ##Default values for members
-        #Default values for struct
-        ##Macros to exclude
-        self.excluded_macros = ['MESSAGE_HH__']
-        ##Enforce mapping
-        self.enforced_maps['messenger_msg'] = [ ('type','msg_type') ]
-
-class lavirules(msgrules):
-    """Class that specify rules for pythonization of LAVI messages
-
-    (C) Copyright Stanford University
-    Date January 2010
-    Created by ykk
-    """
-    def __init__(self, laviheader):
-        """Initialize rules
-        """
-        msgrules.__init__(self)
-        ##Default values for members
-        
-        #Default values for struct
-        self.struct_default[('lavi_poll_message',
-                             'header')] = ".type = "+str(laviheader.get_value('LAVIT_POLL'))
-        self.struct_default[('lavi_poll_stop_message',
-                             'header')] = ".type = "+str(laviheader.get_value('LAVIT_POLL_STOP'))
-        ##Macros to exclude
-        self.excluded_macros = ['LAVI_MSG_HH']
-        ##Enforce mapping
-        self.enforced_maps['lavi_header'] = [ ('type','lavi_type') ]
-
-class msgpythonizer(cpythonize.pythonizer):
-    """Class that pythonize C messenger messages
-
-    (C) Copyright Stanford University
-    Date January 2010
-    Created by ykk
-    """
-    def __init__(self, msgheader):
-        """Initialize
-        """
-        rules =  msgrules()
-        cpythonize.pythonizer.__init__(self, msgheader, rules)
-        
-class lavipythonizer(cpythonize.pythonizer):
-    """Class that pythonize C messenger messages
-
-    (C) Copyright Stanford University
-    Date December 2009
-    Created by ykk
-    """
-    def __init__(self, msgheader):
-        """Initialize
-        """
-        rules =  lavirules(msgheader)
-        cpythonize.pythonizer.__init__(self, msgheader, rules)
diff --git a/tools/pylibopenflow/pylib/of/__init__.py b/tools/pylibopenflow/pylib/of/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tools/pylibopenflow/pylib/of/__init__.py
+++ /dev/null
diff --git a/tools/pylibopenflow/pylib/of/msg.py b/tools/pylibopenflow/pylib/of/msg.py
deleted file mode 100644
index 8617f56..0000000
--- a/tools/pylibopenflow/pylib/of/msg.py
+++ /dev/null
@@ -1,117 +0,0 @@
-"""This module parses OpenFlow packets.
-
-Unfortunately, this has to be updated manually for each OpenFlow version
-and packet type.  Ugly.
-
-(C) Copyright Stanford University
-Date October 2009
-Created by ykk
-"""
-class parser:
-    """Parser for  OpenFlow packets
-    
-    (C) Copyright Stanford University
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, messages):
-        """Initialize
-        """
-        ##Internal reference to OpenFlow messages
-        self.__messages = messages
-
-    def describe(self, packet):
-        """Parse OpenFlow packet and return string description
-        """
-        dic = self.__messages.peek_from_front("ofp_header", packet)
-        desc = self.header_describe(dic)
-        if (dic["type"][0] == self.__messages.get_value("OFPT_HELLO")):
-            pass
-        elif (dic["type"][0] == self.__messages.get_value("OFPT_SET_CONFIG")):
-            desc += "\n\t"+self.switch_config_describe(packet)
-        elif (dic["type"][0] == self.__messages.get_value("OFPT_FLOW_MOD")):
-            (fmdic, remaining) = self.__messages.unpack_from_front("ofp_flow_mod", packet)
-            desc += self.flow_mod_describe(fmdic, "\n\t")
-            desc += "\n\twith remaining "+str(len(remaining))+" bytes"
-        else:
-            desc += "\n\tUnparsed..."
-        return desc
-
-    def flow_mod_describe(self, packet, prefix=""):
-        """Parse flow mod and return description
-        """
-        dic = self.__assert_dic(packet, "ofp_flow_mod")
-        if (dic == None):
-            return ""
-        return prefix+\
-               "Flow_mod of command "+self.__messages.get_enum_name("ofp_flow_mod_command", dic["command"][0])+\
-               " idle/hard timeout:"+str(dic["idle_timeout"][0])+"/"+str(dic["hard_timeout"][0])+\
-               self.match_describe(dic, "match.", "\n\t")+\
-               prefix+\
-               "(priority:"+str(dic["priority"][0])+\
-               "/buffer id:"+str(dic["buffer_id"][0])+\
-               "/out port:"+str(dic["out_port"][0])+")"
-
-    def match_describe(self, dic, nameprefix="", prefix=""):
-        """Return description for ofp match
-        """
-        return prefix+"match wildcards:%x" % dic[nameprefix+"wildcards"][0]+\
-               " inport="+str(dic[nameprefix+"in_port"][0])+\
-               prefix+"     "+\
-               " ethertype="+str(dic[nameprefix+"dl_type"][0])+\
-               " vlan="+str(dic[nameprefix+"dl_vlan"][0])+\
-               " "+self.eth_describe(dic[nameprefix+"dl_src"])+"->"+\
-               self.eth_describe(dic[nameprefix+"dl_dst"])+\
-               prefix+"     "+\
-               " ipproto="+str(dic[nameprefix+"nw_proto"][0])+\
-               " "+self.ip_describe(dic[nameprefix+"nw_src"][0])+\
-               "->"+self.ip_describe(dic[nameprefix+"nw_src"][0])+\
-               prefix+"     "+\
-               " transport "+str(dic[nameprefix+"tp_src"][0])+\
-               "->"+str(dic[nameprefix+"tp_dst"][0])
-               
-    def switch_config_describe(self, packet):
-        """Parse OpenFlow switch config and return description
-        """
-        dic = self.__assert_dic(packet, "ofp_switch_config")
-        if (dic == None):
-            return ""
-        return "with flag "+str(self.__messages.get_enum_name("ofp_config_flags", dic["flags"][0]))+\
-               " and miss send length "+str(dic["miss_send_len"][0])
-        
-    def header_describe(self, packet):
-        """Parse OpenFlow header and return string description
-        """
-        dic = self.__assert_dic(packet, "ofp_header")
-        if (dic == None):
-            return ""
-        return self.__messages.get_enum_name("ofp_type", dic["type"][0])+" packet "+\
-               "(length:"+str(dic["length"][0])+\
-               "/xid:"+str(dic["xid"][0])+")"
-
-    def ip_describe(self, value):
-        """Return string for ip address
-        """
-        desc = ""
-        for i in range(0,4):
-            (value, cv) = divmod(value, 256)
-            desc = str(cv).strip() +"." + desc
-        return desc
-    
-    def eth_describe(self, etheraddr):
-        """Return string for ethernet address
-        """
-        desc = ""
-        for value in etheraddr:
-            desc += ":"+("%x" % value).zfill(2)
-        return desc[1:]
-
-    def __assert_dic(self, packet, typename):
-        """Assert and ensure dictionary is given
-        """
-        dic = None
-        if (isinstance(packet, str)):
-            dic = self.__messages.peek_from_front(typename, packet)
-        elif (isinstance(packet, dict)):
-            dic = packet
-        return dic
diff --git a/tools/pylibopenflow/pylib/of/network.py b/tools/pylibopenflow/pylib/of/network.py
deleted file mode 100644
index 6765a12..0000000
--- a/tools/pylibopenflow/pylib/of/network.py
+++ /dev/null
@@ -1,191 +0,0 @@
-"""This module holds the network.
-
-Copyright(C) 2009, Stanford University
-Date October 2009
-Created by ykk
-"""
-import random
-import openflow
-
-class network:
-    """Class holding information about OpenFlow network
-    """
-    def __init__(self):
-        """Initialize
-        """
-        ##List of switches
-        self.switches = []
-        ##Dictionary of links
-        self.links = {}
-        ##Reference to connections
-        self.connections = openflow.connections()
-
-    def add_switch(self, sw):
-        """Add switch to network
-        """
-        self.switches.append(sw)
-        self.connections.add_connection(sw, sw.connection)
-
-    def add_link(self, link):
-        """Add link to network
-        """
-        try:
-            self.links[link.switch1,link.switch2].append(link)
-        except KeyError:
-            self.links[link.switch1,link.switch2] = []
-            self.links[link.switch1,link.switch2].append(link)
-
-class link:
-    """Class to hold information about link
-
-    Copyright(C) 2009, Stanford University
-    Date November 2009
-    Created by ykk
-    """
-    def __init__(self, switch1, switch2):
-        """Initialize link between specified switches
-        """
-        ##Reference to first switch
-        self.switch1 = switch1
-        ##Reference to second switch
-        self.switch2 = switch2
-
-class switch:
-    """Class holding information about OpenFlow switch
-
-    Copyright(C) 2009, Stanford University
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, miss_send_len=128,
-                 sock=None, dpid=None, n_buffers=100, n_tables=1,
-                 capability=None):
-        """Initialize switch
-        """
-        ##Socket to controller
-        self.sock = sock
-        ##Datapath id of switch
-        if (dpid != None):
-            self.datapath_id = dpid
-        else:
-            self.datapath_id = random.randrange(1, pow(2,64))
-        ##Number of buffers
-        self.n_buffers = n_buffers
-        ##Number of tables
-        self.n_tables= n_tables
-        ##Capabilities
-        if (isinstance(capability, switch_capabilities)):
-            self.capability = capability
-        else:
-            self.capability = switch_capabilities(miss_send_len)
-        ##Valid Actions
-        self.valid_actions = 0
-        ##List of port
-        self.port = []
-
-class switch_capabilities:
-    """Class to hold switch capabilities
-    """
-    def __init__(self, miss_send_len=128):
-        """Initialize
-
-        Copyright(C) 2009, Stanford University
-        Date October 2009
-        Created by ykk
-        """
-        ##Capabilities support by datapath
-        self.flow_stats = True
-        self.table_stats = True
-        self.port_stats = True
-        self.stp = True
-        self.multi_phy_tx = True
-        self.ip_resam = False
-        ##Switch config
-        self.send_exp = None
-        self.ip_frag = 0
-        self.miss_send_len = miss_send_len
-        ##Valid actions
-        self.act_output = True
-        self.act_set_vlan_vid = True
-        self.act_set_vlan_pcp = True
-        self.act_strip_vlan = True
-        self.act_set_dl_src = True
-        self.act_set_dl_dst = True
-        self.act_set_nw_src = True
-        self.act_set_nw_dst = True
-        self.act_set_tp_src = True
-        self.act_set_tp_dst = True
-        self.act_vendor = False
-
-    def get_capability(self, ofmsg):
-        """Return value for uint32_t capability field
-        """
-        value = 0
-        if (self.flow_stats):
-            value += ofmsg.get_value("OFPC_FLOW_STATS")
-        if (self.table_stats):
-            value += ofmsg.get_value("OFPC_TABLE_STATS")
-        if (self.port_stats):
-            value += ofmsg.get_value("OFPC_PORT_STATS")
-        if (self.stp):
-            value += ofmsg.get_value("OFPC_STP")
-        if (self.multi_phy_tx):
-            value += ofmsg.get_value("OFPC_MULTI_PHY_TX")
-        if (self.ip_resam):
-            value += ofmsg.get_value("OFPC_IP_REASM")
-        return value
-
-    def get_actions(self, ofmsg):
-        """Return value for uint32_t action field
-        """
-        value = 0
-        if (self.act_output):
-            value += (1 << (ofmsg.get_value("OFPAT_OUTPUT")+1))
-        if (self.act_set_vlan_vid):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_VLAN_VID")+1))
-        if (self.act_set_vlan_pcp):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_VLAN_PCP")+1))
-        if (self.act_strip_vlan):
-            value += (1 << (ofmsg.get_value("OFPAT_STRIP_VLAN")+1))
-        if (self.act_set_dl_src):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_DL_SRC")+1))
-        if (self.act_set_dl_dst):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_DL_DST")+1))
-        if (self.act_set_nw_src):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_NW_SRC")+1))
-        if (self.act_set_nw_dst):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_NW_DST")+1))
-        if (self.act_set_tp_src):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_TP_SRC")+1))
-        if (self.act_set_tp_dst):
-            value += (1 << (ofmsg.get_value("OFPAT_SET_TP_DST")+1))
-        return value
-
-class port:
-    """Class to hold information about port
-    
-    Copyright(C) 2009, Stanford University
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, port_no, stp=(2 << 8), hw_addr=None, name=""):
-        """Initialize
-        """
-        ##Port properties
-        self.port_no = port_no
-        if (hw_addr != None):
-            self.hw_addr = hw_addr
-        else:
-            self.hw_addr = random.randrange(1, pow(2,48))
-        self.name = name
-        ##Port config
-        self.port_down = False
-        self.no_stp = False
-        self.no_recv = False
-        self.no_recv_stp = False
-        self.no_flood = False
-        self.no_fwd = False
-        self.no_packet_in = False
-        #Port state
-        self.link_down = False
-        self.stp = stp
diff --git a/tools/pylibopenflow/pylib/of/pythonize.py b/tools/pylibopenflow/pylib/of/pythonize.py
deleted file mode 100644
index 5a28818..0000000
--- a/tools/pylibopenflow/pylib/of/pythonize.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""This module generate Python code for OpenFlow structs.
-
-(C) Copyright Stanford University
-Date December 2009
-Created by ykk
-"""
-import cpythonize
-from config import *
-
-class rules(cpythonize.rules):
-    """Class that specify rules for pythonization of OpenFlow messages
-
-    (C) Copyright Stanford University
-    Date December 2009
-    Created by ykk
-    """
-    def __init__(self, ofmsg):
-        """Initialize rules
-        """
-        cpythonize.rules.__init__(self)
-        ##Reference to ofmsg
-        self.__ofmsg = ofmsg
-        ##Default values for members
-        self.default_values[('ofp_header','version')] = self.__ofmsg.get_value('OFP_VERSION')
-        self.default_values[('ofp_switch_config',\
-                             'miss_send_len')] = self.__ofmsg.get_value('OFP_DEFAULT_MISS_SEND_LEN')
-        for x in ['ofp_flow_mod','ofp_flow_expired','ofp_flow_stats']:
-            self.default_values[(x,'priority')] = self.__ofmsg.get_value('OFP_DEFAULT_PRIORITY')
-        #Default values for struct
-        self.default_values[('ofp_packet_out','buffer_id')] = 0xffffffff
-        self.struct_default[('ofp_flow_mod',
-                             'header')] = ".type = OFPT_FLOW_MOD"
-#                             'header')] = ".type = "+str(self.__ofmsg.get_value('OFPT_FLOW_MOD'))
-        ##Macros to exclude
-        self.excluded_macros = ['OFP_ASSERT(EXPR)','OFP_ASSERT(_EXPR)','OFP_ASSERT',
-                                'icmp_type','icmp_code','OFP_PACKED',
-                                'OPENFLOW_OPENFLOW_H']
-        ##Enforce mapping
-        if GEN_ENUM_VALUES_LIST:
-            self.enforced_maps['ofp_header'] = [ ('type','ofp_type_values') ]
-        elif GEN_ENUM_DICTIONARY:
-            self.enforced_maps['ofp_header'] = \
-                [ ('type','ofp_type_map.keys()') ]
-        
-class pythonizer(cpythonize.pythonizer):
-    """Class that pythonize C structures of OpenFlow messages
-
-    (C) Copyright Stanford University
-    Date December 2009
-    Created by ykk
-    """
-    def __init__(self, ofmsg):
-        """Initialize
-        """
-        ofrules =  rules(ofmsg)
-        cpythonize.pythonizer.__init__(self, ofmsg, ofrules)
-        ##Reference to OpenFlow message class
-        self.__ofmsg = ofmsg
diff --git a/tools/pylibopenflow/pylib/of/simu.py b/tools/pylibopenflow/pylib/of/simu.py
deleted file mode 100644
index 508b076..0000000
--- a/tools/pylibopenflow/pylib/of/simu.py
+++ /dev/null
@@ -1,144 +0,0 @@
-"""This module simulates the network.
-
-Copyright(C) 2009, Stanford University
-Date November 2009
-Created by ykk
-"""
-import openflow
-import output
-import of.msg
-import of.network
-
-class network(of.network.network):
-    """Class to simulate OpenFlow network
-
-    Copyright(C) 2009, Stanford University
-    Date November 2009
-    Created by ykk
-    """
-    def __init__(self):
-        """Initialize network
-        """
-        of.network.network.__init__(self)
-        ##Name of use for output
-        self.name = self.__class__.__name__+str(id(self))
-
-class link(of.network.link):
-    """Class to simulate link
-
-    Copyright(C) 2009, Stanford University
-    Date November 2009
-    Created by ykk
-    """
-    def __init__(self, switch1, switch2, isUp=True):
-        """Initialize link
-        """
-        of.network.link.__init__(self, switch1, switch2)
-        ##Name of use for output
-        self.name = self.__class__.__name__+str(id(self))
-        ##Indicate if link is up
-        self.isUp = isUp
-
-class switch(of.network.switch):
-    """Class to simulate OpenFlow switch
-
-    Copyright(C) 2009, Stanford University
-    Date November 2009
-    Created by ykk
-    """
-    def __init__(self,  messages, controller, port, miss_send_len=128,
-                 dpid=None, n_buffers=100, n_tables=1,
-                 capability=None, parser=None, connection=None):
-        """Initialize switch
-        """
-        of.network.switch.__init__(self,  miss_send_len,
-                                   None, dpid, n_buffers, n_tables,
-                                   capability)
-        ##Name of use for output
-        self.name = self.__class__.__name__+str(id(self))
-        ##Reference to OpenFlow messages
-        self.__messages = messages
-        ##Reference to connection
-        self.connection = openflow.tcpsocket(messages, controller, port)
-        self.sock = self.connection.sock
-        ##Reference to Parser
-        self.parser = None
-        if (parser == None):
-            self.parser = of.msg.parser(messages)
-        else:
-            self.parser = parser
-
-    def receive_openflow(self, packet):
-        """Switch receive OpenFlow packet, and respond accordingly
-        """
-        dic = self.__messages.peek_from_front("ofp_header", packet)
-        if (dic["type"][0] == self.__messages.get_value("OFPT_HELLO")):
-            output.dbg("Receive hello", self.name)
-        elif (dic["type"][0] == self.__messages.get_value("OFPT_ECHO_REQUEST")):
-            self.reply_echo(dic["xid"][0])
-        elif (dic["type"][0] == self.__messages.get_value("OFPT_FEATURES_REQUEST")):
-            self.reply_features(dic["xid"][0])
-        elif (dic["type"][0] == self.__messages.get_value("OFPT_FLOW_MOD")):
-            self.handle_flow_mod(packet)
-        else:
-            output.dbg("Unprocessed message "+self.parser.header_describe(dic),
-                       self.name)
-
-    def send_hello(self):
-        """Send hello
-        """
-        self.connection.structsend("ofp_hello",
-                                   0, self.__messages.get_value("OFPT_HELLO"),
-                                   0, 0)
-        output.dbg("Send hello",self.name)
-
-    def send_packet(self, inport, bufferid=None, packet="", xid=0, reason=None):
-        """Send packet in
-        Assume no match as reason, bufferid = 0xFFFFFFFF,
-        and empty packet by default
-        """
-        if (reason == None):
-            reason = self.__messages.get_value("OFPR_NO_MATCH")
-        if (bufferid == None):
-            bufferid = int("0xFFFFFFFF",16)
-        pktin = self.__messages.pack("ofp_packet_in",
-                                     0, self.__messages.get_value("OFPT_PACKET_IN"),
-                                     0, xid, #header
-                                     bufferid, len(packet),
-                                     inport, reason, 0)
-        self.connection.structsend_raw(pktin+packet)
-        output.dbg("Send packet ",self.name)
-
-    def send_echo(self, xid=0):
-        """Send echo
-        """
-        self.connection.structsend_xid("ofp_header",
-                                       0, self.__messages.get_value("OFPT_ECHO_REQUEST"),
-                                       0, xid)
-        output.dbg("Send echo", self.name)
-
-    def reply_echo(self, xid):
-        """Reply to echo request
-        """
-        self.connection.structsend_xid("ofp_header",
-                                       0, self.__messages.get_value("OFPT_ECHO_REPLY"),
-                                       0, xid)                                 
-        output.dbg("Reply echo of xid:"+str(xid),self.name)
-
-    def reply_features(self, xid):
-        """Reply to feature request
-        """
-        self.connection.structsend_xid("ofp_switch_features",
-                                       0, self.__messages.get_value("OFPT_FEATURES_REPLY"),
-                                       0, xid,
-                                       self.datapath_id, self.n_buffers,
-                                       self.n_tables,0,0,0,
-                                       self.capability.get_capability(self.__messages),
-                                       self.capability.get_actions(self.__messages))
-        output.dbg("Replied features request of xid "+str(xid), self.name)
-        
-    def handle_flow_mod(self, packet):
-        """Handle flow mod: just print it here
-        """
-        output.dbg(self.parser.flow_mod_describe(packet), self.name)
-        
diff --git a/tools/pylibopenflow/pylib/openflow.py b/tools/pylibopenflow/pylib/openflow.py
deleted file mode 100644
index 25945b9..0000000
--- a/tools/pylibopenflow/pylib/openflow.py
+++ /dev/null
@@ -1,336 +0,0 @@
-"""This module exports OpenFlow protocol to Python.
-
-(C) Copyright Stanford University
-Date October 2009
-Created by ykk
-"""
-import c2py
-import cheader
-import os
-import socket
-import select
-import struct
-import time
-
-class messages(cheader.cheaderfile,c2py.cstruct2py,c2py.structpacker):
-    """Class to handle OpenFlow messages
-
-    (C) Copyright Stanford University
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, openflow_headerfile=None):
-        """Initialize with OpenFlow header file
-
-        If filename is not provided, check the environment
-        variable PYLIB_OPENFLOW_HEADER and search for openflow.h
-        """
-        if (openflow_headerfile != None):
-            cheader.cheaderfile.__init__(self, openflow_headerfile)
-        else:
-            #Check environment variable
-            path = os.getenv("PYLIB_OPENFLOW_HEADER")
-            if not path:
-                print "PYLIB_OPENFLOW_HEADER is not set in environment"
-                sys.exit(2)
-            cheader.cheaderfile.__init__(self, path+"/openflow.h")
-        #Initialize cstruct2py
-        c2py.cstruct2py.__init__(self)
-        #Initalize packet
-        c2py.structpacker.__init__(self, "!")
-        ##Cached patterns
-        self.patterns={}
-        for (cstructname, cstruct) in self.structs.items():
-            self.patterns[cstructname] = self.get_pattern(cstruct)
-
-    def get_size(self, ctype):
-        """Get size for ctype or name of type.
-        Return None if ctype is not expanded or
-        type with name is not found.
-        """
-        pattern = self.get_pattern(ctype)
-        if (pattern != None):
-            return c2py.cstruct2py.get_size(self,pattern)
-    
-    def get_pattern(self,ctype):
-        """Get pattern string for ctype or name of type.
-        Return None if ctype is not expanded or
-        type with name is not found.
-        """
-        if (isinstance(ctype, str)):
-            #Is name
-            return self.patterns[ctype]
-        else:
-            return c2py.cstruct2py.get_pattern(self, ctype)
-        
-    def pack(self, ctype, *arg):
-        """Pack packet accordingly ctype or name of type provided.
-        Return struct packed.
-        """
-        if (isinstance(ctype, str)):
-            return struct.pack(self.prefix+self.patterns[ctype], *arg)
-        else:
-            return c2py.structpacker.pack(self, ctype, *arg)
-
-    def peek_from_front(self, ctype, binaryString, returnDictionary=True):
-        """Unpack packet using front of the packet,
-        accordingly ctype or name of ctype provided.
-
-        Return dictionary of values indexed by arg name, 
-        if ctype is known struct/type and returnDictionary is True,
-        else return array of data unpacked.
-        """
-        if (isinstance(ctype,str)):
-            data = c2py.structpacker.peek_from_front(self,
-                                                     self.patterns[ctype],
-                                                     binaryString,
-                                                     returnDictionary)
-            return self.data2dic(self.structs[ctype], data)
-        else:
-            return c2py.structpacker.peek_from_front(self,
-                                                     ctype,
-                                                     binaryString,
-                                                     returnDictionary)
-        
-    def unpack_from_front(self, ctype, binaryString, returnDictionary=True):
-        """Unpack packet using front of packet,
-        accordingly ctype or name of ctype provided.
-
-        Return (dictionary of values indexed by arg name, 
-        remaining binary string) if ctype is known struct/type
-        and returnDictionary is True,
-        else return (array of data unpacked, remaining binary string).
-        """
-        if (isinstance(ctype,str)):
-            (data, remaining) = c2py.structpacker.unpack_from_front(self,
-                                                                    self.patterns[ctype],
-                                                                    binaryString,
-                                                                    returnDictionary)
-            return (self.data2dic(self.structs[ctype], data), remaining)
-        else:
-            return c2py.structpacker.unpack_from_front(self,
-                                                       ctype,
-                                                       binaryString,
-                                                       returnDictionary)
-
-class connection:
-    """Class to hold a connection.
-
-    (C) Copyright Stanford University
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, messages, sock=None):
-        """Initialize
-        """
-        ##Reference to socket
-        self.sock = sock
-        ##Internal reference to OpenFlow messages
-        self._messages = messages
-        ##Buffer
-        self.buffer = ""
-        ##Header length for OpenFlow
-        self.__header_length = self._messages.get_size("ofp_header")
-
-    def send(self, msg):
-        """Send bare message (given as binary string)
-        """
-        raise NotImplementedError()
-
-    def structsend(self, ctype, *arg):
-        """Build and send message.
-        """
-        self.send(self._messages.pack(ctype, *arg))
-
-    def receive(self, maxlength=1024):
-       """Receive raw in non-blocking way.
-
-       Return buffer
-       """
-       if (select.select([self.sock],[],[],0)[0]):
-           self.buffer += self.sock.recv(maxlength)
-       return self.buffer
-
-    def buffer_has_msg(self):
-        """Check if buffer has a complete message
-        """
-        #Check at least ofp_header is received
-        if (len(self.buffer) < self.__header_length):
-            return False
-        values = self._messages.peek_from_front("ofp_header", self.buffer)
-        return (len(self.buffer) >= values["length"][0])
-
-    def get_msg(self):
-        """Get message from current buffer
-        """
-        if (self.buffer_has_msg()):
-            values = self._messages.peek_from_front("ofp_header", self.buffer)
-            msg = self.buffer[:values["length"][0]]
-            self.buffer = self.buffer[values["length"][0]:]
-            return msg
-        else:
-            return None
-
-    def msgreceive(self, blocking=False, pollInterval=0.001):
-        """Receive OpenFlow message.
-
-        If non-blocking, can return None.
-        """
-        self.receive()
-        if (self.buffer_has_msg()):
-            return self.get_msg()
-        if (blocking):
-            while (not self.buffer_has_msg()):
-                time.sleep(pollInterval)
-                self.receive()
-        return self.get_msg()
-
-class safeconnection(connection):
-    """OpenFlow connection with safety checks
-    
-    (C) Copyright Stanford University
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, messages, sock=None, version=None,
-                 xidstart = 0, autoxid=True):
-        """Initialize with OpenFlow version.
-        """
-        connection.__init__(self, messages, sock)
-        ##OpenFlow version
-        if (version != None):
-            self.version = version
-        else:
-            self.version = messages.get_value("OFP_VERSION")
-        ##xid Counter
-        self.nextxid = xidstart
-        ##Automatic xid
-        self.autoxid = autoxid
-        ##Miss auto xid
-        self.skipautoxid = 0
-
-    def skip_auto_xid(self, n):
-        """Miss automatic xid for the next n packets
-        """
-        self.skipautoxid = n
-
-    def structsend_xid(self, ctype, *arg):
-        """Build and send message, populating header automatically.
-        Type and xid of message is not populated.
-        """
-        self.skipautoxid+=1
-        self.structsend(ctype, *arg)
-
-    def structsend(self, ctype, *arg):
-        """Build and send message, populating header automatically.
-        Type of message is not populated
-        """
-        msg = self._messages.pack(ctype, *arg)
-        self.structsend_raw(msg)
-        
-    def structsend_raw(self, msg):
-        """Check ofp_header and ensure correctness before sending.
-        """
-        (dic, remaining) = self._messages.unpack_from_front("ofp_header", msg)
-        #Amend header
-        if (self.version != None):
-            dic["version"][0] = self.version
-        if (self.autoxid and (self.skipautoxid == 0)):
-            dic["xid"][0] = self.nextxid
-            self.nextxid+=1
-        if (self.skipautoxid != 0):
-            self.skipautoxid-=1
-        dic["length"][0] = len(remaining)+8
-        #Send message
-        self.send(self._messages.pack("ofp_header",
-                                      dic["version"][0],
-                                      dic["type"][0],
-                                      dic["length"][0],
-                                      dic["xid"][0])+\
-                  remaining)
-
-class tcpsocket(safeconnection):
-    """Class to hold connection
-
-    (C) Copyright Stanford University
-    Date October 2009
-    Created by ykk
-    """
-    def __init__(self, messages, host, port):
-        """Initialize TCP socket to host and port
-        """
-        safeconnection.__init__(self, messages)
-        ##Reference to socket
-        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        self.sock.connect((host, port))
-        self.sock.setblocking(False)
-        self.sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 0)
-
-    def __del__(self):
-        """Terminate connection
-        """
-        self.sock.shutdown(1)
-        self.sock.close()
-
-    def send(self, msg):
-        """Send raw message (binary string)
-        """
-        self.sock.sendall(msg)
-
-class connections:
-    """Class to hold multiple connections
-    
-    (C) Copyright Stanford University
-    Date November 2009
-    Created by ykk
-    """
-    def __init__(self):
-        """Initialize
-        """
-        ##List of sockets
-        self.__sockets = []
-        ##Dicionary of sockets to connection
-        self.__connections = {}
-        
-    def add_connection(self, reference, connect):
-        """Add connection with opaque reference object
-        """
-        if (not isinstance(connect,connection)): 
-            raise RuntimeError("Connection must be openflow.connection!")
-        self.__sockets.append(connect.sock)
-        self.__connections[connect.sock] = (reference, connect)
-
-    def receive(self, maxlength=1024):
-        """Receive raw in non-blocking way
-        """
-        read_ready = select.select(self.__sockets,[],[],0)[0]
-        for sock in read_ready:
-            self.__connections[sock][1].receive(maxlength)
-        
-    def has_msg(self):
-        """Check if any of the connections has a message
-
-        Return (reference,connection) with message
-        """
-        for sock, refconnect in self.__connections.items():
-            if (refconnect[1].buffer_has_msg()):
-                return refconnect
-        return None
-
-    def msgreceive(self, blocking=False, pollInterval=0.001):
-        """Receive OpenFlow message.
-
-        If non-blocking, can return None.
-        """
-        self.receive()
-        c = self.has_msg()
-        if (c != None):
-            return (c[0],c[1].get_msg())
-        if (blocking):
-            while (c == None):
-                time.sleep(pollInterval)
-                self.receive()
-                c = self.has_msg()
-        else:
-            return (None, None)
-        return (c[0],c[1].get_msg())
diff --git a/tools/pylibopenflow/pylib/output.py b/tools/pylibopenflow/pylib/output.py
deleted file mode 100644
index 64df4f5..0000000
--- a/tools/pylibopenflow/pylib/output.py
+++ /dev/null
@@ -1,85 +0,0 @@
-"""This module implements output printing.
-
-Output are divided into 4 levels and
-can be configured for different verbosity
-
-Copyright(C) 2009, Stanford University
-Date August 2009
-Created by ykk
-"""
-
-##Various output modes
-MODE = {}
-MODE["ERR"] = 0
-MODE["WARN"] = 1
-MODE["INFO"] = 2
-MODE["DBG"] = 3
-
-#Global mode
-global output_mode
-output_mode = None
-
-def set_mode(msg_mode, who=None):
-    """Set the message mode for who
-    If who is None, set global mode
-    """
-    global output_mode
-    if (output_mode == None):
-        output_mode = {}
-        output_mode["global"] = MODE["WARN"]
-        output_mode["DBG"] = []
-        output_mode["INFO"] = []
-        output_mode["WARN"] = []
-
-    #Set global mode
-    if (who == None):
-        output_mode["global"] = MODE[msg_mode]
-        return
-    
-    #Individual mode
-    if (msg_mode == "ERR"):
-        return
-    for mode in ["WARN","INFO","DBG"]:
-        if (not (who in mode[mode])):
-            mode[mode].append(who)
-        if (msg_mode == mode):
-            return
-    
-def output(msg_mode, msg, who=None):
-    """Print message
-    """
-    global output_mode
-    if (output_mode == None):
-        raise RuntimeException("Output mode is not set")
-
-    #Indicate who string
-    if (who == None):
-        whostr = ""
-    else:
-        whostr = who+":"
-
-    #Print output 
-    if (MODE[msg_mode] <= output_mode["global"]):
-        print msg_mode.ljust(4, ' ')+"|"+whostr+msg
-    elif (who in output_mode[msg_mode]):
-        print msg_mode.ljust(4, ' ')+"|"+whostr+msg
-        
-def err(msg, who=None):
-    """Print error messages
-    """
-    output("ERR", msg, who)
-
-def warn(msg, who=None):
-    """Print warning messages
-    """
-    output("WARN", msg, who)
-
-def info(msg, who=None):
-    """Print informational messages
-    """
-    output("INFO", msg, who)
-
-def dbg(msg, who=None):
-    """Print debug messages
-    """
-    output("DBG", msg, who)
