using namespace snort;
HeldPacket::HeldPacket(DAQ_Msg_h msg, uint32_t seq, const timeval& exp, TcpStreamTracker& trk)
- : daq_msg(msg), seq_num(seq), expiration(exp), tracker(trk)
+ : daq_msg(msg), seq_num(seq), expiration(exp), tracker(trk), expired(false)
{
}
bool has_expired(const timeval& cur_time)
{
- return !timercmp(&cur_time, &expiration, <);
+ expired = (timercmp(&cur_time, &expiration, <) == 0);
+ return expired;
+ }
+
+ bool has_expired()
+ {
+ return expired;
}
TcpStreamTracker& get_tracker() const { return tracker; }
uint32_t seq_num;
timeval expiration;
TcpStreamTracker& tracker;
+ bool expired;
};
class HeldPacketQueue
{
if ( cp->active->packet_was_dropped() )
{
- Analyzer::get_local_analyzer()->finalize_daq_message(held_packet->get_daq_msg(), DAQ_VERDICT_BLOCK);
+ DAQ_Verdict verdict = held_packet->has_expired() ? DAQ_VERDICT_BLACKLIST : DAQ_VERDICT_BLOCK;
+ Analyzer::get_local_analyzer()->finalize_daq_message(held_packet->get_daq_msg(), verdict);
tcpStats.held_packets_dropped++;
}
else
if ( (flow->session_state & STREAM_STATE_BLOCK_PENDING) ||
(flow->ssn_state.session_flags & SSNFLAG_BLOCK) )
{
- Analyzer::get_local_analyzer()->finalize_daq_message(held_packet->get_daq_msg(), DAQ_VERDICT_BLOCK);
+ DAQ_Verdict verdict = held_packet->has_expired() ? DAQ_VERDICT_BLACKLIST : DAQ_VERDICT_BLOCK;
+ Analyzer::get_local_analyzer()->finalize_daq_message(held_packet->get_daq_msg(), verdict);
tcpStats.held_packets_dropped++;
}
else