82 lines
2.9 KiB
Lua
82 lines
2.9 KiB
Lua
local name = "im"
|
|
local p_im = Proto(name, "im layer protocal");
|
|
|
|
local f_pack_size = ProtoField.uint32(name .. ".packsize", "Packet Size", base.DEC)
|
|
local f_header_len = ProtoField.uint16(name .. ".header", "Header Length", base.DEC)
|
|
local f_version = ProtoField.uint16(name .. ".version", "Version", base.DEC)
|
|
local f_option = ProtoField.uint32(name .. ".option", "Option", base.DEC)
|
|
local f_seq = ProtoField.uint32(name .. ".seq", "Seq", base.DEC)
|
|
local f_ack = ProtoField.uint32(name .. ".ack", "Ack", base.DEC)
|
|
local f_data = ProtoField.bytes(name .. ".data", "Payload", FT_BYTES)
|
|
|
|
p_im.fields = { f_pack_size,f_header_len,f_version,f_option,f_seq,f_ack,f_data }
|
|
|
|
local option_name = {
|
|
[0] = 'Undefined',
|
|
[1] = 'Auth',
|
|
[2] = 'AuthReply',
|
|
[3] = 'Heartbeat',
|
|
[4] = 'HeartbeatReply',
|
|
[5] = 'Disconnect',
|
|
[6] = 'DisconnectReply',
|
|
[7] = 'SendMsg',
|
|
[8] = 'SendMsgReply',
|
|
[9] = 'ReceiveMsg',
|
|
[10] = 'ReceiveMsgReply',
|
|
[14] = 'SyncMsgReq',
|
|
[15] = 'SyncMsgReply'
|
|
}
|
|
|
|
local dtalk_proto = Dissector.get("dtalk")
|
|
local data_dis = Dissector.get("data")
|
|
|
|
function p_im.dissector(buf, pkt, tree)
|
|
local offset = 0
|
|
local subtree = tree:add(p_im, buf())
|
|
pkt.cols.protocol = p_im.name
|
|
|
|
--packate size
|
|
local pkglen_tvbr = buf(offset, 4)
|
|
local pkglen = pkglen_tvbr:uint()
|
|
subtree:add(f_pack_size, pkglen_tvbr)
|
|
offset = offset + 4
|
|
|
|
if pkglen ~= buf:len() then
|
|
data_dis:call(buf(2):tvb(), pkt, tree)
|
|
else
|
|
--deal im parse
|
|
-- header Length
|
|
subtree:add(f_header_len, buf(offset, 2))
|
|
offset = offset + 2
|
|
--version
|
|
subtree:add(f_version, buf(offset, 2))
|
|
offset = offset + 2
|
|
--option
|
|
local opt_tvbr = buf(offset, 4)
|
|
local optcode = opt_tvbr:uint()
|
|
local opttree = subtree:add(f_option, opt_tvbr)
|
|
offset = offset + 4
|
|
opttree:append_text(' (' .. option_name[optcode] .. ') ')
|
|
pkt.private["dtalk_opt_type"] = optcode
|
|
--sequence
|
|
subtree:add(f_seq, buf(offset, 4))
|
|
offset = offset + 4
|
|
--acknowledge
|
|
subtree:add(f_ack, buf(offset, 4))
|
|
offset = offset + 4
|
|
--data
|
|
if buf:len()-offset > 0 then
|
|
subtree:add(f_data, buf(offset, buf:len()-offset))
|
|
--sub protocal
|
|
if dtalk_proto ~= nil then
|
|
dtalk_proto:call(buf(offset):tvb(), pkt, tree)
|
|
end
|
|
else
|
|
subtree:add('Payload:', 'empty')
|
|
end
|
|
end
|
|
end
|
|
|
|
local websocket_table = DissectorTable.get("ws.port")
|
|
|
|
websocket_table:add(3102, p_im) |