THERE IS NO ERROR CHECKING in this. Buyer beware!!!
There are a few more fields to be done.
With the existing sample capture being mostly "0" and the ff
failed flag it's hard to test the field results in the tree.
Should Beacon Type
be a int8
since valid value includes -1
?
Frame 814: 104 bytes on wire (832 bits), 104 bytes captured (832 bits) on interface \Device\NPF_Loopback, id 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1 (127.0.0.1), Dst: 127.0.0.1 (127.0.0.1)
User Datagram Protocol, Src Port: 1035, Dst Port: 1034
Common Image Generator Interface (3), 127.0.0.1 => 127.0.0.1 (72 bytes)
IG Control (24 bytes)
User-Defined Data (48 bytes)
Packet ID: User-Defined Data (201)
Packet Size (bytes): 48
Data: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff000000
CIGI Data Protocol
Instance ID: 0
Mode: 0
Mode Secondary: 0
Autostabilization: 0
Autotilt: 0
Gain (dBs): 0
Gain Secondary (dBs): 0
Scan Range (meters): 0
Beacon Type: 255
CIGI data: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff000000
-- cigidata.lua
-- https://ask.wireshark.org/question/35173/how-to-add-cigis-user-defined-packet-at-wireshark-using-lua-script/
-- Replace occurrences of "easypost/EASYPOST" with protocol/dissector name.
-- Grab and format fields as needed
-- Step 1 - document as you go. See header above and set_plugin_info().
local cigidata_info =
{
version = "1.0.0",
author = "Good Coder",
description = "CIGI data",
repository = "Floppy in top drawer"
}
set_plugin_info(cigidata_info)
-- Step 2 - create a protocol to attach new fields to
local cigidata_p = Proto.new("cigidata","CIGI Data Protocol")
-- Step 3 - add some field(s) to Step 2 protocol
local pf = {
instance_id = ProtoField.uint16( "cigidata.instance_id", "Instance ID"),
mode = ProtoField.uint8( "cigidata.mode", "Mode"),
mode_secondary = ProtoField.uint8( "cigidata.mode_secondary", "Mode Secondary"),
autostabilization = ProtoField.uint8( "cigidata.autostabilization", "Autostabilization"),
autotilt = ProtoField.uint8( "cigidata.autotilt", "Autotilt"),
gain = ProtoField.float( "cigidata.gain", "Gain (dBs)"),
gain_secondary = ProtoField.float( "cigidata.gain_secondary", "Gain Secondary (dBs)"),
scan_range = ProtoField.float( "cigidata.scan_range", "Scan Range (meters)"),
beacon_type = ProtoField.uint8( "cigidata.beacon_type", "Beacon Type"),
payload = ProtoField.bytes( "cigidata.payload", "CIGI data")
}
cigidata_p.fields = pf
-- Step 4 - create a Field extractor to copy packet field data.
cigidata_payload_f = Field.new("cigi.data")
-- Step 5 - create the postdissector function that will run on each frame/packet
function cigidata_p.dissector(tvb,pinfo,tree)
local subtree = nil
-- copy existing field(s) into table for processing
finfo = { cigidata_payload_f() }
if (#finfo > 0) then
if not subtree then
subtree = tree:add(cigidata_p)
end
for k, v in pairs(finfo) do
-- process data and add results to the tree
-- local field_data = string.format("%s", v):upper()
subtree:add(pf.instance_id, v.range(0,2))
subtree:add(pf.mode, v.range(2,1))
subtree:add(pf.mode_secondary, v.range(3,1))
subtree:add(pf.autostabilization,v.range(4,1))
subtree:add(pf.autotilt, v.range(5,1))
subtree:add(pf.gain, v.range(6,4))
subtree:add(pf.gain_secondary, v.range(10,4))
subtree:add(pf.scan_range, v.range(14,4))
subtree:add(pf.beacon_type, v.range(42,1))
subtree:add(pf.payload, v.range)
end
end
end
-- Step 6 - register the new protocol as ...
(more)