mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Remove concept of multiple timer managers
- All timers are now handled by a single global timer manager, which simplifies how they handled by the IOSource manager. - This change flows down a number of changes to other parts of the code. The timer manager tag field is removed, which means that matching connections to a timer manager is also removed. This removes the ability to tag a connection as internal or external, since that's how the connections where differentiated. This in turn removes the `current_conns_extern` field from the `ConnStats` record type in the script layer.
This commit is contained in:
parent
2dcc936787
commit
be42608b51
15 changed files with 28 additions and 284 deletions
|
@ -548,7 +548,6 @@ type NetStats: record {
|
||||||
type ConnStats: record {
|
type ConnStats: record {
|
||||||
total_conns: count; ##<
|
total_conns: count; ##<
|
||||||
current_conns: count; ##<
|
current_conns: count; ##<
|
||||||
current_conns_extern: count; ##<
|
|
||||||
sess_current_conns: count; ##<
|
sess_current_conns: count; ##<
|
||||||
|
|
||||||
num_packets: count;
|
num_packets: count;
|
||||||
|
|
|
@ -29,8 +29,6 @@ event rexmit_inconsistency(c: connection, t1: string, t2: string, tcp_flags: str
|
||||||
event content_gap(c: connection, is_orig: bool, seq: count, length: count)
|
event content_gap(c: connection, is_orig: bool, seq: count, length: count)
|
||||||
{
|
{
|
||||||
NOTICE([$note=Content_Gap, $conn=c,
|
NOTICE([$note=Content_Gap, $conn=c,
|
||||||
$msg=fmt("%s content gap (%s %d/%d)%s",
|
$msg=fmt("%s content gap (%s %d/%d)",
|
||||||
id_string(c$id), is_orig ? ">" : "<", seq, length,
|
id_string(c$id), is_orig ? ">" : "<", seq, length)]);
|
||||||
is_external_connection(c) ? " [external]" : "")]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
38
src/Conn.cc
38
src/Conn.cc
|
@ -53,7 +53,6 @@ void ConnectionTimer::Dispatch(double t, int is_expire)
|
||||||
|
|
||||||
uint64_t Connection::total_connections = 0;
|
uint64_t Connection::total_connections = 0;
|
||||||
uint64_t Connection::current_connections = 0;
|
uint64_t Connection::current_connections = 0;
|
||||||
uint64_t Connection::external_connections = 0;
|
|
||||||
|
|
||||||
Connection::Connection(NetSessions* s, const ConnIDKey& k, double t, const ConnID* id,
|
Connection::Connection(NetSessions* s, const ConnIDKey& k, double t, const ConnID* id,
|
||||||
uint32_t flow, const Packet* pkt,
|
uint32_t flow, const Packet* pkt,
|
||||||
|
@ -115,23 +114,10 @@ Connection::Connection(NetSessions* s, const ConnIDKey& k, double t, const ConnI
|
||||||
++current_connections;
|
++current_connections;
|
||||||
++total_connections;
|
++total_connections;
|
||||||
|
|
||||||
std::string* tag = current_iosrc->GetCurrentTag();
|
|
||||||
conn_timer_mgr = tag ? new std::string(*tag) : nullptr;
|
|
||||||
|
|
||||||
if ( arg_encap )
|
if ( arg_encap )
|
||||||
encapsulation = new EncapsulationStack(*arg_encap);
|
encapsulation = new EncapsulationStack(*arg_encap);
|
||||||
else
|
else
|
||||||
encapsulation = 0;
|
encapsulation = 0;
|
||||||
|
|
||||||
if ( conn_timer_mgr )
|
|
||||||
{
|
|
||||||
++external_connections;
|
|
||||||
// We schedule a timer which removes this connection from memory
|
|
||||||
// indefinitively into the future. Ii will expire when the timer
|
|
||||||
// mgr is drained but not before.
|
|
||||||
ADD_TIMER(&Connection::RemoveConnectionTimer, 1e20, 1,
|
|
||||||
TIMER_REMOVE_CONNECTION);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Connection::~Connection()
|
Connection::~Connection()
|
||||||
|
@ -148,12 +134,9 @@ Connection::~Connection()
|
||||||
}
|
}
|
||||||
|
|
||||||
delete root_analyzer;
|
delete root_analyzer;
|
||||||
delete conn_timer_mgr;
|
|
||||||
delete encapsulation;
|
delete encapsulation;
|
||||||
|
|
||||||
--current_connections;
|
--current_connections;
|
||||||
if ( conn_timer_mgr )
|
|
||||||
--external_connections;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::CheckEncapsulation(const EncapsulationStack* arg_encap)
|
void Connection::CheckEncapsulation(const EncapsulationStack* arg_encap)
|
||||||
|
@ -512,14 +495,14 @@ void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_l
|
||||||
|
|
||||||
// "this" is passed as a cookie for the event
|
// "this" is passed as a cookie for the event
|
||||||
mgr.QueueEvent(f, std::move(vl), SOURCE_LOCAL,
|
mgr.QueueEvent(f, std::move(vl), SOURCE_LOCAL,
|
||||||
a ? a->GetID() : 0, GetTimerMgr(), this);
|
a ? a->GetID() : 0, timer_mgr, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::ConnectionEventFast(EventHandlerPtr f, analyzer::Analyzer* a, val_list vl)
|
void Connection::ConnectionEventFast(EventHandlerPtr f, analyzer::Analyzer* a, val_list vl)
|
||||||
{
|
{
|
||||||
// "this" is passed as a cookie for the event
|
// "this" is passed as a cookie for the event
|
||||||
mgr.QueueEventFast(f, std::move(vl), SOURCE_LOCAL,
|
mgr.QueueEventFast(f, std::move(vl), SOURCE_LOCAL,
|
||||||
a ? a->GetID() : 0, GetTimerMgr(), this);
|
a ? a->GetID() : 0, timer_mgr, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_list* vl)
|
void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_list* vl)
|
||||||
|
@ -547,7 +530,7 @@ void Connection::AddTimer(timer_func timer, double t, bool do_expire,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Timer* conn_timer = new ConnectionTimer(this, timer, t, do_expire, type);
|
Timer* conn_timer = new ConnectionTimer(this, timer, t, do_expire, type);
|
||||||
GetTimerMgr()->Add(conn_timer);
|
timer_mgr->Add(conn_timer);
|
||||||
timers.push_back(conn_timer);
|
timers.push_back(conn_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -566,25 +549,12 @@ void Connection::CancelTimers()
|
||||||
std::copy(timers.begin(), timers.end(), std::back_inserter(tmp));
|
std::copy(timers.begin(), timers.end(), std::back_inserter(tmp));
|
||||||
|
|
||||||
for ( const auto& timer : tmp )
|
for ( const auto& timer : tmp )
|
||||||
GetTimerMgr()->Cancel(timer);
|
timer_mgr->Cancel(timer);
|
||||||
|
|
||||||
timers_canceled = 1;
|
timers_canceled = 1;
|
||||||
timers.clear();
|
timers.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
TimerMgr* Connection::GetTimerMgr() const
|
|
||||||
{
|
|
||||||
if ( ! conn_timer_mgr )
|
|
||||||
// Global manager.
|
|
||||||
return timer_mgr;
|
|
||||||
|
|
||||||
// We need to check whether the local timer manager still exists;
|
|
||||||
// it may have already been timed out, in which case we fall back
|
|
||||||
// to the global manager (though this should be rare).
|
|
||||||
TimerMgr* local_mgr = sessions->LookupTimerMgr(conn_timer_mgr, false);
|
|
||||||
return local_mgr ? local_mgr : timer_mgr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Connection::FlipRoles()
|
void Connection::FlipRoles()
|
||||||
{
|
{
|
||||||
IPAddr tmp_addr = resp_addr;
|
IPAddr tmp_addr = resp_addr;
|
||||||
|
|
10
src/Conn.h
10
src/Conn.h
|
@ -228,11 +228,6 @@ public:
|
||||||
void Describe(ODesc* d) const override;
|
void Describe(ODesc* d) const override;
|
||||||
void IDString(ODesc* d) const;
|
void IDString(ODesc* d) const;
|
||||||
|
|
||||||
TimerMgr* GetTimerMgr() const;
|
|
||||||
|
|
||||||
// Returns true if connection has been received externally.
|
|
||||||
bool IsExternal() const { return conn_timer_mgr != 0; }
|
|
||||||
|
|
||||||
// Statistics.
|
// Statistics.
|
||||||
|
|
||||||
// Just a lower bound.
|
// Just a lower bound.
|
||||||
|
@ -243,8 +238,6 @@ public:
|
||||||
{ return total_connections; }
|
{ return total_connections; }
|
||||||
static uint64_t CurrentConnections()
|
static uint64_t CurrentConnections()
|
||||||
{ return current_connections; }
|
{ return current_connections; }
|
||||||
static uint64_t CurrentExternalConnections()
|
|
||||||
{ return external_connections; }
|
|
||||||
|
|
||||||
// Returns true if the history was already seen, false otherwise.
|
// Returns true if the history was already seen, false otherwise.
|
||||||
int CheckHistory(uint32_t mask, char code)
|
int CheckHistory(uint32_t mask, char code)
|
||||||
|
@ -320,8 +313,6 @@ protected:
|
||||||
ConnIDKey key;
|
ConnIDKey key;
|
||||||
bool key_valid;
|
bool key_valid;
|
||||||
|
|
||||||
// Timer manager to use for this conn (or nil).
|
|
||||||
std::string* conn_timer_mgr;
|
|
||||||
timer_list timers;
|
timer_list timers;
|
||||||
|
|
||||||
IPAddr orig_addr;
|
IPAddr orig_addr;
|
||||||
|
@ -353,7 +344,6 @@ protected:
|
||||||
// Count number of connections.
|
// Count number of connections.
|
||||||
static uint64_t total_connections;
|
static uint64_t total_connections;
|
||||||
static uint64_t current_connections;
|
static uint64_t current_connections;
|
||||||
static uint64_t external_connections;
|
|
||||||
|
|
||||||
string history;
|
string history;
|
||||||
uint32_t hist_seen;
|
uint32_t hist_seen;
|
||||||
|
|
|
@ -213,12 +213,9 @@ void net_init(const std::string& interface,
|
||||||
void expire_timers(iosource::PktSrc* src_ps)
|
void expire_timers(iosource::PktSrc* src_ps)
|
||||||
{
|
{
|
||||||
SegmentProfiler(segment_logger, "expiring-timers");
|
SegmentProfiler(segment_logger, "expiring-timers");
|
||||||
TimerMgr* tmgr =
|
|
||||||
src_ps ? sessions->LookupTimerMgr(src_ps->GetCurrentTag())
|
|
||||||
: timer_mgr;
|
|
||||||
|
|
||||||
current_dispatched +=
|
current_dispatched +=
|
||||||
tmgr->Advance(network_time,
|
timer_mgr->Advance(network_time,
|
||||||
max_timer_expires - current_dispatched);
|
max_timer_expires - current_dispatched);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,10 +224,8 @@ void net_packet_dispatch(double t, const Packet* pkt, iosource::PktSrc* src_ps)
|
||||||
if ( ! bro_start_network_time )
|
if ( ! bro_start_network_time )
|
||||||
bro_start_network_time = t;
|
bro_start_network_time = t;
|
||||||
|
|
||||||
TimerMgr* tmgr = sessions->LookupTimerMgr(src_ps->GetCurrentTag());
|
|
||||||
|
|
||||||
// network_time never goes back.
|
// network_time never goes back.
|
||||||
net_update_time(tmgr->Time() < t ? t : tmgr->Time());
|
net_update_time(timer_mgr->Time() < t ? t : timer_mgr->Time());
|
||||||
|
|
||||||
current_pktsrc = src_ps;
|
current_pktsrc = src_ps;
|
||||||
current_iosrc = src_ps;
|
current_iosrc = src_ps;
|
||||||
|
|
143
src/Sessions.cc
143
src/Sessions.cc
|
@ -42,32 +42,6 @@ enum NetBIOS_Service {
|
||||||
|
|
||||||
NetSessions* sessions;
|
NetSessions* sessions;
|
||||||
|
|
||||||
void TimerMgrExpireTimer::Dispatch(double t, int is_expire)
|
|
||||||
{
|
|
||||||
if ( mgr->LastAdvance() + timer_mgr_inactivity_timeout < timer_mgr->Time() )
|
|
||||||
{
|
|
||||||
// Expired.
|
|
||||||
DBG_LOG(DBG_TM, "TimeMgr %p has timed out", mgr);
|
|
||||||
mgr->Expire();
|
|
||||||
|
|
||||||
// Make sure events are executed. They depend on the TimerMgr.
|
|
||||||
::mgr.Drain();
|
|
||||||
|
|
||||||
sessions->timer_mgrs.erase(mgr->GetTag());
|
|
||||||
delete mgr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Reinstall timer.
|
|
||||||
if ( ! is_expire )
|
|
||||||
{
|
|
||||||
double n = mgr->LastAdvance() +
|
|
||||||
timer_mgr_inactivity_timeout;
|
|
||||||
timer_mgr->Add(new TimerMgrExpireTimer(n, mgr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void IPTunnelTimer::Dispatch(double t, int is_expire)
|
void IPTunnelTimer::Dispatch(double t, int is_expire)
|
||||||
{
|
{
|
||||||
NetSessions::IPTunnelMap::const_iterator it =
|
NetSessions::IPTunnelMap::const_iterator it =
|
||||||
|
@ -210,59 +184,6 @@ void NetSessions::NextPacket(double t, const Packet* pkt)
|
||||||
DumpPacket(pkt);
|
DumpPacket(pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
int NetSessions::CheckConnectionTag(Connection* conn)
|
|
||||||
{
|
|
||||||
if ( current_iosrc->GetCurrentTag() )
|
|
||||||
{
|
|
||||||
// Packet is tagged.
|
|
||||||
if ( conn->GetTimerMgr() == timer_mgr )
|
|
||||||
{
|
|
||||||
// Connection uses global timer queue. But the
|
|
||||||
// packet has a tag that means we got it externally,
|
|
||||||
// probably from the Time Machine.
|
|
||||||
DBG_LOG(DBG_TM, "got packet with tag %s for already"
|
|
||||||
"known connection, reinstantiating",
|
|
||||||
current_iosrc->GetCurrentTag()->c_str());
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Connection uses local timer queue.
|
|
||||||
TimerMgrMap::iterator i =
|
|
||||||
timer_mgrs.find(*current_iosrc->GetCurrentTag());
|
|
||||||
if ( i != timer_mgrs.end() &&
|
|
||||||
conn->GetTimerMgr() != i->second )
|
|
||||||
{
|
|
||||||
// Connection uses different local queue
|
|
||||||
// than the tag for the current packet
|
|
||||||
// indicates.
|
|
||||||
//
|
|
||||||
// This can happen due to:
|
|
||||||
// (1) getting same packets with
|
|
||||||
// different tags
|
|
||||||
// (2) timer mgr having already expired
|
|
||||||
DBG_LOG(DBG_TM, "packet ignored due old/inconsistent tag");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Packet is not tagged.
|
|
||||||
if ( conn->GetTimerMgr() != timer_mgr )
|
|
||||||
{
|
|
||||||
// Connection does not use the global timer queue. That
|
|
||||||
// means that this is a live packet belonging to a
|
|
||||||
// connection for which we have already switched to
|
|
||||||
// processing external input.
|
|
||||||
DBG_LOG(DBG_TM, "packet ignored due to processing it in external data");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int gre_header_len(uint16_t flags)
|
static unsigned int gre_header_len(uint16_t flags)
|
||||||
{
|
{
|
||||||
unsigned int len = 4; // Always has 2 byte flags and 2 byte protocol type.
|
unsigned int len = 4; // Always has 2 byte flags and 2 byte protocol type.
|
||||||
|
@ -735,13 +656,8 @@ void NetSessions::DoNextPacket(double t, const Packet* pkt, const IP_Hdr* ip_hdr
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We already know that connection.
|
// We already know that connection.
|
||||||
int consistent = CheckConnectionTag(conn);
|
if ( conn->IsReuse(t, data) )
|
||||||
if ( consistent < 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ( ! consistent || conn->IsReuse(t, data) )
|
|
||||||
{
|
{
|
||||||
if ( consistent )
|
|
||||||
conn->Event(connection_reused, 0);
|
conn->Event(connection_reused, 0);
|
||||||
|
|
||||||
Remove(conn);
|
Remove(conn);
|
||||||
|
@ -1158,8 +1074,6 @@ void NetSessions::Drain()
|
||||||
ic->Done();
|
ic->Done();
|
||||||
ic->RemovalEvent();
|
ic->RemovalEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
ExpireTimerMgrs();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetSessions::GetStats(SessionStats& s) const
|
void NetSessions::GetStats(SessionStats& s) const
|
||||||
|
@ -1233,25 +1147,9 @@ Connection* NetSessions::NewConn(const ConnIDKey& k, double t, const ConnID* id,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool external = conn->IsExternal();
|
|
||||||
|
|
||||||
if ( external )
|
|
||||||
conn->AppendAddl(fmt("tag=%s",
|
|
||||||
conn->GetTimerMgr()->GetTag().c_str()));
|
|
||||||
|
|
||||||
if ( new_connection )
|
if ( new_connection )
|
||||||
{
|
|
||||||
conn->Event(new_connection, 0);
|
conn->Event(new_connection, 0);
|
||||||
|
|
||||||
if ( external && connection_external )
|
|
||||||
{
|
|
||||||
conn->ConnectionEventFast(connection_external, 0, {
|
|
||||||
conn->BuildConnVal(),
|
|
||||||
new StringVal(conn->GetTimerMgr()->GetTag().c_str()),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1338,45 +1236,6 @@ bool NetSessions::WantConnection(uint16_t src_port, uint16_t dst_port,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
TimerMgr* NetSessions::LookupTimerMgr(const std::string* tag, bool create)
|
|
||||||
{
|
|
||||||
if ( ! tag )
|
|
||||||
{
|
|
||||||
DBG_LOG(DBG_TM, "no tag, using global timer mgr %p", timer_mgr);
|
|
||||||
return timer_mgr;
|
|
||||||
}
|
|
||||||
|
|
||||||
TimerMgrMap::iterator i = timer_mgrs.find(*tag);
|
|
||||||
if ( i != timer_mgrs.end() )
|
|
||||||
{
|
|
||||||
DBG_LOG(DBG_TM, "tag %s, using non-global timer mgr %p", tag->c_str(), i->second);
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( ! create )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// Create new queue for tag.
|
|
||||||
TimerMgr* mgr = new PQ_TimerMgr(*tag);
|
|
||||||
DBG_LOG(DBG_TM, "tag %s, creating new non-global timer mgr %p", tag->c_str(), mgr);
|
|
||||||
timer_mgrs.insert(TimerMgrMap::value_type(*tag, mgr));
|
|
||||||
double t = timer_mgr->Time() + timer_mgr_inactivity_timeout;
|
|
||||||
timer_mgr->Add(new TimerMgrExpireTimer(t, mgr));
|
|
||||||
return mgr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetSessions::ExpireTimerMgrs()
|
|
||||||
{
|
|
||||||
for ( TimerMgrMap::iterator i = timer_mgrs.begin();
|
|
||||||
i != timer_mgrs.end(); ++i )
|
|
||||||
{
|
|
||||||
i->second->Expire();
|
|
||||||
delete i->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetSessions::DumpPacket(const Packet *pkt, int len)
|
void NetSessions::DumpPacket(const Packet *pkt, int len)
|
||||||
{
|
{
|
||||||
if ( ! pkt_dumper )
|
if ( ! pkt_dumper )
|
||||||
|
|
|
@ -44,20 +44,6 @@ struct SessionStats {
|
||||||
uint64_t num_packets;
|
uint64_t num_packets;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Drains and deletes a timer manager if it hasn't seen any advances
|
|
||||||
// for an interval timer_mgr_inactivity_timeout.
|
|
||||||
class TimerMgrExpireTimer : public Timer {
|
|
||||||
public:
|
|
||||||
TimerMgrExpireTimer(double t, TimerMgr* arg_mgr)
|
|
||||||
: Timer(t, TIMER_TIMERMGR_EXPIRE), mgr(arg_mgr)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void Dispatch(double t, int is_expire) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
TimerMgr* mgr;
|
|
||||||
};
|
|
||||||
|
|
||||||
class NetSessions {
|
class NetSessions {
|
||||||
public:
|
public:
|
||||||
NetSessions();
|
NetSessions();
|
||||||
|
@ -101,13 +87,6 @@ public:
|
||||||
return packet_filter;
|
return packet_filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Looks up timer manager associated with tag. If tag is unknown and
|
|
||||||
// "create" is true, creates new timer manager and stores it. Returns
|
|
||||||
// global timer manager if tag is nil.
|
|
||||||
TimerMgr* LookupTimerMgr(const std::string* tag, bool create = true);
|
|
||||||
|
|
||||||
void ExpireTimerMgrs();
|
|
||||||
|
|
||||||
analyzer::stepping_stone::SteppingStoneManager* GetSTPManager() { return stp_manager; }
|
analyzer::stepping_stone::SteppingStoneManager* GetSTPManager() { return stp_manager; }
|
||||||
|
|
||||||
unsigned int CurrentConnections()
|
unsigned int CurrentConnections()
|
||||||
|
@ -168,7 +147,6 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class ConnCompressor;
|
friend class ConnCompressor;
|
||||||
friend class TimerMgrExpireTimer;
|
|
||||||
friend class IPTunnelTimer;
|
friend class IPTunnelTimer;
|
||||||
|
|
||||||
using ConnectionMap = std::map<ConnIDKey, Connection*>;
|
using ConnectionMap = std::map<ConnIDKey, Connection*>;
|
||||||
|
@ -180,13 +158,6 @@ protected:
|
||||||
|
|
||||||
Connection* LookupConn(const ConnectionMap& conns, const ConnIDKey& key);
|
Connection* LookupConn(const ConnectionMap& conns, const ConnIDKey& key);
|
||||||
|
|
||||||
// Check whether the tag of the current packet is consistent with
|
|
||||||
// the given connection. Returns:
|
|
||||||
// -1 if current packet is to be completely ignored.
|
|
||||||
// 0 if tag is not consistent and new conn should be instantiated.
|
|
||||||
// 1 if tag is consistent, i.e., packet is part of connection.
|
|
||||||
int CheckConnectionTag(Connection* conn);
|
|
||||||
|
|
||||||
// Returns true if the port corresonds to an application
|
// Returns true if the port corresonds to an application
|
||||||
// for which there's a Bro analyzer (even if it might not
|
// for which there's a Bro analyzer (even if it might not
|
||||||
// be used by the present policy script), or it's more
|
// be used by the present policy script), or it's more
|
||||||
|
@ -243,11 +214,6 @@ protected:
|
||||||
int dump_this_packet; // if true, current packet should be recorded
|
int dump_this_packet; // if true, current packet should be recorded
|
||||||
uint64_t num_packets_processed;
|
uint64_t num_packets_processed;
|
||||||
PacketProfiler* pkt_profiler;
|
PacketProfiler* pkt_profiler;
|
||||||
|
|
||||||
// We may use independent timer managers for different sets of related
|
|
||||||
// activity. The managers are identified by a unique tag.
|
|
||||||
typedef std::map<std::string, TimerMgr*> TimerMgrMap;
|
|
||||||
TimerMgrMap timer_mgrs;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -117,12 +117,11 @@ void ProfileLogger::Log()
|
||||||
|
|
||||||
int conn_mem_use = expensive ? sessions->ConnectionMemoryUsage() : 0;
|
int conn_mem_use = expensive ? sessions->ConnectionMemoryUsage() : 0;
|
||||||
|
|
||||||
file->Write(fmt("%.06f Conns: total=%" PRIu64 " current=%" PRIu64 "/%" PRIi32 " ext=%" PRIu64 " mem=%" PRIi32 "K avg=%.1f table=%" PRIu32 "K connvals=%" PRIu32 "K\n",
|
file->Write(fmt("%.06f Conns: total=%" PRIu64 " current=%" PRIu64 "/%" PRIi32 " mem=%" PRIi32 "K avg=%.1f table=%" PRIu32 "K connvals=%" PRIu32 "K\n",
|
||||||
network_time,
|
network_time,
|
||||||
Connection::TotalConnections(),
|
Connection::TotalConnections(),
|
||||||
Connection::CurrentConnections(),
|
Connection::CurrentConnections(),
|
||||||
sessions->CurrentConnections(),
|
sessions->CurrentConnections(),
|
||||||
Connection::CurrentExternalConnections(),
|
|
||||||
conn_mem_use,
|
conn_mem_use,
|
||||||
expensive ? (conn_mem_use / double(sessions->CurrentConnections())) : 0,
|
expensive ? (conn_mem_use / double(sessions->CurrentConnections())) : 0,
|
||||||
expensive ? sessions->MemoryAllocation() / 1024 : 0,
|
expensive ? sessions->MemoryAllocation() / 1024 : 0,
|
||||||
|
|
21
src/Timer.cc
21
src/Timer.cc
|
@ -60,12 +60,11 @@ void Timer::Describe(ODesc* d) const
|
||||||
|
|
||||||
unsigned int TimerMgr::current_timers[NUM_TIMER_TYPES];
|
unsigned int TimerMgr::current_timers[NUM_TIMER_TYPES];
|
||||||
|
|
||||||
TimerMgr::TimerMgr(const std::string& arg_tag)
|
TimerMgr::TimerMgr()
|
||||||
{
|
{
|
||||||
t = 0.0;
|
t = 0.0;
|
||||||
num_expired = 0;
|
num_expired = 0;
|
||||||
last_advance = last_timestamp = 0;
|
last_advance = last_timestamp = 0;
|
||||||
tag = arg_tag;
|
|
||||||
|
|
||||||
if ( iosource_mgr )
|
if ( iosource_mgr )
|
||||||
iosource_mgr->Register(this, true);
|
iosource_mgr->Register(this, true);
|
||||||
|
@ -73,13 +72,11 @@ TimerMgr::TimerMgr(const std::string& arg_tag)
|
||||||
|
|
||||||
TimerMgr::~TimerMgr()
|
TimerMgr::~TimerMgr()
|
||||||
{
|
{
|
||||||
DBG_LOG(DBG_TM, "deleting timer mgr %p", this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TimerMgr::Advance(double arg_t, int max_expire)
|
int TimerMgr::Advance(double arg_t, int max_expire)
|
||||||
{
|
{
|
||||||
DBG_LOG(DBG_TM, "advancing %stimer mgr %p to %.6f",
|
DBG_LOG(DBG_TM, "advancing timer mgr to %.6f", arg_t);
|
||||||
this == timer_mgr ? "global " : "", this, arg_t);
|
|
||||||
|
|
||||||
t = arg_t;
|
t = arg_t;
|
||||||
last_timestamp = 0;
|
last_timestamp = 0;
|
||||||
|
@ -111,7 +108,7 @@ void TimerMgr::InitPostScript()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PQ_TimerMgr::PQ_TimerMgr(const std::string& tag) : TimerMgr(tag)
|
PQ_TimerMgr::PQ_TimerMgr() : TimerMgr()
|
||||||
{
|
{
|
||||||
q = new PriorityQueue;
|
q = new PriorityQueue;
|
||||||
}
|
}
|
||||||
|
@ -123,8 +120,8 @@ PQ_TimerMgr::~PQ_TimerMgr()
|
||||||
|
|
||||||
void PQ_TimerMgr::Add(Timer* timer)
|
void PQ_TimerMgr::Add(Timer* timer)
|
||||||
{
|
{
|
||||||
DBG_LOG(DBG_TM, "Adding timer %s to TimeMgr %p at %.6f",
|
DBG_LOG(DBG_TM, "Adding timer %s (%p) at %.6f",
|
||||||
timer_type_to_string(timer->Type()), this, timer->Time());
|
timer_type_to_string(timer->Type()), timer, timer->Time());
|
||||||
|
|
||||||
// Add the timer even if it's already expired - that way, if
|
// Add the timer even if it's already expired - that way, if
|
||||||
// multiple already-added timers are added, they'll still
|
// multiple already-added timers are added, they'll still
|
||||||
|
@ -140,8 +137,8 @@ void PQ_TimerMgr::Expire()
|
||||||
Timer* timer;
|
Timer* timer;
|
||||||
while ( (timer = Remove()) )
|
while ( (timer = Remove()) )
|
||||||
{
|
{
|
||||||
DBG_LOG(DBG_TM, "Dispatching timer %s in TimeMgr %p",
|
DBG_LOG(DBG_TM, "Dispatching timer %s (%p)",
|
||||||
timer_type_to_string(timer->Type()), this);
|
timer_type_to_string(timer->Type()), timer);
|
||||||
timer->Dispatch(t, 1);
|
timer->Dispatch(t, 1);
|
||||||
--current_timers[timer->Type()];
|
--current_timers[timer->Type()];
|
||||||
delete timer;
|
delete timer;
|
||||||
|
@ -162,8 +159,8 @@ int PQ_TimerMgr::DoAdvance(double new_t, int max_expire)
|
||||||
// whether we should delete it too.
|
// whether we should delete it too.
|
||||||
(void) Remove();
|
(void) Remove();
|
||||||
|
|
||||||
DBG_LOG(DBG_TM, "Dispatching timer %s in TimeMgr %p",
|
DBG_LOG(DBG_TM, "Dispatching timer %s (%p)",
|
||||||
timer_type_to_string(timer->Type()), this);
|
timer_type_to_string(timer->Type()), timer);
|
||||||
timer->Dispatch(new_t, 0);
|
timer->Dispatch(new_t, 0);
|
||||||
delete timer;
|
delete timer;
|
||||||
|
|
||||||
|
|
|
@ -104,8 +104,6 @@ public:
|
||||||
|
|
||||||
double Time() const { return t ? t : 1; } // 1 > 0
|
double Time() const { return t ? t : 1; } // 1 > 0
|
||||||
|
|
||||||
const std::string& GetTag() const { return tag; }
|
|
||||||
|
|
||||||
virtual int Size() const = 0;
|
virtual int Size() const = 0;
|
||||||
virtual int PeakSize() const = 0;
|
virtual int PeakSize() const = 0;
|
||||||
virtual uint64_t CumulativeNum() const = 0;
|
virtual uint64_t CumulativeNum() const = 0;
|
||||||
|
@ -122,7 +120,7 @@ public:
|
||||||
// IOSource API methods
|
// IOSource API methods
|
||||||
virtual double GetNextTimeout() override { return -1; }
|
virtual double GetNextTimeout() override { return -1; }
|
||||||
virtual void Process() override;
|
virtual void Process() override;
|
||||||
virtual const char* Tag() override { return fmt("TimerMgr %s", tag.c_str()); }
|
virtual const char* Tag() override { return "TimerMgr"; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs some extra initialization on a timer manager. This shouldn't
|
* Performs some extra initialization on a timer manager. This shouldn't
|
||||||
|
@ -131,7 +129,7 @@ public:
|
||||||
void InitPostScript();
|
void InitPostScript();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit TimerMgr(const std::string& arg_tag);
|
TimerMgr();
|
||||||
|
|
||||||
virtual int DoAdvance(double t, int max_expire) = 0;
|
virtual int DoAdvance(double t, int max_expire) = 0;
|
||||||
virtual void Remove(Timer* timer) = 0;
|
virtual void Remove(Timer* timer) = 0;
|
||||||
|
@ -139,7 +137,6 @@ protected:
|
||||||
double t;
|
double t;
|
||||||
double last_timestamp;
|
double last_timestamp;
|
||||||
double last_advance;
|
double last_advance;
|
||||||
std::string tag;
|
|
||||||
|
|
||||||
int num_expired;
|
int num_expired;
|
||||||
|
|
||||||
|
@ -148,7 +145,7 @@ protected:
|
||||||
|
|
||||||
class PQ_TimerMgr : public TimerMgr {
|
class PQ_TimerMgr : public TimerMgr {
|
||||||
public:
|
public:
|
||||||
explicit PQ_TimerMgr(const std::string& arg_tag);
|
PQ_TimerMgr();
|
||||||
~PQ_TimerMgr() override;
|
~PQ_TimerMgr() override;
|
||||||
|
|
||||||
void Add(Timer* timer) override;
|
void Add(Timer* timer) override;
|
||||||
|
|
|
@ -731,7 +731,7 @@ void Analyzer::AddTimer(analyzer_timer_func timer, double t,
|
||||||
Timer* analyzer_timer = new
|
Timer* analyzer_timer = new
|
||||||
AnalyzerTimer(this, timer, t, do_expire, type);
|
AnalyzerTimer(this, timer, t, do_expire, type);
|
||||||
|
|
||||||
Conn()->GetTimerMgr()->Add(analyzer_timer);
|
timer_mgr->Add(analyzer_timer);
|
||||||
timers.push_back(analyzer_timer);
|
timers.push_back(analyzer_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -751,7 +751,7 @@ void Analyzer::CancelTimers()
|
||||||
|
|
||||||
// TODO: could be a for_each
|
// TODO: could be a for_each
|
||||||
for ( auto timer : tmp )
|
for ( auto timer : tmp )
|
||||||
Conn()->GetTimerMgr()->Cancel(timer);
|
timer_mgr->Cancel(timer);
|
||||||
|
|
||||||
timers_canceled = 1;
|
timers_canceled = 1;
|
||||||
timers.clear();
|
timers.clear();
|
||||||
|
@ -923,4 +923,3 @@ void TransportLayerAnalyzer::PacketContents(const u_char* data, int len)
|
||||||
Event(packet_contents, contents);
|
Event(packet_contents, contents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,17 +70,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void Process() = 0;
|
virtual void Process() = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the tag of the timer manager associated with the last
|
|
||||||
* procesees data item.
|
|
||||||
*
|
|
||||||
* Can be overridden by derived classes.
|
|
||||||
*
|
|
||||||
* @return The tag, or null for the global timer manager.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
virtual std::string* GetCurrentTag() { return 0; }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a descriptive tag representing the source for debugging.
|
* Returns a descriptive tag representing the source for debugging.
|
||||||
*
|
*
|
||||||
|
|
|
@ -550,7 +550,7 @@ int main(int argc, char** argv)
|
||||||
createCurrentDoc("1.0"); // Set a global XML document
|
createCurrentDoc("1.0"); // Set a global XML document
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
timer_mgr = new PQ_TimerMgr("<GLOBAL>");
|
timer_mgr = new PQ_TimerMgr();
|
||||||
|
|
||||||
auto zeekygen_cfg = options.zeekygen_config_file.value_or("");
|
auto zeekygen_cfg = options.zeekygen_config_file.value_or("");
|
||||||
zeekygen_mgr = new zeekygen::Manager(zeekygen_cfg, bro_argv[0]);
|
zeekygen_mgr = new zeekygen::Manager(zeekygen_cfg, bro_argv[0]);
|
||||||
|
|
|
@ -88,7 +88,6 @@ function get_conn_stats%(%): ConnStats
|
||||||
|
|
||||||
r->Assign(n++, val_mgr->GetCount(Connection::TotalConnections()));
|
r->Assign(n++, val_mgr->GetCount(Connection::TotalConnections()));
|
||||||
r->Assign(n++, val_mgr->GetCount(Connection::CurrentConnections()));
|
r->Assign(n++, val_mgr->GetCount(Connection::CurrentConnections()));
|
||||||
r->Assign(n++, val_mgr->GetCount(Connection::CurrentExternalConnections()));
|
|
||||||
r->Assign(n++, val_mgr->GetCount(sessions->CurrentConnections()));
|
r->Assign(n++, val_mgr->GetCount(sessions->CurrentConnections()));
|
||||||
|
|
||||||
SessionStats s;
|
SessionStats s;
|
||||||
|
|
13
src/zeek.bif
13
src/zeek.bif
|
@ -1788,19 +1788,6 @@ function log10%(d: double%): double
|
||||||
#
|
#
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
|
|
||||||
## Determines whether a connection has been received externally. For example,
|
|
||||||
## Broccoli or the Time Machine can send packets to Zeek via a mechanism that is
|
|
||||||
## one step lower than sending events. This function checks whether the packets
|
|
||||||
## of a connection stem from one of these external *packet sources*.
|
|
||||||
##
|
|
||||||
## c: The connection to test.
|
|
||||||
##
|
|
||||||
## Returns: True if *c* has been received externally.
|
|
||||||
function is_external_connection%(c: connection%) : bool
|
|
||||||
%{
|
|
||||||
return val_mgr->GetBool(c && c->IsExternal());
|
|
||||||
%}
|
|
||||||
|
|
||||||
## Returns the ID of the analyzer which raised the current event.
|
## Returns the ID of the analyzer which raised the current event.
|
||||||
##
|
##
|
||||||
## Returns: The ID of the analyzer which raised the current event, or 0 if
|
## Returns: The ID of the analyzer which raised the current event, or 0 if
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue