Squashed commit of the following:
commit
2eab74e332742c3afbffbdcf2f366a90a7bcd0db
Author: Masud Hasan <mashasan@cisco.com>
Date: Thu Feb 18 22:05:52 2021 -0500
stream_tcp: Flush queued segments when FIN is received
{
if ( !flow->two_way_traffic() )
trk.set_tf_flags(TF_FORCE_FLUSH);
- if ( tsd.is_data_segment() )
- trk.session->handle_data_segment(tsd);
+ trk.perform_fin_recv_flush(tsd);
}
return true;
bool TcpStateEstablished::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
trk.update_tracker_ack_recv(tsd);
- if ( tsd.is_data_segment() )
- trk.session->handle_data_segment(tsd);
+ trk.perform_fin_recv_flush(tsd);
if ( trk.update_on_fin_recv(tsd) )
{
bool is_ack_valid = false;
if ( check_for_window_slam(tsd, trk, &is_ack_valid) )
{
- if ( tsd.is_data_segment() )
- trk.session->handle_data_segment(tsd);
+ trk.perform_fin_recv_flush(tsd);
if ( !flow->two_way_traffic() )
trk.set_tf_flags(TF_FORCE_FLUSH);
trk.update_tracker_ack_recv(tsd);
if ( trk.update_on_fin_recv(tsd) )
{
- if ( tsd.is_data_segment() )
- trk.session->handle_data_segment(tsd);
+ trk.perform_fin_recv_flush(tsd);
if ( !flow->two_way_traffic() )
trk.set_tf_flags(TF_FORCE_FLUSH);
trk.update_tracker_ack_recv(tsd);
trk.session->set_pkt_action_flag(trk.normalizer.handle_paws(tsd));
flow->session_state |= STREAM_STATE_ACK;
- if ( tsd.is_data_segment() )
- trk.session->handle_data_segment(tsd);
+ trk.perform_fin_recv_flush(tsd);
if ( trk.update_on_fin_recv(tsd) )
{
bool TcpStateSynSent::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
- if ( tsd.is_data_segment() )
- trk.session->handle_data_segment(tsd);
-
+ trk.perform_fin_recv_flush(tsd);
return true;
}
trk.normalizer.packet_dropper(tsd, NORM_TCP_BLOCK);
trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
}
- else if ( tsd.is_data_segment() )
- trk.session->handle_data_segment(tsd);
+ else
+ trk.perform_fin_recv_flush(tsd);
return true;
}
return true;
}
+void TcpStreamTracker::perform_fin_recv_flush(TcpSegmentDescriptor& tsd)
+{
+ if ( tsd.is_data_segment() )
+ session->handle_data_segment(tsd);
+ else if ( flush_policy == STREAM_FLPOLICY_ON_DATA and SEQ_EQ(tsd.get_seq(), rcv_nxt) )
+ reassembler.flush_queued_segments(tsd.get_flow(), true, tsd.get_pkt());
+}
+
uint32_t TcpStreamTracker::perform_partial_flush()
{
uint32_t flushed = 0;
bool is_retransmit_of_held_packet(snort::Packet*);
void finalize_held_packet(snort::Packet*);
void finalize_held_packet(snort::Flow*);
+ void perform_fin_recv_flush(TcpSegmentDescriptor&);
uint32_t perform_partial_flush();
bool is_holding_packet() const { return held_packet != null_iterator; }