-- カスタムプロトコルの識別子(任意の値を設定)
local NX_PROTOCOL = Proto("NXDlink", "nxdlink protocol dissector")
-- プロトコルのフィールド定義
local nx_protocol_fields = NX_PROTOCOL.fields
nx_protocol_fields.magic = ProtoField.string("nx_protocol.magic", "Magic Number")
nx_protocol_fields.message_length = ProtoField.uint32("nx_protocol.message_length", "Message Length")
nx_protocol_fields.source_address = ProtoField.uint32("nx_protocol.source_address", "Source Address")
nx_protocol_fields.destination_address = ProtoField.uint32("nx_protocol.destination_address", "Destination Address")
nx_protocol_fields.timestamp = ProtoField.uint32("nx_protocol.timestamp", "Timestamp")
nx_protocol_fields.message_number = ProtoField.uint32("nx_protocol.message_number", "Message Number")
nx_protocol_fields.m_ctl = ProtoField.uint32("nx_protocol.m_ctl", "M_CTL")
nx_protocol_fields.inq_id = ProtoField.string("nx_protocol.inq_id", "INQ_ID")
nx_protocol_fields.tcd = ProtoField.uint32("nx_protocol.tcd", "TCD")
nx_protocol_fields.ver = ProtoField.uint32("nx_protocol.ver", "VER")
nx_protocol_fields.gtid = ProtoField.string("nx_protocol.gtid", "GTID")
nx_protocol_fields.mode = ProtoField.uint32("nx_protocol.mode", "MODE")
nx_protocol_fields.pver = ProtoField.uint32("nx_protocol.pver", "PVER")
nx_protocol_fields.pri = ProtoField.uint32("nx_protocol.pri", "PRI")
nx_protocol_fields.cbn = ProtoField.uint32("nx_protocol.cbn", "CBN")
nx_protocol_fields.tbn = ProtoField.uint32("nx_protocol.tbn", "TBN")
nx_protocol_fields.bsize = ProtoField.uint32("nx_protocol.bsize", "BSIZE")
nx_protocol_fields.fui = ProtoField.uint32("nx_protocol.fui", "FUI")
-- nx_protocol_fields.fc = ProtoField.uint32("nx_protocol.fc", "FC", base.HEX)
nx_protocol_fields.fc = ProtoField.uint32("nx_protocol.fc", "FC")
nx_protocol_fields.field_x = ProtoField.uint32("nx_protocol.field_x", "FIELD_X")
nx_protocol_fields.field_y = ProtoField.uint32("nx_protocol.field_y", "FIELD_Y")
nx_protocol_fields.field_z = ProtoField.uint32("nx_protocol.field_z", "FIELD_Z")
-- カスタムプロトコルの識別子(任意の値を設定)
--local DATA_PROTOCOL = Proto("DATALink", "datalink protocol dissector")
-- プロトコルのフィールド定義
--local data_protocol_fields = DATA_PROTOCOL.fields
--data_protocol_fields.fc = ProtoField.uint32("data_protocol.fc", "FC")
-- パケット解析関数
function NX_PROTOCOL.dissector(buffer, pinfo, tree)
-- フレーム情報を表示
pinfo.cols.protocol:set("NX Protocol")
local subtree = tree:add(NX_PROTOCOL, buffer(), "NX Protocol Data")
-- "NUXM" ヘッダ文字列を確認
local data = buffer():string()
-- local offset = data:find("NUXM")
local offset = data:find("NUXM") -1 -- 1を引かないと、ずれる
if not offset then
-- "NUXM" が見つからない場合は解析を中止
return
end
-- ヘッダ情報を解析
subtree:add(nx_protocol_fields.magic, buffer(offset, 4))
subtree:add(nx_protocol_fields.message_length, buffer(offset + 4, 4))
subtree:add(nx_protocol_fields.source_address, buffer(offset + 8, 4))
subtree:add(nx_protocol_fields.destination_address, buffer(offset + 12, 4))
subtree:add(nx_protocol_fields.timestamp, buffer(offset + 16, 4))
subtree:add(nx_protocol_fields.message_number, buffer(offset + 20, 4))
subtree:add(nx_protocol_fields.m_ctl, buffer(offset + 24, 4))
subtree:add(nx_protocol_fields.inq_id, buffer(offset + 28, 12))
subtree:add(nx_protocol_fields.tcd, buffer(offset + 40, 2))
subtree:add(nx_protocol_fields.ver, buffer(offset + 42, 2))
subtree:add(nx_protocol_fields.gtid, buffer(offset + 44, 8))
subtree:add(nx_protocol_fields.mode, buffer(offset + 52, 2))
subtree:add(nx_protocol_fields.pver, buffer(offset + 54, 1))
subtree:add(nx_protocol_fields.pri, buffer(offset + 55, 1))
subtree:add(nx_protocol_fields.cbn, buffer(offset + 56, 1))
subtree:add(nx_protocol_fields.tbn, buffer(offset + 57, 1))
subtree:add(nx_protocol_fields.fui, buffer(offset + 60, 4))
subtree:add(nx_protocol_fields.fc, buffer(offset + 64, 2))
-- fcの値を取得
-- local fc_value = buffer(offset + 64, 2):le_uint() -- リトルエンディアンの場合
local fc_value = buffer(offset + 64, 2)-- リトルエンディアンの場合
-- デバッグ情報を表示
-- print("fc_value:", string.format("0x%04X", fc_value)) -- 16進数表示
-- fcの値に応じてフィールドを追加
-- if fc_value == 0x181 then
-- if fc_value == 385 then
if fc_value = 0 then
-- 0x181の場合、特定のフィールドを追加
subtree:add(nx_protocol_fields.field_x, buffer(offset + 66, 4))
elseif fc_value == 0x183 then
-- 0x183の場合、別のフィールドを追加
subtree:add(nx_protocol_fields.field_y, buffer(offset + 66, 4))
elseif fc_value == 0x188 or fc_value == 0x189 then
-- 0x188または0x189の場合、共通のフィールドを追加
subtree:add(nx_protocol_fields.field_z, buffer(offset + 66, 4))
else
-- その他の場合、何もしない
end
end
--function DATA_PROTOCOL.dissector(buffer, pinfo, tree)
-- フレーム情報を表示
-- pinfo.cols.protocol:set("DATA Protocol")
-- local subtree = tree:add(DATA_PROTOCOL, buffer(), "DATA Protocol Data")
-- subtree:add(data_protocol_fields.fc, buffer(64, 2))
--end
-- プロトコルをWiresharkに登録
local udp_table = DissectorTable.get("udp.port")
udp_table:add(10631, NX_PROTOCOL) -- UDPポート10631でカスタムプロトコルを解析
udp_table:add(40311, NX_PROTOCOL) -- UDPポート40311でカスタムプロトコルを解析
udp_table:add(40312, NX_PROTOCOL) -- UDPポート40312でカスタムプロトコルを解析