assert(busy.size() == 1);
trace_logf(detection, TRACE_DETECTION_ENGINE, "(wire) %" PRIu64 " cs::stop %u (i=%zu, b=%zu)\n",
get_packet_number(), busy.back()->get_slot(), idle.size(), busy.size());
- idle.emplace_back(busy.back());
+
+ IpsContext* c = busy.back();
+ c->clear_context_data();
+ idle.emplace_back(c);
busy.pop_back();
}
if ( context == Snort::get_switcher()->get_context() )
{
// finish_packet is called here so that we clear wire packets at the right time
- finish_packet(context->packet);
+ finish_packet(context->packet, true);
}
}
clear_events(p);
}
-void DetectionEngine::finish_packet(Packet* p)
+void DetectionEngine::finish_packet(Packet* p, bool flow_deletion)
{
log_events(p);
clear_events(p);
const IpsContext* c = Snort::get_switcher()->get_next();
c->packet->release_helpers();
- Snort::get_switcher()->complete();
+ ContextSwitcher* sw = Snort::get_switcher();
+
+ if ( flow_deletion or sw->busy_count() > 1 )
+ sw->complete();
}
uint8_t* DetectionEngine::get_buffer(unsigned& max)
{
ContextSwitcher* sw = Snort::get_switcher();
- if ( p->type() != PktType::PDU or
- p->dsize < SnortConfig::get_conf()->offload_limit or
+ if ( p->dsize < SnortConfig::get_conf()->offload_limit or
!sw->can_hold() or
!offloader->available() )
{
switch ( p->type() )
{
case PktType::PDU:
- if ( offload_ok )
- return offload(p);
- // fall thru
-
case PktType::IP:
case PktType::TCP:
case PktType::UDP:
case PktType::ICMP:
case PktType::FILE:
+ if ( offload_ok and p->flow )
+ return offload(p);
+
fp_local(p);
break;
static void clear_events(Packet*);
static void finish_inspect_with_latency(Packet*);
static void finish_inspect(Packet*, bool inspected);
- static void finish_packet(Packet*);
+ static void finish_packet(Packet*, bool flow_deletion = false);
private:
IpsContext* context;