aboutsummaryrefslogtreecommitdiffstats
path: root/ch340.lua
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2024-02-18 19:06:51 +0000
committers-ol <s+removethis@s-ol.nu>2024-02-18 19:06:51 +0000
commite6d5342c2049f03a3397c7390257169310edd843 (patch)
treeaaa0ab9ae72b47939d6d58b84e884f48459413a2 /ch340.lua
parentinitial commit (diff)
downloadt937-serial-e6d5342c2049f03a3397c7390257169310edd843.tar.gz
t937-serial-e6d5342c2049f03a3397c7390257169310edd843.zip
improve wireshark dissectors
Diffstat (limited to 'ch340.lua')
-rwxr-xr-xch340.lua136
1 files changed, 61 insertions, 75 deletions
diff --git a/ch340.lua b/ch340.lua
index 37adef7..14c92bb 100755
--- a/ch340.lua
+++ b/ch340.lua
@@ -1,14 +1,14 @@
-local ch340_ctl = Proto("ch340.ctl", "CH340 Serial Control")
-local ch340_bulk = Proto("ch340.bulk", "CH340 Serial Data")
+local control = Proto("ch340.ctl", "CH340 Serial Control")
+local bulk = Proto("ch340.bulk", "CH340 Serial Data")
local ep_dir_f = Field.new("usb.endpoint_address.direction")
local REQ_TBL = {
- [0x5F] = "CH341_REQ_READ_VERSION",
- [0x9A] = "CH341_REQ_WRITE_REG",
- [0x95] = "CH341_REQ_READ_REG",
- [0xA1] = "CH341_REQ_SERIAL_INIT",
- [0xA4] = "CH341_REQ_MODEM_CTRL",
+ [0x5F] = "CH341_REQ_READ_VERSION",
+ [0x9A] = "CH341_REQ_WRITE_REG",
+ [0x95] = "CH341_REQ_READ_REG",
+ [0xA1] = "CH341_REQ_SERIAL_INIT",
+ [0xA4] = "CH341_REQ_MODEM_CTRL",
}
local REG_TBL = {
@@ -20,84 +20,70 @@ local REG_TBL = {
[0x25] = "LCR2",
}
-local req_F = ProtoField.uint8("ch340.ctl.req", "Request", base.HEX, REQ_TBL)
-local reg1_F = ProtoField.uint8("ch340.ctl.reg1", "Register 1", base.HEX, REG_TBL)
-local reg2_F = ProtoField.uint8("ch340.ctl.reg2", "Register 2", base.HEX, REG_TBL)
-local val1_F = ProtoField.uint8("ch340.ctl.val1", "Value 1", base.HEX)
-local val2_F = ProtoField.uint8("ch340.ctl.val2", "Value 2", base.HEX)
-local modem_F = ProtoField.uint8("ch340.ctl.modem", "Modem", base.HEX)
-
-ch340_ctl.fields = {
- req_F,
- reg1_F,
- val1_F,
- reg2_F,
- val2_F,
- modem_F,
-}
-
-local data_in_F = ProtoField.bytes("ch340.bulk.data_in", "Data In")
-local data_out_F = ProtoField.bytes("ch340.bulk.data_out", "Data Out")
+control.fields.req = ProtoField.uint8("ch340.ctl.req", "Request", base.HEX, REQ_TBL)
+control.fields.reg1 = ProtoField.uint8("ch340.ctl.reg1", "Register 1", base.HEX, REG_TBL)
+control.fields.reg2 = ProtoField.uint8("ch340.ctl.reg2", "Register 2", base.HEX, REG_TBL)
+control.fields.val1 = ProtoField.uint8("ch340.ctl.val1", "Value 1", base.HEX)
+control.fields.val2 = ProtoField.uint8("ch340.ctl.val2", "Value 2", base.HEX)
+control.fields.modem = ProtoField.uint8("ch340.ctl.modem", "Modem", base.HEX)
-ch340_bulk.fields = {
- data_in_F,
- data_out_F,
-}
+bulk.fields.data_in = ProtoField.bytes("ch340.bulk.data_in", "Data In")
+bulk.fields.data_out = ProtoField.bytes("ch340.bulk.data_out", "Data Out")
-local serial_tbl = DissectorTable.heuristic_new("ch340.serial_data", ch340_bulk)
+local serial_tbl = DissectorTable.heuristic_new("ch340.serial_data", bulk)
-function ch340_ctl.dissector(buffer, pinfo, tree)
+function control.dissector(buffer, pinfo, tree)
if buffer:captured_len() < 1 then return end
- local sub = tree:add(ch340_ctl, buffer())
+ local sub = tree:add(control, buffer())
local req = buffer(0, 1)
- sub:add(req_F, req)
-
- req = REQ_TBL[req:uint()]
- pinfo.cols.info:set("CH340 " .. req:sub(11))
- if req == "CH341_REQ_WRITE_REG" or
- req == "CH341_REQ_READ_REG" then
-
- local reg2 = buffer(1, 1)
- local reg1 = buffer(2, 1)
- sub:add(reg1_F, reg1)
- sub:add(reg2_F, reg2)
-
- reg1 = reg1:uint()
- reg2 = reg2:uint()
-
- pinfo.cols.info:append(string.format(" %s/%s", (REG_TBL[reg1] or reg1), (REG_TBL[reg2] or reg2)))
-
- if req == "CH341_REQ_WRITE_REG" then
- local val2 = buffer(3, 1)
- local val1 = buffer(4, 1)
- sub:add(val1_F, val1)
- sub:add(val2_F, val2)
- end
- elseif name == "CH341_REQ_MODEM_CTRL" then
- sub:add(modem_F, buffer(1))
- end
+ sub:add(control.fields.req, req)
+
+ req = REQ_TBL[req:uint()] or ""
+ pinfo.cols.info:set("CH340 " .. req:sub(11))
+ if req == "CH341_REQ_WRITE_REG" or
+ req == "CH341_REQ_READ_REG" then
+
+ local reg2 = buffer(1, 1)
+ local reg1 = buffer(2, 1)
+ sub:add(control.fields.reg1, reg1)
+ sub:add(control.fields.reg2, reg2)
+
+ reg1 = reg1:uint()
+ reg2 = reg2:uint()
+
+ pinfo.cols.info:append(string.format(" %s/%s", (REG_TBL[reg1] or reg1), (REG_TBL[reg2] or reg2)))
+
+ if req == "CH341_REQ_WRITE_REG" then
+ local val2 = buffer(3, 1)
+ local val1 = buffer(4, 1)
+ sub:add(control.fields.val1, val1)
+ sub:add(control.fields.val2, val2)
+ end
+ elseif name == "CH341_REQ_MODEM_CTRL" then
+ sub:add(control.fields.modem, buffer(1))
+ end
end
-function ch340_bulk.dissector(buffer, pinfo, tree)
+function bulk.dissector(buffer, pinfo, tree)
if buffer:captured_len() < 1 then return end
- local sub = tree:add(ch340_bulk, buffer())
- pinfo.cols.info:set("CH340 Serial")
+ local sub = tree:add(bulk, buffer())
+ pinfo.cols.info:set("CH340 Serial")
- local ep_dir = ep_dir_f()() -- 0: h2d, 1: d2h
- if ep_dir == 0 then
- pinfo.cols.info:append(" out")
- pinfo.p2p_dir = P2P_DIR_SENT
- sub:add(data_out_F, buffer())
+ local ep_dir = ep_dir_f()() -- 0: h2d, 1: d2h
+ if ep_dir == 0 then
+ pinfo.cols.info:append(" out")
+ pinfo.p2p_dir = P2P_DIR_SENT
+ sub:add(bulk.fields.data_out, buffer())
else
- pinfo.cols.info:append(" in")
- pinfo.p2p_dir = P2P_DIR_RECV
- sub:add(data_in_F, buffer())
- end
+ pinfo.cols.info:append(" in")
+ pinfo.p2p_dir = P2P_DIR_RECV
+ sub:add(bulk.fields.data_in, buffer())
+ end
- DissectorTable.try_heuristics("ch340.serial_data", buffer, pinfo, tree)
+ DissectorTable.try_heuristics("ch340.serial_data", buffer, pinfo, tree)
end
function usb_protocol_key(class, subclass, protocol)
@@ -110,9 +96,9 @@ function usb_protocol_key(class, subclass, protocol)
end
local ctl_table = DissectorTable.get("usb.control")
-ctl_table:add(usb_protocol_key(0xff, 0x01, 0x02), ch340_ctl)
-ctl_table:add(0xffff, ch340_ctl)
+ctl_table:add(usb_protocol_key(0xff, 0x01, 0x02), control)
+ctl_table:add(0xffff, control)
local bulk_table = DissectorTable.get("usb.bulk")
-bulk_table:add(usb_protocol_key(0xff, 0x01, 0x02), ch340_bulk)
-bulk_table:add(0xffff, ch340_bulk)
+bulk_table:add(usb_protocol_key(0xff, 0x01, 0x02), bulk)
+bulk_table:add(0xffff, bulk)