I have been working on various Lua based dissectors.
I found something that I would entitle as undesirable, however I'm not sure if
it is a actual bug.
For example if I have a TCP connection with packets over it and the packets
contain messages including a header.
it would be very well possible that there are two TCP packets.
One including the first message and the first part of the second
message
The second with the second part of the second message and the third
message
In order to instruct the Lua dissector to combine multiple packets, TCP
reconstruction is (ab)used.
when dissecting the first packet, there is not enough data for the
second message therefore a negative value of the second part of the second
message is returned
and the pinfo.desegment_len and pinfo.desegment_offset
are set
when the second packet is received, it takes the number of bytes as
specified in pinfo.desegment_len and adds it to the buffer of the previous
dissect.
It than reruns the dissector.
next it calls the dissector again with the remaining
part of the second packet.
To me this appears to be strange since in the GUI, the frame tab is not fully
included in the Reassembled TCP tab.
The third message is not in the reassembled data and I don't know how to handle
it as a big block ( since I am not aware of the third message while handling
the first packet)
Please see http://www.cloudshark.org/captures/2a86e8fd2c69 for a demo pcap
including the scenarion above and one with 4 messages over 3 packets.
the dissector used :
do
local p_nuffproto = Proto("nuff_protocol", "Nuff Protocol")
local f_tag = ProtoField.string ("nuff_protocol.starttag" ,
"Start Tag " )
local f_length = ProtoField.uint16 ("nuff_protocol.length" ,
"Length ", base.DEC)
local f_data = ProtoField.bytes ("nuff_protocol.data" ,
"Data ", base.HEX)
p_nuffproto.fields = {f_tag,f_length,f_data}
local STARTTAGLENGTH = 8
local LENGTHLENGTH = 2
local HEADERLENGTH = STARTTAGLENGTH + LENGTHLENGTH
function p_nuffproto.dissector(buf,pinfo,root)
local offset = 0
local remaining = buf:len() - offset
while ( remaining > 0 ) do
-- make sure we have enough data to read the header
if ( remaining < HEADERLENGTH) then
pinfo.desegment_len = (HEADERLENGTH - remaining) -- how
much more do we need
pinfo.desegment_offset = 0 -- start with disector from 0
next run
return (remaining - HEADERLENGTH)
end
local len = buf(offset+STARTTAGLENGTH,LENGTHLENGTH):uint()
if ( len > remaining ) then
pinfo.desegment_len = (len - remaining) -- how much more
do we need
pinfo.desegment_offset = 0 -- start with disector from 0
next run
return (remaining - len)
end
local subtree = root:add(p_nuffproto,buf(offset,len))
subtree:add(f_tag , buf(offset ,STARTTAGLENGTH))
subtree:add(f_length, buf(offset +
STARTTAGLENGTH,LENGTHLENGTH))
subtree:add(f_data , buf(offset + HEADERLENGTH,(len -
HEADERLENGTH)))
pinfo.cols.protocol = "NUFF"
offset = offset + len
remaining = buf:len() - offset
end
end
-- register to the UDP port
local tcp_encap_table = DissectorTable.get("tcp.port")
tcp_encap_table:add(33445, p_nuffproto)
end
Please note that both the data and the dissector are "created" to demo the
effect.
I would like to know if:
* The effect is intended to behave this way
* Is there a way to keep rerunning the dissector until it no longer
returns a negative value ?
* Is there another way of combining the data from various packets
with the wslua api ?
Thanks and all the best,
Sjoerd van doorn
___________________________________________________________________________
Sent via: Wireshark-dev mailing list <[email protected]>
Archives: http://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
mailto:[email protected]?subject=unsubscribe