Peeker function for reading subclass discriminator
diff --git a/wireshark_gen/__init__.py b/wireshark_gen/__init__.py
index 5c02e06..e92ebf2 100644
--- a/wireshark_gen/__init__.py
+++ b/wireshark_gen/__init__.py
@@ -55,6 +55,17 @@
     else:
         return "read_" + m.oftype.replace(')', '').replace('(', '_')
 
+def get_peeker(version, cls, m):
+    """
+    Decide on a peeker function to use for the given field
+    """
+    ofproto = loxi_globals.ir[version]
+    enum = ofproto.enum_by_name(m.oftype)
+    if enum and 'wire_type' in enum.params:
+        return "peek_" + enum.params['wire_type']
+    else:
+        return "peek_" + m.oftype.replace(')', '').replace('(', '_')
+
 def get_field_info(version, cls, name, oftype):
     """
     Decide on a Wireshark type and base for a given field.
diff --git a/wireshark_gen/templates/_ofclass_dissector.lua b/wireshark_gen/templates/_ofclass_dissector.lua
index 0eb45eb..39c7c41 100644
--- a/wireshark_gen/templates/_ofclass_dissector.lua
+++ b/wireshark_gen/templates/_ofclass_dissector.lua
@@ -26,7 +26,7 @@
 :: # under the EPL.
 ::
 :: from loxi_ir import *
-:: from wireshark_gen import make_field_name, get_reader
+:: from wireshark_gen import make_field_name, get_reader, get_peeker
 :: attrs = []
 :: if ofclass.virtual: attrs.append("virtual")
 :: if ofclass.superclass: attrs.append("child")
@@ -46,7 +46,15 @@
 :: #endif
 :: field_name = make_field_name(version, ofclass.name, m.name)
 :: reader_name = get_reader(version, ofclass, m)
+:: peeker_name = get_peeker(version, ofclass, m)
+:: if (field_name == discriminator_name):
+    return ${peeker_name}(reader, ${version.wire_version}, subtree, '${field_name}')
+::    break
+:: else:
     ${reader_name}(reader, ${version.wire_version}, subtree, '${field_name}')
+:: #endif
 :: #endfor
+:: if not ofclass.virtual:
     return '${ofclass.name}'
+:: #endif
 end
diff --git a/wireshark_gen/templates/_oftype_readers.lua b/wireshark_gen/templates/_oftype_readers.lua
index 9a5e4fa..e9eb9fa 100644
--- a/wireshark_gen/templates/_oftype_readers.lua
+++ b/wireshark_gen/templates/_oftype_readers.lua
@@ -51,6 +51,32 @@
     end
 end
 
+function peek_scalar(reader, subtree, field_name, length)
+    return reader.read(length):uint()
+end
+
+function peek_uint8_t(reader, version, subtree, field_name)
+    return peek_scalar(reader, subtree, field_name, 1)
+end
+
+function peek_uint16_t(reader, version, subtree, field_name)
+    return peek_scalar(reader, subtree, field_name, 2)
+end
+
+function peek_uint32_t(reader, version, subtree, field_name)
+    return peek_scalar(reader, subtree, field_name, 4)
+end
+
+function peek_uint64_t(reader, version, subtree, field_name)
+    return peek_scalar(reader, subtree, field_name, 8)
+end
+
+function peek_of_octets_t(reader, version, subtree, field_name)
+    if not reader.is_empty() then
+        return reader.peek_all()
+    end
+end
+
 function read_list_of_hello_elem_t(reader, version, subtree, field_name)
     -- TODO
 end
@@ -105,6 +131,14 @@
     end
 end
 
+function peek_of_fm_cmd_t(reader, version, subtree, field_name)
+    if version == 1 then
+        return peek_scalar(reader, subtree, field_name, 2)
+    else
+        return peek_scalar(reader, subtree, field_name, 1)
+    end
+end
+
 function read_list_of_action_t(reader, version, subtree, field_name)
     if reader.is_empty() then
         return