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