Added WireShark.lua to viszualize CAN_ETH streams as used in embedded GW
parent
9d335ea35d
commit
96403985e9
|
|
@ -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)
|
||||||
Loading…
Reference in New Issue