1-- dissects the Gvcp Protocol
2gvcp_proto = Proto("gvcp", "Gigabit ethernet camera control protocol")
3
4local f = gvcp_proto.fields
5
6local packet_types = {
7	[0x0000] = "Acknowledge",
8	[0x4201] = "Command"
9}
10
11local commands = {
12	[0x0002] = "DiscoverCmd",
13	[0x0003] = "DiscoverAck",
14	[0x0004] = "ByeCmd",
15	[0x0005] = "ByeAck",
16	[0x0040] = "PacketResendCmd",
17	[0x0041] = "PacketResendAck",
18	[0x0080] = "RegisterReadCmd",
19	[0x0081] = "RegisterReadAck",
20	[0x0082] = "RegisterWriteCmd",
21	[0x0083] = "RegisterWriteAck",
22	[0x0084] = "MemoryReadCmd",
23	[0x0085] = "MemoryReadAck",
24	[0x0086] = "MemoryWriteCmd",
25	[0x0087] = "MemoryWriteAck"
26}
27
28f.packet_type = ProtoField.uint16 ("gvcp.packet_type",  "PacketType", nil, packet_types)
29f.command = ProtoField.uint16 ("gvcp.command",  "Command", nil, commands)
30f.size = ProtoField.uint16 ("gvcp.size", "Size");
31f.count = ProtoField.uint16 ("gvcp.count", "Count");
32f.register_address = ProtoField.uint32 ("gvcp.register_address", "RegisterAddress");
33f.register_value = ProtoField.uint32 ("gvcp.register_value", "RegisterValue");
34f.memory_address = ProtoField.uint32 ("gvcp.memory_address", "MemoryAddress");
35f.memory_size = ProtoField.uint32 ("gvcp.memory_size", "MemorySize");
36f.memory_value = ProtoField.string ("gvcp.memory_value", "MemoryValue");
37
38local packet_counter
39
40function gvcp_proto.init ()
41	packet_counter = 0
42end
43
44-- create a function to dissect it
45function gvcp_proto.dissector(buffer,pinfo,tree)
46
47	local subtree = tree:add (gvcp_proto, buffer())
48	local offset = 0
49
50	local packet_type = buffer (offset, 2)
51	subtree:add (f.packet_type, packet_type)
52	offset = offset + 2
53
54	local command = buffer (offset, 2)
55	cmd = command:uint()
56
57	subtree:add (f.command, command)
58	offset = offset + 2
59
60	subtree:add (f.size, buffer (offset, 2))
61	offset = offset + 2
62
63	subtree:add (f.count, buffer (offset, 2))
64
65	offset = offset + 2
66
67	if cmd == 0x80 then -- Register read cmd
68		subtree:add (f.register_address, buffer (offset, 4))
69		offset = offset + 4
70	elseif cmd == 0x81 then -- Register read ans
71		subtree:add (f.register_value, buffer (offset, 4))
72		offset = offset + 4
73	elseif cmd == 0x84 then -- Memory read cmd
74		subtree:add (f.memory_address, buffer (offset, 4))
75		offset = offset + 4
76		subtree:add (f.memory_size, buffer (offset, 4))
77		offset = offset + 4
78	elseif cmd == 0x85 then -- Memory read ans
79		subtree:add (f.memory_address, buffer (offset, 4))
80		offset = offset + 4
81		subtree:add (f.memory_value, buffer (offset, 16):string())
82	end
83
84end
85
86-- load the tcp.port table
87udp_table = DissectorTable.get("udp.port")
88-- register our protocol to handle udp port 3956
89udp_table:add(3956,gvcp_proto)
90
91