mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-01 15:25:59 +00:00
86 lines
2.8 KiB
Lua
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) |