Merge into master from pull request #168:
Function to read masked port numbers (https://github.com/floodlight/loxigen/pull/168)
diff --git a/wireshark_gen/__init__.py b/wireshark_gen/__init__.py
index 5c02e06..a610f3f 100644
--- a/wireshark_gen/__init__.py
+++ b/wireshark_gen/__init__.py
@@ -52,6 +52,8 @@
     enum = ofproto.enum_by_name(m.oftype)
     if enum and 'wire_type' in enum.params:
         return "read_" + enum.params['wire_type']
+    elif (cls.name, m.name) in field_info.reader_overrides:
+        return field_info.reader_overrides[(cls.name, m.name)]
     else:
         return "read_" + m.oftype.replace(')', '').replace('(', '_')
 
diff --git a/wireshark_gen/field_info.py b/wireshark_gen/field_info.py
index 94e5243..3b76937 100644
--- a/wireshark_gen/field_info.py
+++ b/wireshark_gen/field_info.py
@@ -171,3 +171,7 @@
     "cookie": "HEX",
     "datapath_id": "HEX",
 }
+
+reader_overrides = {
+    ("of_packet_in", "data"): "read_ethernet",
+}
diff --git a/wireshark_gen/templates/_oftype_readers.lua b/wireshark_gen/templates/_oftype_readers.lua
index d80323c..5f20d80 100644
--- a/wireshark_gen/templates/_oftype_readers.lua
+++ b/wireshark_gen/templates/_oftype_readers.lua
@@ -151,3 +151,21 @@
         return
     end
 end
+
+function read_ethernet(reader, version, subtree, field_name)
+    if reader.is_empty() then
+        return
+    end
+    local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
+    child_subtree:set_text("Ethernet packet")
+    ethernet_dissector:call(reader.read_all():tvb(), current_pkt, child_subtree)
+end
+
+function read_of_bsn_vport_q_in_q_t(reader, version, subtree, field_name)
+    if reader.is_empty() then
+        return
+    end
+    local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
+    local info = of_bsn_vport_q_in_q_dissectors[version](reader, child_subtree)
+    child_subtree:set_text(info)
+end
diff --git a/wireshark_gen/templates/openflow.lua b/wireshark_gen/templates/openflow.lua
index cad61a5..3f86684 100644
--- a/wireshark_gen/templates/openflow.lua
+++ b/wireshark_gen/templates/openflow.lua
@@ -40,6 +40,9 @@
 :: include('_ofreader.lua')
 
 p_of = Proto ("of", "OpenFlow")
+ethernet_dissector = Dissector.get("eth")
+
+current_pkt = nil
 
 local openflow_versions = {
 :: for version in loxi_globals.OFVersions.all_supported:
@@ -118,6 +121,12 @@
 :: #endfor
 }
 
+local of_bsn_vport_q_in_q_dissectors = {
+:: for version in ir:
+    [${version.wire_version}] = dissect_of_bsn_vport_q_in_q_v${version.wire_version},
+:: #endfor
+}
+
 :: include('_oftype_readers.lua')
 
 function dissect_of_message(buf, root)
@@ -140,6 +149,7 @@
 -- of dissector function
 function p_of.dissector (buf, pkt, root)
     local offset = 0
+    current_pkt = pkt
     repeat
         if buf:len() - offset >= 4 then
             msg_len = buf(offset+2,2):uint()