mirror of
https://github.com/zeek/zeek.git
synced 2025-10-15 21:18:20 +00:00
Add new Session base class
This is mostly code copied from the existing Connection class, as that class now inherits from Session.
This commit is contained in:
parent
c752d76052
commit
8fbab9408a
8 changed files with 618 additions and 319 deletions
186
src/Conn.cc
186
src/Conn.cc
|
@ -21,53 +21,18 @@
|
|||
#include "zeek/iosource/IOSource.h"
|
||||
|
||||
namespace zeek {
|
||||
namespace detail {
|
||||
|
||||
void ConnectionTimer::Init(Connection* arg_conn, timer_func arg_timer,
|
||||
bool arg_do_expire)
|
||||
{
|
||||
conn = arg_conn;
|
||||
timer = arg_timer;
|
||||
do_expire = arg_do_expire;
|
||||
Ref(conn);
|
||||
}
|
||||
|
||||
ConnectionTimer::~ConnectionTimer()
|
||||
{
|
||||
if ( conn->RefCnt() < 1 )
|
||||
reporter->InternalError("reference count inconsistency in ~ConnectionTimer");
|
||||
|
||||
conn->RemoveTimer(this);
|
||||
Unref(conn);
|
||||
}
|
||||
|
||||
void ConnectionTimer::Dispatch(double t, bool is_expire)
|
||||
{
|
||||
if ( is_expire && ! do_expire )
|
||||
return;
|
||||
|
||||
// Remove ourselves from the connection's set of timers so
|
||||
// it doesn't try to cancel us.
|
||||
conn->RemoveTimer(this);
|
||||
|
||||
(conn->*timer)(t);
|
||||
|
||||
if ( conn->RefCnt() < 1 )
|
||||
reporter->InternalError("reference count inconsistency in ConnectionTimer::Dispatch");
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
uint64_t Connection::total_connections = 0;
|
||||
uint64_t Connection::current_connections = 0;
|
||||
|
||||
Connection::Connection(NetSessions* s, const detail::ConnIDKey& k, double t,
|
||||
const ConnID* id, uint32_t flow, const Packet* pkt)
|
||||
: Session(t, connection_timeout, connection_status_update,
|
||||
detail::connection_status_update_interval)
|
||||
{
|
||||
sessions = s;
|
||||
key = k;
|
||||
key_valid = true;
|
||||
start_time = last_time = t;
|
||||
|
||||
orig_addr = id->src_addr;
|
||||
resp_addr = id->dst_addr;
|
||||
|
@ -92,19 +57,11 @@ Connection::Connection(NetSessions* s, const detail::ConnIDKey& k, double t,
|
|||
vlan = pkt->vlan;
|
||||
inner_vlan = pkt->inner_vlan;
|
||||
|
||||
is_active = 1;
|
||||
skip = 0;
|
||||
weird = 0;
|
||||
|
||||
suppress_event = 0;
|
||||
|
||||
record_contents = record_packets = 1;
|
||||
record_current_packet = record_current_content = 0;
|
||||
|
||||
timers_canceled = 0;
|
||||
inactivity_timeout = 0;
|
||||
installed_status_timer = 0;
|
||||
|
||||
finished = 0;
|
||||
|
||||
hist_seen = 0;
|
||||
|
@ -217,12 +174,6 @@ void Connection::NextPacket(double t, bool is_orig,
|
|||
run_state::current_pkt = nullptr;
|
||||
}
|
||||
|
||||
void Connection::SetLifetime(double lifetime)
|
||||
{
|
||||
ADD_TIMER(&Connection::DeleteTimer, run_state::network_time + lifetime, 0,
|
||||
detail::TIMER_CONN_DELETE);
|
||||
}
|
||||
|
||||
bool Connection::IsReuse(double t, const u_char* pkt)
|
||||
{
|
||||
return root_analyzer && root_analyzer->IsReuse(t, pkt);
|
||||
|
@ -271,76 +222,6 @@ void Connection::HistoryThresholdEvent(EventHandlerPtr e, bool is_orig,
|
|||
);
|
||||
}
|
||||
|
||||
void Connection::DeleteTimer(double /* t */)
|
||||
{
|
||||
if ( is_active )
|
||||
Event(connection_timeout, nullptr);
|
||||
|
||||
sessions->Remove(this);
|
||||
}
|
||||
|
||||
void Connection::InactivityTimer(double t)
|
||||
{
|
||||
if ( last_time + inactivity_timeout <= t )
|
||||
{
|
||||
Event(connection_timeout, nullptr);
|
||||
sessions->Remove(this);
|
||||
++detail::killed_by_inactivity;
|
||||
}
|
||||
else
|
||||
ADD_TIMER(&Connection::InactivityTimer,
|
||||
last_time + inactivity_timeout, 0,
|
||||
detail::TIMER_CONN_INACTIVITY);
|
||||
}
|
||||
|
||||
void Connection::RemoveConnectionTimer(double t)
|
||||
{
|
||||
RemovalEvent();
|
||||
sessions->Remove(this);
|
||||
}
|
||||
|
||||
void Connection::SetInactivityTimeout(double timeout)
|
||||
{
|
||||
if ( timeout == inactivity_timeout )
|
||||
return;
|
||||
|
||||
// First cancel and remove any existing inactivity timer.
|
||||
for ( const auto& timer : timers )
|
||||
if ( timer->Type() == detail::TIMER_CONN_INACTIVITY )
|
||||
{
|
||||
detail::timer_mgr->Cancel(timer);
|
||||
break;
|
||||
}
|
||||
|
||||
if ( timeout )
|
||||
ADD_TIMER(&Connection::InactivityTimer,
|
||||
last_time + timeout, 0, detail::TIMER_CONN_INACTIVITY);
|
||||
|
||||
inactivity_timeout = timeout;
|
||||
}
|
||||
|
||||
void Connection::EnableStatusUpdateTimer()
|
||||
{
|
||||
if ( installed_status_timer )
|
||||
return;
|
||||
|
||||
if ( connection_status_update && zeek::detail::connection_status_update_interval )
|
||||
{
|
||||
ADD_TIMER(&Connection::StatusUpdateTimer,
|
||||
run_state::network_time + detail::connection_status_update_interval, 0,
|
||||
detail::TIMER_CONN_STATUS_UPDATE);
|
||||
installed_status_timer = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void Connection::StatusUpdateTimer(double t)
|
||||
{
|
||||
EnqueueEvent(connection_status_update, nullptr, ConnVal());
|
||||
ADD_TIMER(&Connection::StatusUpdateTimer,
|
||||
run_state::network_time + detail::connection_status_update_interval, 0,
|
||||
detail::TIMER_CONN_STATUS_UPDATE);
|
||||
}
|
||||
|
||||
const RecordValPtr& Connection::ConnVal()
|
||||
{
|
||||
if ( ! conn_val )
|
||||
|
@ -460,68 +341,12 @@ void Connection::RemovalEvent()
|
|||
EnqueueEvent(connection_state_remove, nullptr, ConnVal());
|
||||
}
|
||||
|
||||
void Connection::Event(EventHandlerPtr f, analyzer::Analyzer* analyzer, const char* name)
|
||||
{
|
||||
if ( ! f )
|
||||
return;
|
||||
|
||||
if ( name )
|
||||
EnqueueEvent(f, analyzer, make_intrusive<StringVal>(name), ConnVal());
|
||||
else
|
||||
EnqueueEvent(f, analyzer, ConnVal());
|
||||
}
|
||||
|
||||
void Connection::EnqueueEvent(EventHandlerPtr f, analyzer::Analyzer* a,
|
||||
Args args)
|
||||
{
|
||||
// "this" is passed as a cookie for the event
|
||||
event_mgr.Enqueue(f, std::move(args), util::detail::SOURCE_LOCAL, a ? a->GetID() : 0, this);
|
||||
}
|
||||
|
||||
void Connection::Weird(const char* name, const char* addl, const char* source)
|
||||
{
|
||||
weird = 1;
|
||||
reporter->Weird(this, name, addl ? addl : "", source ? source : "");
|
||||
}
|
||||
|
||||
void Connection::AddTimer(timer_func timer, double t, bool do_expire,
|
||||
detail::TimerType type)
|
||||
{
|
||||
if ( timers_canceled )
|
||||
return;
|
||||
|
||||
// If the key is cleared, the connection isn't stored in the connection
|
||||
// table anymore and will soon be deleted. We're not installing new
|
||||
// timers anymore then.
|
||||
if ( ! key_valid )
|
||||
return;
|
||||
|
||||
detail::Timer* conn_timer = new detail::ConnectionTimer(this, timer, t, do_expire, type);
|
||||
detail::timer_mgr->Add(conn_timer);
|
||||
timers.push_back(conn_timer);
|
||||
}
|
||||
|
||||
void Connection::RemoveTimer(detail::Timer* t)
|
||||
{
|
||||
timers.remove(t);
|
||||
}
|
||||
|
||||
void Connection::CancelTimers()
|
||||
{
|
||||
// We are going to cancel our timers which, in turn, may cause them to
|
||||
// call RemoveTimer(), which would then modify the list we're just
|
||||
// traversing. Thus, we first make a copy of the list which we then
|
||||
// iterate through.
|
||||
TimerPList tmp(timers.length());
|
||||
std::copy(timers.begin(), timers.end(), std::back_inserter(tmp));
|
||||
|
||||
for ( const auto& timer : tmp )
|
||||
detail::timer_mgr->Cancel(timer);
|
||||
|
||||
timers_canceled = 1;
|
||||
timers.clear();
|
||||
}
|
||||
|
||||
void Connection::FlipRoles()
|
||||
{
|
||||
IPAddr tmp_addr = resp_addr;
|
||||
|
@ -558,7 +383,7 @@ void Connection::FlipRoles()
|
|||
|
||||
unsigned int Connection::MemoryAllocation() const
|
||||
{
|
||||
return padded_sizeof(*this)
|
||||
return Session::MemoryAllocation() + padded_sizeof(*this)
|
||||
+ (timers.MemoryAllocation() - padded_sizeof(timers))
|
||||
+ (conn_val ? conn_val->MemoryAllocation() : 0)
|
||||
+ (root_analyzer ? root_analyzer->MemoryAllocation(): 0)
|
||||
|
@ -573,10 +398,7 @@ unsigned int Connection::MemoryAllocationConnVal() const
|
|||
|
||||
void Connection::Describe(ODesc* d) const
|
||||
{
|
||||
d->Add(start_time);
|
||||
d->Add("(");
|
||||
d->Add(last_time);
|
||||
d->AddSP(")");
|
||||
Session::Describe(d);
|
||||
|
||||
switch ( proto ) {
|
||||
case TRANSPORT_TCP:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue