added license file (license is FreeBSD license)
[gs105e.git] / wireshark / nsdp.lua
1 -- create nsdp protocol and its fields
2 p_nsdp = Proto ("nsdp","Netgear Switch Description Protocol")
3 -- local f_source = ProtoField.uint16("nsdp.src", "Source", base.HEX)
4 local f_type = ProtoField.uint16("nsdp.type", "Type", base.HEX)
5 local f_source = ProtoField.ether("nsdp.src", "Source", base.HEX)
6 local f_destination = ProtoField.ether("nsdp.dst", "Destination", base.HEX)
7 local f_seq = ProtoField.uint16("nsdp.seq", "Seq", base.HEX)
8 local f_data = ProtoField.string("nsdp.data", "Data", FT_STRING)
9 local f_cmd = ProtoField.uint16("nsdp.cmd", "Command", base.HEX)
10 local f_password = ProtoField.string("nsdp.password", "Password", FT_STRING)
11 local f_newpassword = ProtoField.string("nsdp.newpassword", "New password", FT_STRING)
12 local f_flags = ProtoField.uint16("nsdp.flags", "Flags", base.HEX, {
13         [0x000a] = "Password error"
14 })
15
16 --local f_debug = ProtoField.uint8("nsdp.debug", "Debug")
17 p_nsdp.fields = {f_type,f_source,f_destination,f_seq,f_cmd,f_password,f_newpassword,f_flags}
18
19 -- nsdp dissector function
20 function p_nsdp.dissector (buf, pkt, root)
21   -- validate packet length is adequate, otherwise quit
22   if buf:len() == 0 then return end
23   pkt.cols.protocol = p_nsdp.name
24
25   -- create subtree for nsdp
26   subtree = root:add(p_nsdp, buf(0))
27   local offset = 0
28   local ptype = buf(offset,2):uint()
29   subtree:add(f_type, ptype)
30   offset = offset + 4
31   subtree:add(f_flags, buf(offset,2))
32   offset = offset + 4
33   subtree:add(f_source, buf(offset,6))
34   offset = offset + 6
35   subtree:add(f_destination, buf(offset,6))
36   offset = offset + 8
37   subtree:add(f_seq, buf(offset,2))
38   offset = offset + 10
39   local cmd = 0
40   if offset < buf:len() then
41     cmd = buf(offset, 2):uint()
42     offset = offset + 2
43   end
44   subtree:add(f_cmd, cmd)
45
46   if cmd == 1 then
47     subtree:append_text(", init")
48   elseif cmd == 0xa or (ptype == 0x0104 and cmd == 0) then
49     if ptype == 0x0103 then
50       local pw_len = buf(offset, 2):uint()
51       offset = offset + 2
52       subtree:add(f_password, buf(offset,pw_len))
53       offset = offset + pw_len
54       local next_up = buf(offset, 2):uint()
55       offset = offset + 2
56       if next_up == 0x0009 then
57         subtree:append_text(", reset password")
58         pw_len = buf(offset, 2):uint()
59         offset = offset + 2
60         subtree:add(f_newpassword, buf(offset,pw_len))
61       else
62         subtree:append_text(", login")
63       end
64     elseif ptype == 0x0104 then
65       if buf:len() == offset then
66         subtree:append_text(", password changed")
67       else
68         subtree:append_text(", logged in")
69       end
70     end
71   end
72 end
73
74 function p_nsdp.init()
75   -- init
76 end
77
78 local tcp_dissector_table = DissectorTable.get("udp.port")
79 dissector = tcp_dissector_table:get_dissector(63321)
80 tcp_dissector_table:add(63321, p_nsdp)
81
82 local tcp_dissector_table = DissectorTable.get("udp.port")
83 dissector = tcp_dissector_table:get_dissector(63322)
84 tcp_dissector_table:add(63322, p_nsdp)