From 0bb19e619969f185663d7c10e4edced6a996fca5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 26 Sep 2013 02:39:41 -0400 Subject: [PATCH] Add wireshark dissector for control protocol --- LuaScripts/gridctl.lua | 86 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 LuaScripts/gridctl.lua diff --git a/LuaScripts/gridctl.lua b/LuaScripts/gridctl.lua new file mode 100644 index 00000000..a14bd053 --- /dev/null +++ b/LuaScripts/gridctl.lua @@ -0,0 +1,86 @@ +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) \ No newline at end of file