1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- function ftds_dissector(buffer, pinfo, tree, ftds_protocol, offset)
- local f_control_field = ProtoField.uint8("ftds_protocol.control_field", "Control Field", base.DEC)
- local f_session_id = ProtoField.uint8("ftds_protocol.session_id", "File Transfer Session ID", base.DEC)
- local f_segment_type = ProtoField.uint8("ftds_protocol.segment_type", "Segment Type", base.DEC)
- local f_sequence_num_size = ProtoField.uint8("ftds_protocol.sequence_num_size", "Sequence Number Size", base.DEC)
- local f_data_length_size = ProtoField.uint8("ftds_protocol.data_length_size", "Data Length Size", base.DEC)
- local f_sequence_num = ProtoField.uint32("ftds_protocol.sequence_num", "Sequence Number", base.DEC)
- local f_data_length = ProtoField.uint16("ftds_protocol.data_length", "Data Segment Length", base.DEC)
- local f_data_bytes = ProtoField.bytes("ftds_protocol.data_bytes", "Data Bytes", base.SPACE)
- -- Add the fields to the protocol
- ftds_protocol.fields = {
- f_control_field,
- f_session_id,
- f_segment_type,
- f_sequence_num_size,
- f_data_length_size,
- f_sequence_num,
- f_data_length,
- f_data_bytes
- }
- local subtree = tree:add(ftds_protocol, buffer(),"FTDS")
- local control_field = buffer(offset, 1):le_uint()
- subtree:add(f_control_field, control_field)
- offset = offset + 1
- -- Extract bits from Control Field
- local session_id = (control_field & 0x07) -- Bits 0-2
- local segment_type = ((control_field >> 3) & 0x03) -- Bits 3-4
- local seq_num_size = ((control_field >> 5) & 0x03) -- Bits 5-6
- local data_length_size = ((control_field >> 7) & 0x01) -- Bit 7
- -- Add the extracted fields to the tree
- local subtree1 = subtree:add(ftds_protocol, buffer(), "CONTROL FIELD DATA")
- subtree1:add(f_session_id, session_id)
- subtree1:add(f_segment_type, segment_type)
- subtree1:add(f_sequence_num_size, seq_num_size)
- subtree1:add(f_data_length_size, data_length_size)
- -- Sequence Number (1 to 4 bytes)
- local seq_num_length
- if seq_num_size == 0 then
- seq_num_length = 1
- elseif seq_num_size == 1 then
- seq_num_length = 2
- elseif seq_num_size == 2 then
- seq_num_length = 4
- end
-
- local sequence_num = buffer(offset, seq_num_length):le_uint()
- subtree:add(f_sequence_num, sequence_num)
- offset = offset + seq_num_length
- -- Data Segment Length (1 or 2 bytes)
- local data_length_length
- if data_length_size == 0 then
- data_length_length = 1
- elseif data_length_size == 1 then
- data_length_length = 2
- end
- local data_length = buffer(offset, data_length_length):le_uint()
- subtree:add(f_data_length, data_length)
- offset = offset + data_length_length
-
-
- local chunk_size = 16 -- You can adjust this value for your display preferences
- -- Iterate through the buffer and add chunks to the protocol tree
- while offset < data_length do
- -- Get the chunk data
- local chunk = buffer(offset, chunk_size)
- -- Format the label with the byte range, e.g., "Data bytes [0001-0016]:"
- local label = string.format("Data bytes [%.4d-%.4d]:", offset , offset + chunk_size)
- -- Add the chunk to the tree, using the label
- local data_field = subtree:add(f_data_bytes, chunk)
- -- Update the offset for the next chunk
- offset = offset + chunk_size
- end
- end
|