Handling lists in _ofclass_dissector
diff --git a/wireshark_gen/templates/_ofclass_dissector.lua b/wireshark_gen/templates/_ofclass_dissector.lua
index 1e1520f..01ebdeb 100644
--- a/wireshark_gen/templates/_ofclass_dissector.lua
+++ b/wireshark_gen/templates/_ofclass_dissector.lua
@@ -42,14 +42,41 @@
:: if ofclass.virtual:
return ${ofclass.name}_v${version.wire_version}_dissectors[reader.peek(${ofclass.discriminator.offset},${ofclass.discriminator.length}):uint()](reader, subtree)
:: else:
+:: r_name = "reader"
+:: if not ofclass.is_fixed_length:
+ local packet_length = ${r_name}.peek(${ofclass.message_length.offset}, ${ofclass.message_length.base_length}):uint()
+ local packet_reader = ${r_name}.slice(packet_length)
+:: r_name = "packet_reader"
+:: #endif
:: for m in ofclass.members:
:: if isinstance(m, OFPadMember):
- reader.skip(${m.length})
+ ${r_name}.skip(${m.length})
:: continue
:: #endif
+:: if isinstance(m, OFFieldLengthMember):
+ local field_length = ${r_name}.peek(0, ${m.base_length}):uint()
+ local field_reader = ${r_name}.slice(field_length)
+:: r_name = "field_reader"
+:: continue
+:: #endif
+:: if m.oftype.startswith("list"):
+:: class_name = m.oftype.replace('_t)', '').replace('(', '').replace('list', '')
+ if not ${r_name}.is_empty() then
+ local field_subtree = subtree:add("${class_name} list", ${r_name}.peek_all(0))
+ while not ${r_name}.is_empty() do
+ local atom_subtree = field_subtree:add("${class_name}", ${r_name}.peek_all(0))
+ local info = dissect_${class_name}_v${version.wire_version}(${r_name}, atom_subtree)
+ atom_subtree:set_text(info)
+ end
+ end
+:: if ofclass.has_external_alignment:
+ reader.skip_align()
+:: #endif
+:: else:
:: field_name = make_field_name(version, ofclass.name, m.name)
:: reader_name = get_reader(version, ofclass, m)
- ${reader_name}(reader, ${version.wire_version}, subtree, '${field_name}')
+ ${reader_name}(${r_name}, ${version.wire_version}, subtree, '${field_name}')
+:: #endif
:: #endfor
return '${ofclass.name}'
:: #endif