Added WireShark.lua to viszualize CAN_ETH streams as used in embedded GW

master
Andreas Kirsch 2025-10-08 14:41:02 +02:00
parent 9d335ea35d
commit 96403985e9
1 changed files with 79 additions and 0 deletions

View File

@ -0,0 +1,79 @@
-- ###############################################################
-- Custom UDP Dissector für dein CAN-over-UDP-Gateway
-- ###############################################################
local myudp_proto = Proto("ICSG_CAN-ETH", "ICSG CAN-ETH-GW - UDP Stream")
-- Felddefinitionen
local f_arbid = ProtoField.uint32("myudp.arbid", "Arbitration ID", base.HEX)
local f_len = ProtoField.uint8("myudp.len", "Length")
local f_data = ProtoField.bytes("myudp.data", "Data Bytes")
local f_fd = ProtoField.bool("myudp.fd", "FD")
local f_xtd = ProtoField.bool("myudp.xtd", "XTD")
local f_remote = ProtoField.bool("myudp.remote", "Remote")
local f_brs = ProtoField.bool("myudp.brs", "BRS")
myudp_proto.fields = { f_arbid, f_len, f_data, f_fd, f_xtd, f_remote, f_brs }
function myudp_proto.dissector(buffer, pinfo, tree)
local port = pinfo.src_port
local payload_len = buffer:len()
-- Datenlänge abhängig vom Port
local data_len = 0
if port == 60001 or port == 60002 then
data_len = 8
elseif port == 60003 or port == 60004 then
data_len = 64
else
return
end
pinfo.cols.protocol = "ICSG_CAN-ETH"
local subtree = tree:add(myudp_proto, buffer(), "ICSG CAN on UDP Stream")
-- Offsets ab UDP-Payload
local off_arbid = 0
local off_len = 4
local off_data = 5
local off_bits = off_data + data_len
-- Sicherheitsprüfung: Buffer-Länge prüfen
if payload_len < off_bits + 1 then
subtree:add_expert_info(PI_MALFORMED, PI_ERROR, "Packet too short for expected fields")
return
end
-- Felder nur hinzufügen, wenn genug Daten vorhanden sind
if payload_len >= off_arbid + 4 then
subtree:add(f_arbid, buffer(off_arbid,4))
end
if payload_len >= off_len + 1 then
subtree:add(f_len, buffer(off_len,1))
end
if payload_len >= off_data + data_len then
subtree:add(f_data, buffer(off_data, data_len))
end
if payload_len >= off_bits + 1 then
local bitfield = buffer(off_bits,1):uint()
local b_fd = bit32.band(bitfield, 0x01) ~= 0
local b_xtd = bit32.band(bitfield, 0x02) ~= 0
local b_remote = bit32.band(bitfield, 0x04) ~= 0
local b_brs = bit32.band(bitfield, 0x08) ~= 0
subtree:add(f_fd, b_fd)
subtree:add(f_xtd, b_xtd)
subtree:add(f_remote, b_remote)
subtree:add(f_brs, b_brs)
end
end
-- UDP-Ports registrieren
local udp_table = DissectorTable.get("udp.port")
udp_table:add(60001, myudp_proto)
udp_table:add(60002, myudp_proto)
udp_table:add(60003, myudp_proto)
udp_table:add(60004, myudp_proto)