2013-09-26 02:39:41 -04:00

86 lines
2.8 KiB
Lua

local pf_type = ProtoField.uint16("gridctl.type", "Packet Type", base.HEX)
local pf_paylen = ProtoField.uint32("gridctl.paylen", "Payload Length", base.DEC)
local pf_payload = ProtoField.bytes("gridctl.payload", "Payload bytes")
local pf_payload32 = ProtoField.uint32("gridctl.payload32", "Payload as 32-bit LE integer", base.DEC)
local pf_payload16 = ProtoField.uint16("gridctl.payload16", "Payload as 16-bit LE integer", base.HEX)
local pf_response = ProtoField.uint16("gridctl.response", "Response code", base.HEX)
local pf_origtype = ProtoField.uint16("gridctl.origtype", "Original request type", base.HEX)
p_gridctl = Proto ("GridCtl", "Nvidia GRID Control Protocol")
p_gridctl.fields = {
pf_type,
pf_paylen,
pf_payload,
pf_payload16,
pf_payload32,
pf_response,
pf_origtype
}
function p_gridctl.dissector(buf, pkt, root)
pkt.cols.protocol = p_gridctl.name
subtree = root:add(p_gridctl, buf(0))
-- We can have multiple GRID control packets in one TCP datagram
i = 0
while i < buf:len() do
-- Make sure we have a full header
if buf:len() - i < 4 then
-- We need more data
pkt.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
pkt.desegment_offset = 0
end
-- Read the packet type field
ptype = buf(i, 2):le_uint()
subtree:add(pf_type, buf(i, 2), ptype)
i = i + 2
-- Read the payload length field
paylen = buf(i, 2):le_uint()
subtree:add(pf_paylen, buf(i, 2), paylen)
i = i + 2
-- Make sure we have the full payload
if buf:len() - i < paylen then
-- We need more data
pkt.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
pkt.desegment_offset = 0
end
-- Decode responses differently
if ptype == 0x0204 then
origtype = buf(i, 2):le_uint()
subtree:add(pf_origtype, buf(i, 2), origtype)
i = i + 2
response = buf(i, 2):le_uint()
subtree:add(pf_response, buf(i, 2), response)
i = i + 2
else
if paylen == 4 then
-- Display the payload as a uint32 (LE)
payload32 = buf(i, 4):le_uint()
subtree:add(pf_payload32, buf(i, 4), payload32)
elseif paylen == 2 then
-- Display the payload as a uint16 (LE)
payload16 = buf(i, 2):le_uint()
subtree:add(pf_payload16, buf(i, 2), payload16)
elseif paylen ~= 0 then
subtree:add(pf_payload, buf(i, paylen))
end
i = i + paylen
end
if i ~= buf:len() then
subtree:add("")
end
end
end
function p_gridctl.init()
end
local tcp_dissector_table = DissectorTable.get("tcp.port")
tcp_dissector_table:add(47995, p_gridctl)