uint32_t get_xtradata_mask() const
{ return trs.xtradata_mask; }
+ bool data_was_queued() const
+ { return trs.sos.total_bytes_queued > 0; }
+
uint32_t get_seg_count() const
{ return trs.sos.seg_count; }
void TcpStreamTracker::finish_client_init(TcpSegmentDescriptor& tsd)
{
Flow* flow = tsd.get_flow();
-
rcv_nxt = tsd.get_end_seq();
+ if ( reassembler.data_was_queued() )
+ return; // we already have state, don't mess it up
+
if ( !( flow->session_state & STREAM_STATE_MIDSTREAM ) )
{
- reassembler.set_seglist_base_seq(tsd.get_seq() + 1);
+ if ( tsd.get_tcph()->is_syn() )
+ reassembler.set_seglist_base_seq(tsd.get_seq() + 1);
+ else
+ reassembler.set_seglist_base_seq(tsd.get_seq());
+
r_win_base = tsd.get_end_seq();
}
else
if ( good_ack )
{
- if (!irs)
+ if (!irs) // FIXIT-L zero is a valid seq# so this kind of check is incorrect
irs = tsd.get_seq();
finish_client_init(tsd);
update_tracker_ack_recv(tsd);