| 1 | initial version |
Final answer - matches protobuf described in answer 2 comments:
-- 240313_33954_nested_pb_table.lua
-- "Am looking for working example for below case where data is serialized as bytes to another protobuf."
-- https://ask.wireshark.org/question/33954/lua-example-for-protobuf-dissector-which-has-protobuf-encoded-within-protobuf/
-- Step 1 - document as you go. See header above and set_plugin_info().
local nested_pb_table_info =
{
version = "1.0.0",
author = "Good Coder",
description = "Decode nested protobufs",
repository = "Floppy in top drawer"
}
set_plugin_info(nested_pb_table_info)
do
local protobuf_field_table = DissectorTable.get("protobuf_field")
local protobuf_dissector = Dissector.get("protobuf")
-- This could probably be one dissector with more control logic
-- It is easier (IM"not so"HO) to read split out into two dissectors
encoded_pb_p = Proto("encoded_pb_dissector", "Encoded Protobuf")
encoded_pb_p.dissector = function(tvb, pinfo, subtree)
pinfo.private["pb_msg_type"] = "message,encoded_data.encodeData"
local subsubtree = subtree:add(encoded_pb_p, tvb())
pcall(Dissector.call, protobuf_dissector, tvb, pinfo, subsubtree)
end
pbf_encodeDataInfo_name_f = Field.new("pbf.encoded_data.encodeDataInfo.name")
pbf_encodeDataInfo_val_f = Field.new("pbf.encoded_data.encodeDataInfo.val")
netdata_pb_p = Proto("netdata_pb_dissector", "Network Data Protobuf")
netdata_pb_p.dissector = function(tvb, pinfo, subtree)
-- What is the message type for the nested protobufs
local message_type = {
["macData.proto"] = "message,mac_data.macDataInfo",
["ipData.proto"] = "message,ip_data.ipDataInfo"
}
finfo_names = { pbf_encodeDataInfo_name_f() }
finfo_vals = { pbf_encodeDataInfo_val_f() }
-- the current last pbf.encoded_data.encodeDataInfo.name contains the .proto
-- filename matching the pbf.encoded_data.encodeDataInfo.val passed in tvb
-- use message_type table to map it message type
if (#finfo_names > 0 and #finfo_vals >0) then
v_string = string.format("%s", finfo_names[#finfo_names])
pinfo.private["pb_msg_type"] = message_type[v_string]
local subsubtree = subtree:add(netdata_pb_p, tvb())
pcall(Dissector.call, protobuf_dissector, tvb, pinfo, subsubtree)
end
end
-- What fields are the encoded protobufs in
protobuf_field_table:add("export_data.streamDataArgs.data", encoded_pb_p)
protobuf_field_table:add("encoded_data.encodeDataInfo.val", netdata_pb_p)
end