Add methods to queue events without handler existence check

Added ConnectionEventFast() and QueueEventFast() methods to avoid
redundant event handler existence checks.

It's common practice for caller to already check for event handler
existence before doing all the work of constructing the arguments, so
it's desirable to not have to check for existence again.

E.g. going through ConnectionEvent() means 3 existence checks:
one you do yourself before calling it, one in ConnectionEvent(), and then
another in QueueEvent().

The existence check itself can be more than a few operations sometimes
as it needs to check a few flags that determine if it's enabled, has
a local body, or has any remote receivers in the old comm. system or
has been flagged as something to publish in the new comm. system.
This commit is contained in:
Jon Siwek 2019-04-11 20:23:49 -07:00
parent 8bc65f09ec
commit b6862c5c59
72 changed files with 771 additions and 524 deletions

@ -1 +1 @@
Subproject commit 44622332fb1361383799be33e365704caacce199 Subproject commit 33cde13264825df906668b608017e65f4ffbc12a

View file

@ -415,7 +415,7 @@ void log_anonymization_mapping(ipaddr32_t input, ipaddr32_t output)
{ {
if ( anonymization_mapping ) if ( anonymization_mapping )
{ {
mgr.QueueEvent(anonymization_mapping, { mgr.QueueEventFast(anonymization_mapping, {
new AddrVal(input), new AddrVal(input),
new AddrVal(output) new AddrVal(output)
}); });

View file

@ -325,7 +325,7 @@ void Connection::HistoryThresholdEvent(EventHandlerPtr e, bool is_orig,
// and at this stage it's not a *multiple* instance. // and at this stage it's not a *multiple* instance.
return; return;
ConnectionEvent(e, 0, { ConnectionEventFast(e, 0, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
val_mgr->GetCount(threshold) val_mgr->GetCount(threshold)
@ -389,7 +389,7 @@ void Connection::EnableStatusUpdateTimer()
void Connection::StatusUpdateTimer(double t) void Connection::StatusUpdateTimer(double t)
{ {
ConnectionEvent(connection_status_update, 0, { BuildConnVal() }); ConnectionEventFast(connection_status_update, 0, { BuildConnVal() });
ADD_TIMER(&Connection::StatusUpdateTimer, ADD_TIMER(&Connection::StatusUpdateTimer,
network_time + connection_status_update_interval, 0, network_time + connection_status_update_interval, 0,
TIMER_CONN_STATUS_UPDATE); TIMER_CONN_STATUS_UPDATE);
@ -627,7 +627,7 @@ int Connection::VersionFoundEvent(const IPAddr& addr, const char* s, int len,
{ {
if ( software_parse_error ) if ( software_parse_error )
{ {
ConnectionEvent(software_parse_error, analyzer, { ConnectionEventFast(software_parse_error, analyzer, {
BuildConnVal(), BuildConnVal(),
new AddrVal(addr), new AddrVal(addr),
new StringVal(len, s), new StringVal(len, s),
@ -638,7 +638,7 @@ int Connection::VersionFoundEvent(const IPAddr& addr, const char* s, int len,
if ( software_version_found ) if ( software_version_found )
{ {
ConnectionEvent(software_version_found, 0, { ConnectionEventFast(software_version_found, 0, {
BuildConnVal(), BuildConnVal(),
new AddrVal(addr), new AddrVal(addr),
val, val,
@ -666,7 +666,7 @@ int Connection::UnparsedVersionFoundEvent(const IPAddr& addr,
if ( software_unparsed_version_found ) if ( software_unparsed_version_found )
{ {
ConnectionEvent(software_unparsed_version_found, analyzer, { ConnectionEventFast(software_unparsed_version_found, analyzer, {
BuildConnVal(), BuildConnVal(),
new AddrVal(addr), new AddrVal(addr),
new StringVal(len, full), new StringVal(len, full),
@ -682,9 +682,9 @@ void Connection::Event(EventHandlerPtr f, analyzer::Analyzer* analyzer, const ch
return; return;
if ( name ) if ( name )
ConnectionEvent(f, analyzer, {new StringVal(name), BuildConnVal()}); ConnectionEventFast(f, analyzer, {new StringVal(name), BuildConnVal()});
else else
ConnectionEvent(f, analyzer, {BuildConnVal()}); ConnectionEventFast(f, analyzer, {BuildConnVal()});
} }
@ -698,9 +698,9 @@ void Connection::Event(EventHandlerPtr f, analyzer::Analyzer* analyzer, Val* v1,
} }
if ( v2 ) if ( v2 )
ConnectionEvent(f, analyzer, {BuildConnVal(), v1, v2}); ConnectionEventFast(f, analyzer, {BuildConnVal(), v1, v2});
else else
ConnectionEvent(f, analyzer, {BuildConnVal(), v1}); ConnectionEventFast(f, analyzer, {BuildConnVal(), v1});
} }
void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_list vl) void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_list vl)
@ -720,6 +720,13 @@ void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_l
a ? a->GetID() : 0, GetTimerMgr(), this); a ? a->GetID() : 0, GetTimerMgr(), this);
} }
void Connection::ConnectionEventFast(EventHandlerPtr f, analyzer::Analyzer* a, val_list vl)
{
// "this" is passed as a cookie for the event
mgr.QueueEventFast(f, std::move(vl), SOURCE_LOCAL,
a ? a->GetID() : 0, GetTimerMgr(), this);
}
void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_list* vl) void Connection::ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* a, val_list* vl)
{ {
ConnectionEvent(f, a, std::move(*vl)); ConnectionEvent(f, a, std::move(*vl));
@ -1053,7 +1060,7 @@ void Connection::CheckFlowLabel(bool is_orig, uint32 flow_label)
if ( connection_flow_label_changed && if ( connection_flow_label_changed &&
(is_orig ? saw_first_orig_packet : saw_first_resp_packet) ) (is_orig ? saw_first_orig_packet : saw_first_resp_packet) )
{ {
ConnectionEvent(connection_flow_label_changed, 0, { ConnectionEventFast(connection_flow_label_changed, 0, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
val_mgr->GetCount(my_flow_label), val_mgr->GetCount(my_flow_label),

View file

@ -181,6 +181,8 @@ public:
val_list* vl); val_list* vl);
void ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* analyzer, void ConnectionEvent(EventHandlerPtr f, analyzer::Analyzer* analyzer,
val_list vl); val_list vl);
void ConnectionEventFast(EventHandlerPtr f, analyzer::Analyzer* analyzer,
val_list vl);
void Weird(const char* name, const char* addl = ""); void Weird(const char* name, const char* addl = "");
bool DidWeird() const { return weird != 0; } bool DidWeird() const { return weird != 0; }

View file

@ -704,7 +704,7 @@ void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* dm)
if ( ! e ) if ( ! e )
return; return;
mgr.QueueEvent(e, {BuildMappingVal(dm)}); mgr.QueueEventFast(e, {BuildMappingVal(dm)});
} }
void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* dm, ListVal* l1, ListVal* l2) void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* dm, ListVal* l1, ListVal* l2)
@ -715,7 +715,7 @@ void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* dm, ListVal* l1, ListVal* l2
Unref(l1); Unref(l1);
Unref(l2); Unref(l2);
mgr.QueueEvent(e, { mgr.QueueEventFast(e, {
BuildMappingVal(dm), BuildMappingVal(dm),
l1->ConvertToSet(), l1->ConvertToSet(),
l2->ConvertToSet(), l2->ConvertToSet(),
@ -727,7 +727,7 @@ void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* old_dm, DNS_Mapping* new_dm)
if ( ! e ) if ( ! e )
return; return;
mgr.QueueEvent(e, { mgr.QueueEventFast(e, {
BuildMappingVal(old_dm), BuildMappingVal(old_dm),
BuildMappingVal(new_dm), BuildMappingVal(new_dm),
}); });

View file

@ -128,7 +128,7 @@ void EventMgr::QueueEvent(Event* event)
void EventMgr::Drain() void EventMgr::Drain()
{ {
if ( event_queue_flush_point ) if ( event_queue_flush_point )
QueueEvent(event_queue_flush_point, val_list{}); QueueEventFast(event_queue_flush_point, val_list{});
SegmentProfiler(segment_logger, "draining-events"); SegmentProfiler(segment_logger, "draining-events");

View file

@ -58,6 +58,13 @@ public:
EventMgr(); EventMgr();
~EventMgr() override; ~EventMgr() override;
void QueueEventFast(const EventHandlerPtr &h, val_list vl,
SourceID src = SOURCE_LOCAL, analyzer::ID aid = 0,
TimerMgr* mgr = 0, BroObj* obj = 0)
{
QueueEvent(new Event(h, std::move(vl), src, aid, mgr, obj));
}
void QueueEvent(const EventHandlerPtr &h, val_list vl, void QueueEvent(const EventHandlerPtr &h, val_list vl,
SourceID src = SOURCE_LOCAL, analyzer::ID aid = 0, SourceID src = SOURCE_LOCAL, analyzer::ID aid = 0,
TimerMgr* mgr = 0, BroObj* obj = 0) TimerMgr* mgr = 0, BroObj* obj = 0)

View file

@ -506,9 +506,9 @@ void Reporter::DoLog(const char* prefix, EventHandlerPtr event, FILE* out,
} }
if ( conn ) if ( conn )
conn->ConnectionEvent(event, 0, std::move(vl)); conn->ConnectionEventFast(event, 0, std::move(vl));
else else
mgr.QueueEvent(event, std::move(vl)); mgr.QueueEventFast(event, std::move(vl));
} }
else else
{ {

View file

@ -17,7 +17,7 @@ void RuleActionEvent::DoAction(const Rule* parent, RuleEndpointState* state,
{ {
if ( signature_match ) if ( signature_match )
{ {
mgr.QueueEvent(signature_match, { mgr.QueueEventFast(signature_match, {
rule_matcher->BuildRuleStateValue(parent, state), rule_matcher->BuildRuleStateValue(parent, state),
new StringVal(msg), new StringVal(msg),
data ? new StringVal(len, (const char*)data) : val_mgr->GetEmptyString(), data ? new StringVal(len, (const char*)data) : val_mgr->GetEmptyString(),

View file

@ -171,7 +171,7 @@ void NetSessions::NextPacket(double t, const Packet* pkt)
SegmentProfiler(segment_logger, "dispatching-packet"); SegmentProfiler(segment_logger, "dispatching-packet");
if ( raw_packet ) if ( raw_packet )
mgr.QueueEvent(raw_packet, {pkt->BuildPktHdrVal()}); mgr.QueueEventFast(raw_packet, {pkt->BuildPktHdrVal()});
if ( pkt_profiler ) if ( pkt_profiler )
pkt_profiler->ProfilePkt(t, pkt->cap_len); pkt_profiler->ProfilePkt(t, pkt->cap_len);
@ -411,7 +411,7 @@ void NetSessions::DoNextPacket(double t, const Packet* pkt, const IP_Hdr* ip_hdr
{ {
dump_this_packet = 1; dump_this_packet = 1;
if ( esp_packet ) if ( esp_packet )
mgr.QueueEvent(esp_packet, {ip_hdr->BuildPktHdrVal()}); mgr.QueueEventFast(esp_packet, {ip_hdr->BuildPktHdrVal()});
// Can't do more since upper-layer payloads are going to be encrypted. // Can't do more since upper-layer payloads are going to be encrypted.
return; return;
@ -1315,9 +1315,9 @@ Connection* NetSessions::NewConn(HashKey* k, double t, const ConnID* id,
{ {
conn->Event(new_connection, 0); conn->Event(new_connection, 0);
if ( external ) if ( external && connection_external )
{ {
conn->ConnectionEvent(connection_external, 0, { conn->ConnectionEventFast(connection_external, 0, {
conn->BuildConnVal(), conn->BuildConnVal(),
new StringVal(conn->GetTimerMgr()->GetTag().c_str()), new StringVal(conn->GetTimerMgr()->GetTag().c_str()),
}); });

View file

@ -536,7 +536,7 @@ void StateAccess::Replay()
if ( remote_state_access_performed ) if ( remote_state_access_performed )
{ {
mgr.QueueEvent(remote_state_access_performed, { mgr.QueueEventFast(remote_state_access_performed, {
new StringVal(target.id->Name()), new StringVal(target.id->Name()),
target.id->ID_Val()->Ref(), target.id->ID_Val()->Ref(),
}); });

View file

@ -369,7 +369,8 @@ void SampleLogger::SegmentProfile(const char* /* name */,
const Location* /* loc */, const Location* /* loc */,
double dtime, int dmem) double dtime, int dmem)
{ {
mgr.QueueEvent(load_sample, { if ( load_sample )
mgr.QueueEventFast(load_sample, {
load_samples->Ref(), load_samples->Ref(),
new IntervalVal(dtime, Seconds), new IntervalVal(dtime, Seconds),
val_mgr->GetInt(dmem) val_mgr->GetInt(dmem)

View file

@ -662,16 +662,19 @@ void Analyzer::ProtocolConfirmation(Tag arg_tag)
if ( protocol_confirmed ) if ( protocol_confirmed )
return; return;
protocol_confirmed = true;
if ( ! protocol_confirmation )
return;
EnumVal* tval = arg_tag ? arg_tag.AsEnumVal() : tag.AsEnumVal(); EnumVal* tval = arg_tag ? arg_tag.AsEnumVal() : tag.AsEnumVal();
Ref(tval); Ref(tval);
mgr.QueueEvent(protocol_confirmation, { mgr.QueueEventFast(protocol_confirmation, {
BuildConnVal(), BuildConnVal(),
tval, tval,
val_mgr->GetCount(id), val_mgr->GetCount(id),
}); });
protocol_confirmed = true;
} }
void Analyzer::ProtocolViolation(const char* reason, const char* data, int len) void Analyzer::ProtocolViolation(const char* reason, const char* data, int len)
@ -689,10 +692,13 @@ void Analyzer::ProtocolViolation(const char* reason, const char* data, int len)
else else
r = new StringVal(reason); r = new StringVal(reason);
if ( ! protocol_violation )
return;
EnumVal* tval = tag.AsEnumVal(); EnumVal* tval = tag.AsEnumVal();
Ref(tval); Ref(tval);
mgr.QueueEvent(protocol_violation, { mgr.QueueEventFast(protocol_violation, {
BuildConnVal(), BuildConnVal(),
tval, tval,
val_mgr->GetCount(id), val_mgr->GetCount(id),
@ -787,6 +793,11 @@ void Analyzer::ConnectionEvent(EventHandlerPtr f, val_list vl)
conn->ConnectionEvent(f, this, std::move(vl)); conn->ConnectionEvent(f, this, std::move(vl));
} }
void Analyzer::ConnectionEventFast(EventHandlerPtr f, val_list vl)
{
conn->ConnectionEventFast(f, this, std::move(vl));
}
void Analyzer::Weird(const char* name, const char* addl) void Analyzer::Weird(const char* name, const char* addl)
{ {
conn->Weird(name, addl); conn->Weird(name, addl);

View file

@ -547,6 +547,12 @@ public:
*/ */
void ConnectionEvent(EventHandlerPtr f, val_list vl); void ConnectionEvent(EventHandlerPtr f, val_list vl);
/**
* Convenience function that forwards directly to
* Connection::ConnectionEventFast().
*/
void ConnectionEventFast(EventHandlerPtr f, val_list vl);
/** /**
* Convenience function that forwards directly to the corresponding * Convenience function that forwards directly to the corresponding
* Connection::Weird(). * Connection::Weird().

View file

@ -190,7 +190,7 @@ void ARP_Analyzer::BadARP(const struct arp_pkthdr* hdr, const char* msg)
if ( ! bad_arp ) if ( ! bad_arp )
return; return;
mgr.QueueEvent(bad_arp, { mgr.QueueEventFast(bad_arp, {
ConstructAddrVal(ar_spa(hdr)), ConstructAddrVal(ar_spa(hdr)),
EthAddrToStr((const u_char*) ar_sha(hdr)), EthAddrToStr((const u_char*) ar_sha(hdr)),
ConstructAddrVal(ar_tpa(hdr)), ConstructAddrVal(ar_tpa(hdr)),
@ -212,7 +212,7 @@ void ARP_Analyzer::RREvent(EventHandlerPtr e,
if ( ! e ) if ( ! e )
return; return;
mgr.QueueEvent(e, { mgr.QueueEventFast(e, {
EthAddrToStr(src), EthAddrToStr(src),
EthAddrToStr(dst), EthAddrToStr(dst),
ConstructAddrVal(spa), ConstructAddrVal(spa),

View file

@ -246,7 +246,10 @@ void BackDoorEndpoint::RloginSignatureFound(int len)
rlogin_checking_done = 1; rlogin_checking_done = 1;
endp->TCP()->ConnectionEvent(rlogin_signature_found, { if ( ! rlogin_signature_found )
return;
endp->TCP()->ConnectionEventFast(rlogin_signature_found, {
endp->TCP()->BuildConnVal(), endp->TCP()->BuildConnVal(),
val_mgr->GetBool(endp->IsOrig()), val_mgr->GetBool(endp->IsOrig()),
val_mgr->GetCount(rlogin_num_null), val_mgr->GetCount(rlogin_num_null),
@ -337,7 +340,10 @@ void BackDoorEndpoint::CheckForTelnet(uint64 /* seq */, int len, const u_char* d
void BackDoorEndpoint::TelnetSignatureFound(int len) void BackDoorEndpoint::TelnetSignatureFound(int len)
{ {
endp->TCP()->ConnectionEvent(telnet_signature_found, { if ( ! telnet_signature_found )
return;
endp->TCP()->ConnectionEventFast(telnet_signature_found, {
endp->TCP()->BuildConnVal(), endp->TCP()->BuildConnVal(),
val_mgr->GetBool(endp->IsOrig()), val_mgr->GetBool(endp->IsOrig()),
val_mgr->GetCount(len), val_mgr->GetCount(len),
@ -641,12 +647,15 @@ void BackDoorEndpoint::CheckForHTTPProxy(uint64 /* seq */, int len,
void BackDoorEndpoint::SignatureFound(EventHandlerPtr e, int do_orig) void BackDoorEndpoint::SignatureFound(EventHandlerPtr e, int do_orig)
{ {
if ( ! e )
return;
if ( do_orig ) if ( do_orig )
endp->TCP()->ConnectionEvent(e, endp->TCP()->ConnectionEventFast(e,
{endp->TCP()->BuildConnVal(), val_mgr->GetBool(endp->IsOrig())}); {endp->TCP()->BuildConnVal(), val_mgr->GetBool(endp->IsOrig())});
else else
endp->TCP()->ConnectionEvent(e, {endp->TCP()->BuildConnVal()}); endp->TCP()->ConnectionEventFast(e, {endp->TCP()->BuildConnVal()});
} }
@ -773,7 +782,10 @@ void BackDoor_Analyzer::StatTimer(double t, int is_expire)
void BackDoor_Analyzer::StatEvent() void BackDoor_Analyzer::StatEvent()
{ {
TCP()->ConnectionEvent(backdoor_stats, { if ( ! backdoor_stats )
return;
TCP()->ConnectionEventFast(backdoor_stats, {
TCP()->BuildConnVal(), TCP()->BuildConnVal(),
orig_endp->BuildStats(), orig_endp->BuildStats(),
resp_endp->BuildStats(), resp_endp->BuildStats(),
@ -782,7 +794,10 @@ void BackDoor_Analyzer::StatEvent()
void BackDoor_Analyzer::RemoveEvent() void BackDoor_Analyzer::RemoveEvent()
{ {
TCP()->ConnectionEvent(backdoor_remove_conn, {TCP()->BuildConnVal()}); if ( ! backdoor_remove_conn )
return;
TCP()->ConnectionEventFast(backdoor_remove_conn, {TCP()->BuildConnVal()});
} }
BackDoorTimer::BackDoorTimer(double t, BackDoor_Analyzer* a) BackDoorTimer::BackDoorTimer(double t, BackDoor_Analyzer* a)

View file

@ -120,7 +120,7 @@ void BitTorrent_Analyzer::DeliverWeird(const char* msg, bool orig)
{ {
if ( bittorrent_peer_weird ) if ( bittorrent_peer_weird )
{ {
ConnectionEvent(bittorrent_peer_weird, { ConnectionEventFast(bittorrent_peer_weird, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(msg), new StringVal(msg),

View file

@ -247,7 +247,7 @@ void BitTorrentTracker_Analyzer::DeliverWeird(const char* msg, bool orig)
{ {
if ( bt_tracker_weird ) if ( bt_tracker_weird )
{ {
ConnectionEvent(bt_tracker_weird, { ConnectionEventFast(bt_tracker_weird, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(msg), new StringVal(msg),
@ -348,7 +348,8 @@ void BitTorrentTracker_Analyzer::EmitRequest(void)
{ {
ProtocolConfirmation(); ProtocolConfirmation();
ConnectionEvent(bt_tracker_request, { if ( bt_tracker_request )
ConnectionEventFast(bt_tracker_request, {
BuildConnVal(), BuildConnVal(),
req_val_uri, req_val_uri,
req_val_headers, req_val_headers,
@ -401,7 +402,8 @@ bool BitTorrentTracker_Analyzer::ParseResponse(char* line)
{ {
if ( res_status != 200 ) if ( res_status != 200 )
{ {
ConnectionEvent(bt_tracker_response_not_ok, { if ( bt_tracker_response_not_ok )
ConnectionEventFast(bt_tracker_response_not_ok, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetCount(res_status), val_mgr->GetCount(res_status),
res_val_headers, res_val_headers,
@ -787,7 +789,8 @@ void BitTorrentTracker_Analyzer::EmitResponse(void)
{ {
ProtocolConfirmation(); ProtocolConfirmation();
ConnectionEvent(bt_tracker_response, { if ( bt_tracker_response )
ConnectionEventFast(bt_tracker_response, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetCount(res_status), val_mgr->GetCount(res_status),
res_val_headers, res_val_headers,

View file

@ -47,7 +47,7 @@ void ConnSize_Analyzer::ThresholdEvent(EventHandlerPtr f, uint64 threshold, bool
if ( ! f ) if ( ! f )
return; return;
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetCount(threshold), val_mgr->GetCount(threshold),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),

View file

@ -46,7 +46,7 @@ int DNS_Interpreter::ParseMessage(const u_char* data, int len, int is_query)
if ( dns_message ) if ( dns_message )
{ {
analyzer->ConnectionEvent(dns_message, { analyzer->ConnectionEventFast(dns_message, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_query), val_mgr->GetBool(is_query),
msg.BuildHdrVal(), msg.BuildHdrVal(),
@ -132,7 +132,8 @@ int DNS_Interpreter::ParseMessage(const u_char* data, int len, int is_query)
int DNS_Interpreter::EndMessage(DNS_MsgInfo* msg) int DNS_Interpreter::EndMessage(DNS_MsgInfo* msg)
{ {
analyzer->ConnectionEvent(dns_end, { if ( dns_end )
analyzer->ConnectionEventFast(dns_end, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
}); });
@ -334,7 +335,7 @@ int DNS_Interpreter::ParseAnswer(DNS_MsgInfo* msg,
if ( dns_unknown_reply && ! msg->skip_event ) if ( dns_unknown_reply && ! msg->skip_event )
{ {
analyzer->ConnectionEvent(dns_unknown_reply, { analyzer->ConnectionEventFast(dns_unknown_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -549,7 +550,7 @@ int DNS_Interpreter::ParseRR_Name(DNS_MsgInfo* msg,
if ( reply_event && ! msg->skip_event ) if ( reply_event && ! msg->skip_event )
{ {
analyzer->ConnectionEvent(reply_event, { analyzer->ConnectionEventFast(reply_event, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -603,7 +604,7 @@ int DNS_Interpreter::ParseRR_SOA(DNS_MsgInfo* msg,
r->Assign(5, new IntervalVal(double(expire), Seconds)); r->Assign(5, new IntervalVal(double(expire), Seconds));
r->Assign(6, new IntervalVal(double(minimum), Seconds)); r->Assign(6, new IntervalVal(double(minimum), Seconds));
analyzer->ConnectionEvent(dns_SOA_reply, { analyzer->ConnectionEventFast(dns_SOA_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -634,7 +635,7 @@ int DNS_Interpreter::ParseRR_MX(DNS_MsgInfo* msg,
if ( dns_MX_reply && ! msg->skip_event ) if ( dns_MX_reply && ! msg->skip_event )
{ {
analyzer->ConnectionEvent(dns_MX_reply, { analyzer->ConnectionEventFast(dns_MX_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -677,7 +678,7 @@ int DNS_Interpreter::ParseRR_SRV(DNS_MsgInfo* msg,
if ( dns_SRV_reply && ! msg->skip_event ) if ( dns_SRV_reply && ! msg->skip_event )
{ {
analyzer->ConnectionEvent(dns_SRV_reply, { analyzer->ConnectionEventFast(dns_SRV_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -700,7 +701,7 @@ int DNS_Interpreter::ParseRR_EDNS(DNS_MsgInfo* msg,
if ( dns_EDNS_addl && ! msg->skip_event ) if ( dns_EDNS_addl && ! msg->skip_event )
{ {
analyzer->ConnectionEvent(dns_EDNS_addl, { analyzer->ConnectionEventFast(dns_EDNS_addl, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildEDNS_Val(), msg->BuildEDNS_Val(),
@ -766,22 +767,24 @@ int DNS_Interpreter::ParseRR_TSIG(DNS_MsgInfo* msg,
unsigned int rr_error = ExtractShort(data, len); unsigned int rr_error = ExtractShort(data, len);
ExtractOctets(data, len, 0); // Other Data ExtractOctets(data, len, 0); // Other Data
msg->tsig = new TSIG_DATA; if ( dns_TSIG_addl )
{
msg->tsig->alg_name = TSIG_DATA tsig;
tsig.alg_name =
new BroString(alg_name, alg_name_end - alg_name, 1); new BroString(alg_name, alg_name_end - alg_name, 1);
msg->tsig->sig = request_MAC; tsig.sig = request_MAC;
msg->tsig->time_s = sign_time_sec; tsig.time_s = sign_time_sec;
msg->tsig->time_ms = sign_time_msec; tsig.time_ms = sign_time_msec;
msg->tsig->fudge = fudge; tsig.fudge = fudge;
msg->tsig->orig_id = orig_id; tsig.orig_id = orig_id;
msg->tsig->rr_error = rr_error; tsig.rr_error = rr_error;
analyzer->ConnectionEvent(dns_TSIG_addl, { analyzer->ConnectionEventFast(dns_TSIG_addl, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildTSIG_Val(), msg->BuildTSIG_Val(&tsig),
}); });
}
return 1; return 1;
} }
@ -864,6 +867,8 @@ int DNS_Interpreter::ParseRR_RRSIG(DNS_MsgInfo* msg,
break; break;
} }
if ( dns_RRSIG )
{
RRSIG_DATA rrsig; RRSIG_DATA rrsig;
rrsig.type_covered = type_covered; rrsig.type_covered = type_covered;
rrsig.algorithm = algo; rrsig.algorithm = algo;
@ -875,12 +880,13 @@ int DNS_Interpreter::ParseRR_RRSIG(DNS_MsgInfo* msg,
rrsig.signer_name = new BroString(name, name_end - name, 1); rrsig.signer_name = new BroString(name, name_end - name, 1);
rrsig.signature = sign; rrsig.signature = sign;
analyzer->ConnectionEvent(dns_RRSIG, { analyzer->ConnectionEventFast(dns_RRSIG, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
msg->BuildRRSIG_Val(&rrsig), msg->BuildRRSIG_Val(&rrsig),
}); });
}
return 1; return 1;
} }
@ -961,18 +967,21 @@ int DNS_Interpreter::ParseRR_DNSKEY(DNS_MsgInfo* msg,
break; break;
} }
if ( dns_DNSKEY )
{
DNSKEY_DATA dnskey; DNSKEY_DATA dnskey;
dnskey.dflags = dflags; dnskey.dflags = dflags;
dnskey.dalgorithm = dalgorithm; dnskey.dalgorithm = dalgorithm;
dnskey.dprotocol = dprotocol; dnskey.dprotocol = dprotocol;
dnskey.public_key = key; dnskey.public_key = key;
analyzer->ConnectionEvent(dns_DNSKEY, { analyzer->ConnectionEventFast(dns_DNSKEY, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
msg->BuildDNSKEY_Val(&dnskey), msg->BuildDNSKEY_Val(&dnskey),
}); });
}
return 1; return 1;
} }
@ -1017,13 +1026,16 @@ int DNS_Interpreter::ParseRR_NSEC(DNS_MsgInfo* msg,
typebitmaps_len = typebitmaps_len - (2 + bmlen); typebitmaps_len = typebitmaps_len - (2 + bmlen);
} }
analyzer->ConnectionEvent(dns_NSEC, { if ( dns_NSEC )
analyzer->ConnectionEventFast(dns_NSEC, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
new StringVal(new BroString(name, name_end - name, 1)), new StringVal(new BroString(name, name_end - name, 1)),
char_strings, char_strings,
}); });
else
Unref(char_strings);
return 1; return 1;
} }
@ -1091,6 +1103,8 @@ int DNS_Interpreter::ParseRR_NSEC3(DNS_MsgInfo* msg,
typebitmaps_len = typebitmaps_len - (2 + bmlen); typebitmaps_len = typebitmaps_len - (2 + bmlen);
} }
if ( dns_NSEC3 )
{
NSEC3_DATA nsec3; NSEC3_DATA nsec3;
nsec3.nsec_flags = nsec_flags; nsec3.nsec_flags = nsec_flags;
nsec3.nsec_hash_algo = hash_algo; nsec3.nsec_hash_algo = hash_algo;
@ -1101,12 +1115,13 @@ int DNS_Interpreter::ParseRR_NSEC3(DNS_MsgInfo* msg,
nsec3.nsec_hash = hash_val; nsec3.nsec_hash = hash_val;
nsec3.bitmaps = char_strings; nsec3.bitmaps = char_strings;
analyzer->ConnectionEvent(dns_NSEC3, { analyzer->ConnectionEventFast(dns_NSEC3, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
msg->BuildNSEC3_Val(&nsec3), msg->BuildNSEC3_Val(&nsec3),
}); });
}
return 1; return 1;
} }
@ -1150,18 +1165,21 @@ int DNS_Interpreter::ParseRR_DS(DNS_MsgInfo* msg,
break; break;
} }
if ( dns_DS )
{
DS_DATA ds; DS_DATA ds;
ds.key_tag = ds_key_tag; ds.key_tag = ds_key_tag;
ds.algorithm = ds_algo; ds.algorithm = ds_algo;
ds.digest_type = ds_dtype; ds.digest_type = ds_dtype;
ds.digest_val = ds_digest; ds.digest_val = ds_digest;
analyzer->ConnectionEvent(dns_DS, { analyzer->ConnectionEventFast(dns_DS, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
msg->BuildDS_Val(&ds), msg->BuildDS_Val(&ds),
}); });
}
return 1; return 1;
} }
@ -1179,7 +1197,7 @@ int DNS_Interpreter::ParseRR_A(DNS_MsgInfo* msg,
if ( dns_A_reply && ! msg->skip_event ) if ( dns_A_reply && ! msg->skip_event )
{ {
analyzer->ConnectionEvent(dns_A_reply, { analyzer->ConnectionEventFast(dns_A_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -1216,7 +1234,7 @@ int DNS_Interpreter::ParseRR_AAAA(DNS_MsgInfo* msg,
event = dns_A6_reply; event = dns_A6_reply;
if ( event && ! msg->skip_event ) if ( event && ! msg->skip_event )
{ {
analyzer->ConnectionEvent(event, { analyzer->ConnectionEventFast(event, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -1290,12 +1308,15 @@ int DNS_Interpreter::ParseRR_TXT(DNS_MsgInfo* msg,
while ( (char_string = extract_char_string(analyzer, data, len, rdlength)) ) while ( (char_string = extract_char_string(analyzer, data, len, rdlength)) )
char_strings->Assign(char_strings->Size(), char_string); char_strings->Assign(char_strings->Size(), char_string);
analyzer->ConnectionEvent(dns_TXT_reply, { if ( dns_TXT_reply )
analyzer->ConnectionEventFast(dns_TXT_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
char_strings, char_strings,
}); });
else
Unref(char_strings);
return rdlength == 0; return rdlength == 0;
} }
@ -1330,7 +1351,8 @@ int DNS_Interpreter::ParseRR_CAA(DNS_MsgInfo* msg,
data += value->Len(); data += value->Len();
rdlength -= value->Len(); rdlength -= value->Len();
analyzer->ConnectionEvent(dns_CAA_reply, { if ( dns_CAA_reply )
analyzer->ConnectionEventFast(dns_CAA_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
msg->BuildAnswerVal(), msg->BuildAnswerVal(),
@ -1338,6 +1360,11 @@ int DNS_Interpreter::ParseRR_CAA(DNS_MsgInfo* msg,
new StringVal(tag), new StringVal(tag),
new StringVal(value), new StringVal(value),
}); });
else
{
delete tag;
delete value;
}
return rdlength == 0; return rdlength == 0;
} }
@ -1351,7 +1378,8 @@ void DNS_Interpreter::SendReplyOrRejectEvent(DNS_MsgInfo* msg,
RR_Type qtype = RR_Type(ExtractShort(data, len)); RR_Type qtype = RR_Type(ExtractShort(data, len));
int qclass = ExtractShort(data, len); int qclass = ExtractShort(data, len);
analyzer->ConnectionEvent(event, { if ( event )
analyzer->ConnectionEventFast(event, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
msg->BuildHdrVal(), msg->BuildHdrVal(),
new StringVal(question_name), new StringVal(question_name),
@ -1391,7 +1419,6 @@ DNS_MsgInfo::DNS_MsgInfo(DNS_RawMsgHdr* hdr, int arg_is_query)
answer_type = DNS_QUESTION; answer_type = DNS_QUESTION;
skip_event = 0; skip_event = 0;
tsig = 0;
} }
DNS_MsgInfo::~DNS_MsgInfo() DNS_MsgInfo::~DNS_MsgInfo()
@ -1470,7 +1497,7 @@ Val* DNS_MsgInfo::BuildEDNS_Val()
return r; return r;
} }
Val* DNS_MsgInfo::BuildTSIG_Val() Val* DNS_MsgInfo::BuildTSIG_Val(struct TSIG_DATA* tsig)
{ {
RecordVal* r = new RecordVal(dns_tsig_additional); RecordVal* r = new RecordVal(dns_tsig_additional);
double rtime = tsig->time_s + tsig->time_ms / 1000.0; double rtime = tsig->time_s + tsig->time_ms / 1000.0;
@ -1487,9 +1514,6 @@ Val* DNS_MsgInfo::BuildTSIG_Val()
r->Assign(7, val_mgr->GetCount(tsig->rr_error)); r->Assign(7, val_mgr->GetCount(tsig->rr_error));
r->Assign(8, val_mgr->GetCount(is_query)); r->Assign(8, val_mgr->GetCount(is_query));
delete tsig;
tsig = 0;
return r; return r;
} }
@ -1705,7 +1729,8 @@ void DNS_Analyzer::DeliverPacket(int len, const u_char* data, bool orig,
{ {
if ( ! interp->ParseMessage(data, len, 1) && non_dns_request ) if ( ! interp->ParseMessage(data, len, 1) && non_dns_request )
{ {
ConnectionEvent(non_dns_request, { if ( non_dns_request )
ConnectionEventFast(non_dns_request, {
BuildConnVal(), BuildConnVal(),
new StringVal(len, (const char*) data), new StringVal(len, (const char*) data),
}); });

View file

@ -182,7 +182,7 @@ public:
Val* BuildHdrVal(); Val* BuildHdrVal();
Val* BuildAnswerVal(); Val* BuildAnswerVal();
Val* BuildEDNS_Val(); Val* BuildEDNS_Val();
Val* BuildTSIG_Val(); Val* BuildTSIG_Val(struct TSIG_DATA*);
Val* BuildRRSIG_Val(struct RRSIG_DATA*); Val* BuildRRSIG_Val(struct RRSIG_DATA*);
Val* BuildDNSKEY_Val(struct DNSKEY_DATA*); Val* BuildDNSKEY_Val(struct DNSKEY_DATA*);
Val* BuildNSEC3_Val(struct NSEC3_DATA*); Val* BuildNSEC3_Val(struct NSEC3_DATA*);
@ -214,10 +214,6 @@ public:
///< identical answer, there may be problems ///< identical answer, there may be problems
// uint32* addr; ///< cache value to pass back results // uint32* addr; ///< cache value to pass back results
///< for forward lookups ///< for forward lookups
// More values for spesific DNS types.
//struct EDNS_ADDITIONAL* edns;
struct TSIG_DATA* tsig;
}; };

View file

@ -78,7 +78,8 @@ void File_Analyzer::Identify()
string match = matches.empty() ? "<unknown>" string match = matches.empty() ? "<unknown>"
: *(matches.begin()->second.begin()); : *(matches.begin()->second.begin());
ConnectionEvent(file_transferred, { if ( file_transferred )
ConnectionEventFast(file_transferred, {
BuildConnVal(), BuildConnVal(),
new StringVal(buffer_len, buffer), new StringVal(buffer_len, buffer),
new StringVal("<unknown>"), new StringVal("<unknown>"),

View file

@ -68,7 +68,7 @@ void Finger_Analyzer::DeliverStream(int length, const u_char* data, bool is_orig
if ( finger_request ) if ( finger_request )
{ {
ConnectionEvent(finger_request, { ConnectionEventFast(finger_request, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(long_cnt), val_mgr->GetBool(long_cnt),
new StringVal(at - line, line), new StringVal(at - line, line),
@ -87,7 +87,7 @@ void Finger_Analyzer::DeliverStream(int length, const u_char* data, bool is_orig
if ( ! finger_reply ) if ( ! finger_reply )
return; return;
ConnectionEvent(finger_reply, { ConnectionEventFast(finger_reply, {
BuildConnVal(), BuildConnVal(),
new StringVal(end_of_line - line, line), new StringVal(end_of_line - line, line),
}); });

View file

@ -59,9 +59,9 @@ void Gnutella_Analyzer::Done()
if ( ! sent_establish && (gnutella_establish || gnutella_not_establish) ) if ( ! sent_establish && (gnutella_establish || gnutella_not_establish) )
{ {
if ( Established() && gnutella_establish ) if ( Established() && gnutella_establish )
ConnectionEvent(gnutella_establish, {BuildConnVal()}); ConnectionEventFast(gnutella_establish, {BuildConnVal()});
else if ( ! Established () && gnutella_not_establish ) else if ( ! Established () && gnutella_not_establish )
ConnectionEvent(gnutella_not_establish, {BuildConnVal()}); ConnectionEventFast(gnutella_not_establish, {BuildConnVal()});
} }
if ( gnutella_partial_binary_msg ) if ( gnutella_partial_binary_msg )
@ -72,7 +72,7 @@ void Gnutella_Analyzer::Done()
{ {
if ( ! p->msg_sent && p->msg_pos ) if ( ! p->msg_sent && p->msg_pos )
{ {
ConnectionEvent(gnutella_partial_binary_msg, { ConnectionEventFast(gnutella_partial_binary_msg, {
BuildConnVal(), BuildConnVal(),
new StringVal(p->msg), new StringVal(p->msg),
val_mgr->GetBool((i == 0)), val_mgr->GetBool((i == 0)),
@ -121,7 +121,7 @@ int Gnutella_Analyzer::IsHTTP(string header)
if ( gnutella_http_notify ) if ( gnutella_http_notify )
{ {
ConnectionEvent(gnutella_http_notify, {BuildConnVal()}); ConnectionEventFast(gnutella_http_notify, {BuildConnVal()});
} }
analyzer::Analyzer* a = analyzer_mgr->InstantiateAnalyzer("HTTP", Conn()); analyzer::Analyzer* a = analyzer_mgr->InstantiateAnalyzer("HTTP", Conn());
@ -181,7 +181,7 @@ void Gnutella_Analyzer::DeliverLines(int len, const u_char* data, bool orig)
{ {
if ( gnutella_text_msg ) if ( gnutella_text_msg )
{ {
ConnectionEvent(gnutella_text_msg, { ConnectionEventFast(gnutella_text_msg, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(ms->headers.data()), new StringVal(ms->headers.data()),
@ -195,7 +195,7 @@ void Gnutella_Analyzer::DeliverLines(int len, const u_char* data, bool orig)
{ {
sent_establish = 1; sent_establish = 1;
ConnectionEvent(gnutella_establish, {BuildConnVal()}); ConnectionEventFast(gnutella_establish, {BuildConnVal()});
} }
} }
} }
@ -221,7 +221,7 @@ void Gnutella_Analyzer::SendEvents(GnutellaMsgState* p, bool is_orig)
if ( gnutella_binary_msg ) if ( gnutella_binary_msg )
{ {
ConnectionEvent(gnutella_binary_msg, { ConnectionEventFast(gnutella_binary_msg, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
val_mgr->GetCount(p->msg_type), val_mgr->GetCount(p->msg_type),

View file

@ -646,7 +646,7 @@ void HTTP_Message::Done(const int interrupted, const char* detail)
if ( http_message_done ) if ( http_message_done )
{ {
GetAnalyzer()->ConnectionEvent(http_message_done, { GetAnalyzer()->ConnectionEventFast(http_message_done, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
BuildMessageStat(interrupted, detail), BuildMessageStat(interrupted, detail),
@ -679,7 +679,7 @@ void HTTP_Message::BeginEntity(mime::MIME_Entity* entity)
if ( http_begin_entity ) if ( http_begin_entity )
{ {
analyzer->ConnectionEvent(http_begin_entity, { analyzer->ConnectionEventFast(http_begin_entity, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
}); });
@ -696,7 +696,7 @@ void HTTP_Message::EndEntity(mime::MIME_Entity* entity)
if ( http_end_entity ) if ( http_end_entity )
{ {
analyzer->ConnectionEvent(http_end_entity, { analyzer->ConnectionEventFast(http_end_entity, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
}); });
@ -737,7 +737,7 @@ void HTTP_Message::SubmitAllHeaders(mime::MIME_HeaderList& hlist)
{ {
if ( http_all_headers ) if ( http_all_headers )
{ {
analyzer->ConnectionEvent(http_all_headers, { analyzer->ConnectionEventFast(http_all_headers, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
BuildHeaderTable(hlist), BuildHeaderTable(hlist),
@ -751,7 +751,7 @@ void HTTP_Message::SubmitAllHeaders(mime::MIME_HeaderList& hlist)
ty->Ref(); ty->Ref();
subty->Ref(); subty->Ref();
analyzer->ConnectionEvent(http_content_type, { analyzer->ConnectionEventFast(http_content_type, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
ty, ty,
@ -1183,7 +1183,7 @@ void HTTP_Analyzer::GenStats()
r->Assign(3, new Val(reply_version, TYPE_DOUBLE)); r->Assign(3, new Val(reply_version, TYPE_DOUBLE));
// DEBUG_MSG("%.6f http_stats\n", network_time); // DEBUG_MSG("%.6f http_stats\n", network_time);
ConnectionEvent(http_stats, {BuildConnVal(), r}); ConnectionEventFast(http_stats, {BuildConnVal(), r});
} }
} }
@ -1381,7 +1381,7 @@ void HTTP_Analyzer::HTTP_Event(const char* category, StringVal* detail)
if ( http_event ) if ( http_event )
{ {
// DEBUG_MSG("%.6f http_event\n", network_time); // DEBUG_MSG("%.6f http_event\n", network_time);
ConnectionEvent(http_event, { ConnectionEventFast(http_event, {
BuildConnVal(), BuildConnVal(),
new StringVal(category), new StringVal(category),
detail, detail,
@ -1424,7 +1424,7 @@ void HTTP_Analyzer::HTTP_Request()
Ref(request_method); Ref(request_method);
// DEBUG_MSG("%.6f http_request\n", network_time); // DEBUG_MSG("%.6f http_request\n", network_time);
ConnectionEvent(http_request, { ConnectionEventFast(http_request, {
BuildConnVal(), BuildConnVal(),
request_method, request_method,
TruncateURI(request_URI->AsStringVal()), TruncateURI(request_URI->AsStringVal()),
@ -1438,7 +1438,7 @@ void HTTP_Analyzer::HTTP_Reply()
{ {
if ( http_reply ) if ( http_reply )
{ {
ConnectionEvent(http_reply, { ConnectionEventFast(http_reply, {
BuildConnVal(), BuildConnVal(),
new StringVal(fmt("%.1f", reply_version)), new StringVal(fmt("%.1f", reply_version)),
val_mgr->GetCount(reply_code), val_mgr->GetCount(reply_code),
@ -1517,7 +1517,7 @@ void HTTP_Analyzer::ReplyMade(const int interrupted, const char* msg)
if ( http_connection_upgrade ) if ( http_connection_upgrade )
{ {
ConnectionEvent(http_connection_upgrade, { ConnectionEventFast(http_connection_upgrade, {
BuildConnVal(), BuildConnVal(),
new StringVal(upgrade_protocol), new StringVal(upgrade_protocol),
}); });
@ -1693,7 +1693,7 @@ void HTTP_Analyzer::HTTP_Header(int is_orig, mime::MIME_Header* h)
if ( DEBUG_http ) if ( DEBUG_http )
DEBUG_MSG("%.6f http_header\n", network_time); DEBUG_MSG("%.6f http_header\n", network_time);
ConnectionEvent(http_header, { ConnectionEventFast(http_header, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
mime::new_string_val(h->get_name())->ToUpper(), mime::new_string_val(h->get_name())->ToUpper(),
@ -1827,7 +1827,7 @@ void HTTP_Analyzer::HTTP_EntityData(int is_orig, BroString* entity_data)
{ {
if ( http_entity_data ) if ( http_entity_data )
{ {
ConnectionEvent(http_entity_data, { ConnectionEventFast(http_entity_data, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
val_mgr->GetCount(entity_data->Len()), val_mgr->GetCount(entity_data->Len()),

View file

@ -199,7 +199,7 @@ void ICMP_Analyzer::ICMP_Sent(const struct icmp* icmpp, int len, int caplen,
{ {
if ( icmp_sent ) if ( icmp_sent )
{ {
ConnectionEvent(icmp_sent, { ConnectionEventFast(icmp_sent, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, icmpv6, ip_hdr), BuildICMPVal(icmpp, len, icmpv6, ip_hdr),
}); });
@ -209,7 +209,7 @@ void ICMP_Analyzer::ICMP_Sent(const struct icmp* icmpp, int len, int caplen,
{ {
BroString* payload = new BroString(data, min(len, caplen), 0); BroString* payload = new BroString(data, min(len, caplen), 0);
ConnectionEvent(icmp_sent_payload, { ConnectionEventFast(icmp_sent_payload, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, icmpv6, ip_hdr), BuildICMPVal(icmpp, len, icmpv6, ip_hdr),
new StringVal(payload), new StringVal(payload),
@ -512,7 +512,7 @@ void ICMP_Analyzer::Echo(double t, const struct icmp* icmpp, int len,
BroString* payload = new BroString(data, caplen, 0); BroString* payload = new BroString(data, caplen, 0);
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, ip_hdr->NextProto() != IPPROTO_ICMP, ip_hdr), BuildICMPVal(icmpp, len, ip_hdr->NextProto() != IPPROTO_ICMP, ip_hdr),
val_mgr->GetCount(iid), val_mgr->GetCount(iid),
@ -526,6 +526,10 @@ void ICMP_Analyzer::RouterAdvert(double t, const struct icmp* icmpp, int len,
int caplen, const u_char*& data, const IP_Hdr* ip_hdr) int caplen, const u_char*& data, const IP_Hdr* ip_hdr)
{ {
EventHandlerPtr f = icmp_router_advertisement; EventHandlerPtr f = icmp_router_advertisement;
if ( ! f )
return;
uint32 reachable = 0, retrans = 0; uint32 reachable = 0, retrans = 0;
if ( caplen >= (int)sizeof(reachable) ) if ( caplen >= (int)sizeof(reachable) )
@ -536,7 +540,7 @@ void ICMP_Analyzer::RouterAdvert(double t, const struct icmp* icmpp, int len,
int opt_offset = sizeof(reachable) + sizeof(retrans); int opt_offset = sizeof(reachable) + sizeof(retrans);
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, 1, ip_hdr), BuildICMPVal(icmpp, len, 1, ip_hdr),
val_mgr->GetCount(icmpp->icmp_num_addrs), // Cur Hop Limit val_mgr->GetCount(icmpp->icmp_num_addrs), // Cur Hop Limit
@ -558,6 +562,10 @@ void ICMP_Analyzer::NeighborAdvert(double t, const struct icmp* icmpp, int len,
int caplen, const u_char*& data, const IP_Hdr* ip_hdr) int caplen, const u_char*& data, const IP_Hdr* ip_hdr)
{ {
EventHandlerPtr f = icmp_neighbor_advertisement; EventHandlerPtr f = icmp_neighbor_advertisement;
if ( ! f )
return;
IPAddr tgtaddr; IPAddr tgtaddr;
if ( caplen >= (int)sizeof(in6_addr) ) if ( caplen >= (int)sizeof(in6_addr) )
@ -565,7 +573,7 @@ void ICMP_Analyzer::NeighborAdvert(double t, const struct icmp* icmpp, int len,
int opt_offset = sizeof(in6_addr); int opt_offset = sizeof(in6_addr);
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, 1, ip_hdr), BuildICMPVal(icmpp, len, 1, ip_hdr),
val_mgr->GetBool(icmpp->icmp_num_addrs & 0x80), // Router val_mgr->GetBool(icmpp->icmp_num_addrs & 0x80), // Router
@ -581,6 +589,10 @@ void ICMP_Analyzer::NeighborSolicit(double t, const struct icmp* icmpp, int len,
int caplen, const u_char*& data, const IP_Hdr* ip_hdr) int caplen, const u_char*& data, const IP_Hdr* ip_hdr)
{ {
EventHandlerPtr f = icmp_neighbor_solicitation; EventHandlerPtr f = icmp_neighbor_solicitation;
if ( ! f )
return;
IPAddr tgtaddr; IPAddr tgtaddr;
if ( caplen >= (int)sizeof(in6_addr) ) if ( caplen >= (int)sizeof(in6_addr) )
@ -588,7 +600,7 @@ void ICMP_Analyzer::NeighborSolicit(double t, const struct icmp* icmpp, int len,
int opt_offset = sizeof(in6_addr); int opt_offset = sizeof(in6_addr);
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, 1, ip_hdr), BuildICMPVal(icmpp, len, 1, ip_hdr),
new AddrVal(tgtaddr), new AddrVal(tgtaddr),
@ -601,6 +613,10 @@ void ICMP_Analyzer::Redirect(double t, const struct icmp* icmpp, int len,
int caplen, const u_char*& data, const IP_Hdr* ip_hdr) int caplen, const u_char*& data, const IP_Hdr* ip_hdr)
{ {
EventHandlerPtr f = icmp_redirect; EventHandlerPtr f = icmp_redirect;
if ( ! f )
return;
IPAddr tgtaddr, dstaddr; IPAddr tgtaddr, dstaddr;
if ( caplen >= (int)sizeof(in6_addr) ) if ( caplen >= (int)sizeof(in6_addr) )
@ -611,7 +627,7 @@ void ICMP_Analyzer::Redirect(double t, const struct icmp* icmpp, int len,
int opt_offset = 2 * sizeof(in6_addr); int opt_offset = 2 * sizeof(in6_addr);
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, 1, ip_hdr), BuildICMPVal(icmpp, len, 1, ip_hdr),
new AddrVal(tgtaddr), new AddrVal(tgtaddr),
@ -626,7 +642,10 @@ void ICMP_Analyzer::RouterSolicit(double t, const struct icmp* icmpp, int len,
{ {
EventHandlerPtr f = icmp_router_solicitation; EventHandlerPtr f = icmp_router_solicitation;
ConnectionEvent(f, { if ( ! f )
return;
ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, 1, ip_hdr), BuildICMPVal(icmpp, len, 1, ip_hdr),
BuildNDOptionsVal(caplen, data), BuildNDOptionsVal(caplen, data),
@ -652,7 +671,7 @@ void ICMP_Analyzer::Context4(double t, const struct icmp* icmpp,
if ( f ) if ( f )
{ {
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, 0, ip_hdr), BuildICMPVal(icmpp, len, 0, ip_hdr),
val_mgr->GetCount(icmpp->icmp_code), val_mgr->GetCount(icmpp->icmp_code),
@ -692,7 +711,7 @@ void ICMP_Analyzer::Context6(double t, const struct icmp* icmpp,
if ( f ) if ( f )
{ {
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
BuildICMPVal(icmpp, len, 1, ip_hdr), BuildICMPVal(icmpp, len, 1, ip_hdr),
val_mgr->GetCount(icmpp->icmp_code), val_mgr->GetCount(icmpp->icmp_code),

View file

@ -83,7 +83,7 @@ void Ident_Analyzer::DeliverStream(int length, const u_char* data, bool is_orig)
Weird("ident_request_addendum", s.CheckString()); Weird("ident_request_addendum", s.CheckString());
} }
ConnectionEvent(ident_request, { ConnectionEventFast(ident_request, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetPort(local_port, TRANSPORT_TCP), val_mgr->GetPort(local_port, TRANSPORT_TCP),
val_mgr->GetPort(remote_port, TRANSPORT_TCP), val_mgr->GetPort(remote_port, TRANSPORT_TCP),
@ -143,7 +143,8 @@ void Ident_Analyzer::DeliverStream(int length, const u_char* data, bool is_orig)
if ( is_error ) if ( is_error )
{ {
ConnectionEvent(ident_error, { if ( ident_error )
ConnectionEventFast(ident_error, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetPort(local_port, TRANSPORT_TCP), val_mgr->GetPort(local_port, TRANSPORT_TCP),
val_mgr->GetPort(remote_port, TRANSPORT_TCP), val_mgr->GetPort(remote_port, TRANSPORT_TCP),
@ -176,7 +177,7 @@ void Ident_Analyzer::DeliverStream(int length, const u_char* data, bool is_orig)
line = skip_whitespace(colon + 1, end_of_line); line = skip_whitespace(colon + 1, end_of_line);
ConnectionEvent(ident_reply, { ConnectionEventFast(ident_reply, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetPort(local_port, TRANSPORT_TCP), val_mgr->GetPort(local_port, TRANSPORT_TCP),
val_mgr->GetPort(remote_port, TRANSPORT_TCP), val_mgr->GetPort(remote_port, TRANSPORT_TCP),

View file

@ -43,6 +43,8 @@ refine connection IMAP_Conn += {
if ( commands == "ok" ) if ( commands == "ok" )
{ {
bro_analyzer()->StartTLS(); bro_analyzer()->StartTLS();
if ( imap_starttls )
BifEvent::generate_imap_starttls(bro_analyzer(), bro_analyzer()->Conn()); BifEvent::generate_imap_starttls(bro_analyzer(), bro_analyzer()->Conn());
} }
else else
@ -54,6 +56,9 @@ refine connection IMAP_Conn += {
function proc_server_capability(capabilities: Capability[]): bool function proc_server_capability(capabilities: Capability[]): bool
%{ %{
if ( ! imap_capabilities )
return true;
VectorVal* capv = new VectorVal(internal_type("string_vec")->AsVectorType()); VectorVal* capv = new VectorVal(internal_type("string_vec")->AsVectorType());
for ( unsigned int i = 0; i< capabilities->size(); i++ ) for ( unsigned int i = 0; i< capabilities->size(); i++ )
{ {

View file

@ -241,7 +241,8 @@ void InterConn_Analyzer::StatTimer(double t, int is_expire)
void InterConn_Analyzer::StatEvent() void InterConn_Analyzer::StatEvent()
{ {
Conn()->ConnectionEvent(interconn_stats, this, { if ( interconn_stats )
Conn()->ConnectionEventFast(interconn_stats, this, {
Conn()->BuildConnVal(), Conn()->BuildConnVal(),
orig_endp->BuildStats(), orig_endp->BuildStats(),
resp_endp->BuildStats(), resp_endp->BuildStats(),
@ -250,7 +251,8 @@ void InterConn_Analyzer::StatEvent()
void InterConn_Analyzer::RemoveEvent() void InterConn_Analyzer::RemoveEvent()
{ {
Conn()->ConnectionEvent(interconn_remove_conn, this, {Conn()->BuildConnVal()}); if ( interconn_remove_conn )
Conn()->ConnectionEventFast(interconn_remove_conn, this, {Conn()->BuildConnVal()});
} }
InterConnTimer::InterConnTimer(double t, InterConn_Analyzer* a) InterConnTimer::InterConnTimer(double t, InterConn_Analyzer* a)

View file

@ -233,7 +233,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
// else ### // else ###
} }
ConnectionEvent(irc_network_info, { ConnectionEventFast(irc_network_info, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
val_mgr->GetInt(users), val_mgr->GetInt(users),
@ -281,7 +281,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
Unref(idx); Unref(idx);
} }
ConnectionEvent(irc_names_info, { ConnectionEventFast(irc_names_info, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(type.c_str()), new StringVal(type.c_str()),
@ -315,7 +315,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
// else ### // else ###
} }
ConnectionEvent(irc_server_info, { ConnectionEventFast(irc_server_info, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
val_mgr->GetInt(users), val_mgr->GetInt(users),
@ -337,7 +337,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( parts[i] == ":channels" ) if ( parts[i] == ":channels" )
channels = atoi(parts[i - 1].c_str()); channels = atoi(parts[i - 1].c_str());
ConnectionEvent(irc_channel_info, { ConnectionEventFast(irc_channel_info, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
val_mgr->GetInt(channels), val_mgr->GetInt(channels),
@ -369,7 +369,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
break; break;
} }
ConnectionEvent(irc_global_users, { ConnectionEventFast(irc_global_users, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(eop - prefix, prefix), new StringVal(eop - prefix, prefix),
@ -412,7 +412,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
vl.append(new StringVal(real_name.c_str())); vl.append(new StringVal(real_name.c_str()));
ConnectionEvent(irc_whois_user_line, std::move(vl)); ConnectionEventFast(irc_whois_user_line, std::move(vl));
} }
break; break;
@ -433,7 +433,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
return; return;
} }
ConnectionEvent(irc_whois_operator_line, { ConnectionEventFast(irc_whois_operator_line, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(parts[0].c_str()), new StringVal(parts[0].c_str()),
@ -472,7 +472,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
Unref(idx); Unref(idx);
} }
ConnectionEvent(irc_whois_channel_line, { ConnectionEventFast(irc_whois_channel_line, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(nick.c_str()), new StringVal(nick.c_str()),
@ -503,7 +503,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( *t == ':' ) if ( *t == ':' )
++t; ++t;
ConnectionEvent(irc_channel_topic, { ConnectionEventFast(irc_channel_topic, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(parts[1].c_str()), new StringVal(parts[1].c_str()),
@ -537,7 +537,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( parts[7][0] == ':' ) if ( parts[7][0] == ':' )
parts[7] = parts[7].substr(1); parts[7] = parts[7].substr(1);
ConnectionEvent(irc_who_line, { ConnectionEventFast(irc_who_line, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(parts[0].c_str()), new StringVal(parts[0].c_str()),
@ -560,7 +560,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
case 436: case 436:
if ( irc_invalid_nick ) if ( irc_invalid_nick )
{ {
ConnectionEvent(irc_invalid_nick, { ConnectionEventFast(irc_invalid_nick, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
}); });
@ -572,7 +572,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
case 491: // user is not operator case 491: // user is not operator
if ( irc_oper_response ) if ( irc_oper_response )
{ {
ConnectionEvent(irc_oper_response, { ConnectionEventFast(irc_oper_response, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
val_mgr->GetBool(code == 381), val_mgr->GetBool(code == 381),
@ -587,7 +587,8 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
// All other server replies. // All other server replies.
default: default:
ConnectionEvent(irc_reply, { if ( irc_reply )
ConnectionEventFast(irc_reply, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -657,7 +658,8 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
} }
ConnectionEvent(irc_dcc_message, { if ( irc_dcc_message )
ConnectionEventFast(irc_dcc_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -674,7 +676,8 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
else else
{ {
ConnectionEvent(irc_privmsg_message, { if ( irc_privmsg_message )
ConnectionEventFast(irc_privmsg_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -699,7 +702,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( message[0] == ':' ) if ( message[0] == ':' )
message = message.substr(1); message = message.substr(1);
ConnectionEvent(irc_notice_message, { ConnectionEventFast(irc_notice_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -723,7 +726,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( message[0] == ':' ) if ( message[0] == ':' )
message = message.substr(1); message = message.substr(1);
ConnectionEvent(irc_squery_message, { ConnectionEventFast(irc_squery_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -763,7 +766,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
const char* name = realname.c_str(); const char* name = realname.c_str();
vl.append(new StringVal(*name == ':' ? name + 1 : name)); vl.append(new StringVal(*name == ':' ? name + 1 : name));
ConnectionEvent(irc_user_message, std::move(vl)); ConnectionEventFast(irc_user_message, std::move(vl));
} }
else if ( irc_oper_message && command == "OPER" ) else if ( irc_oper_message && command == "OPER" )
@ -772,7 +775,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
vector<string> parts = SplitWords(params, ' '); vector<string> parts = SplitWords(params, ' ');
if ( parts.size() == 2 ) if ( parts.size() == 2 )
{ {
ConnectionEvent(irc_oper_message, { ConnectionEventFast(irc_oper_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(parts[0].c_str()), new StringVal(parts[0].c_str()),
@ -814,7 +817,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
else else
vl.append(val_mgr->GetEmptyString()); vl.append(val_mgr->GetEmptyString());
ConnectionEvent(irc_kick_message, std::move(vl)); ConnectionEventFast(irc_kick_message, std::move(vl));
} }
else if ( irc_join_message && command == "JOIN" ) else if ( irc_join_message && command == "JOIN" )
@ -862,7 +865,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
Unref(info); Unref(info);
} }
ConnectionEvent(irc_join_message, { ConnectionEventFast(irc_join_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
list, list,
@ -923,7 +926,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
Unref(info); Unref(info);
} }
ConnectionEvent(irc_join_message, { ConnectionEventFast(irc_join_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
list, list,
@ -963,7 +966,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
Unref(idx); Unref(idx);
} }
ConnectionEvent(irc_part_message, { ConnectionEventFast(irc_part_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(nick.c_str()), new StringVal(nick.c_str()),
@ -986,7 +989,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
nickname = prefix.substr(0, pos); nickname = prefix.substr(0, pos);
} }
ConnectionEvent(irc_quit_message, { ConnectionEventFast(irc_quit_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(nickname.c_str()), new StringVal(nickname.c_str()),
@ -1000,7 +1003,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( nick[0] == ':' ) if ( nick[0] == ':' )
nick = nick.substr(1); nick = nick.substr(1);
ConnectionEvent(irc_nick_message, { ConnectionEventFast(irc_nick_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -1025,7 +1028,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( parts.size() > 0 && parts[0].size() > 0 && parts[0][0] == ':' ) if ( parts.size() > 0 && parts[0].size() > 0 && parts[0][0] == ':' )
parts[0] = parts[0].substr(1); parts[0] = parts[0].substr(1);
ConnectionEvent(irc_who_message, { ConnectionEventFast(irc_who_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
parts.size() > 0 ? parts.size() > 0 ?
@ -1055,7 +1058,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
else else
users = parts[0]; users = parts[0];
ConnectionEvent(irc_whois_message, { ConnectionEventFast(irc_whois_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(server.c_str()), new StringVal(server.c_str()),
@ -1068,7 +1071,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( params[0] == ':' ) if ( params[0] == ':' )
params = params.substr(1); params = params.substr(1);
ConnectionEvent(irc_error_message, { ConnectionEventFast(irc_error_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -1084,7 +1087,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( parts[1].size() > 0 && parts[1][0] == ':' ) if ( parts[1].size() > 0 && parts[1][0] == ':' )
parts[1] = parts[1].substr(1); parts[1] = parts[1].substr(1);
ConnectionEvent(irc_invite_message, { ConnectionEventFast(irc_invite_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -1100,7 +1103,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
{ {
if ( params.size() > 0 ) if ( params.size() > 0 )
{ {
ConnectionEvent(irc_mode_message, { ConnectionEventFast(irc_mode_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -1114,7 +1117,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
else if ( irc_password_message && command == "PASS" ) else if ( irc_password_message && command == "PASS" )
{ {
ConnectionEvent(irc_password_message, { ConnectionEventFast(irc_password_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(params.c_str()), new StringVal(params.c_str()),
@ -1136,7 +1139,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
message = message.substr(1); message = message.substr(1);
} }
ConnectionEvent(irc_squit_message, { ConnectionEventFast(irc_squit_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -1150,7 +1153,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
{ {
if ( irc_request ) if ( irc_request )
{ {
ConnectionEvent(irc_request, { ConnectionEventFast(irc_request, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -1164,7 +1167,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
{ {
if ( irc_message ) if ( irc_message )
{ {
ConnectionEvent(irc_message, { ConnectionEventFast(irc_message, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(prefix.c_str()), new StringVal(prefix.c_str()),
@ -1199,7 +1202,8 @@ void IRC_Analyzer::StartTLS()
if ( ssl ) if ( ssl )
AddChildAnalyzer(ssl); AddChildAnalyzer(ssl);
ConnectionEvent(irc_starttls, {BuildConnVal()}); if ( irc_starttls )
ConnectionEventFast(irc_starttls, {BuildConnVal()});
} }
vector<string> IRC_Analyzer::SplitWords(const string input, const char split) vector<string> IRC_Analyzer::SplitWords(const string input, const char split)

View file

@ -289,7 +289,7 @@ void Login_Analyzer::AuthenticationDialog(bool orig, char* line)
{ {
if ( authentication_skipped ) if ( authentication_skipped )
{ {
ConnectionEvent(authentication_skipped, {BuildConnVal()}); ConnectionEventFast(authentication_skipped, {BuildConnVal()});
} }
state = LOGIN_STATE_SKIP; state = LOGIN_STATE_SKIP;
@ -332,7 +332,7 @@ void Login_Analyzer::SetEnv(bool orig, char* name, char* val)
else if ( login_terminal && streq(name, "TERM") ) else if ( login_terminal && streq(name, "TERM") )
{ {
ConnectionEvent(login_terminal, { ConnectionEventFast(login_terminal, {
BuildConnVal(), BuildConnVal(),
new StringVal(val), new StringVal(val),
}); });
@ -340,7 +340,7 @@ void Login_Analyzer::SetEnv(bool orig, char* name, char* val)
else if ( login_display && streq(name, "DISPLAY") ) else if ( login_display && streq(name, "DISPLAY") )
{ {
ConnectionEvent(login_display, { ConnectionEventFast(login_display, {
BuildConnVal(), BuildConnVal(),
new StringVal(val), new StringVal(val),
}); });
@ -348,7 +348,7 @@ void Login_Analyzer::SetEnv(bool orig, char* name, char* val)
else if ( login_prompt && streq(name, "TTYPROMPT") ) else if ( login_prompt && streq(name, "TTYPROMPT") )
{ {
ConnectionEvent(login_prompt, { ConnectionEventFast(login_prompt, {
BuildConnVal(), BuildConnVal(),
new StringVal(val), new StringVal(val),
}); });
@ -425,7 +425,7 @@ void Login_Analyzer::LoginEvent(EventHandlerPtr f, const char* line,
Val* password = HaveTypeahead() ? Val* password = HaveTypeahead() ?
PopUserTextVal() : new StringVal("<none>"); PopUserTextVal() : new StringVal("<none>");
ConnectionEvent(f, { ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
username->Ref(), username->Ref(),
client_name ? client_name->Ref() : val_mgr->GetEmptyString(), client_name ? client_name->Ref() : val_mgr->GetEmptyString(),
@ -444,7 +444,10 @@ const char* Login_Analyzer::GetUsername(const char* line) const
void Login_Analyzer::LineEvent(EventHandlerPtr f, const char* line) void Login_Analyzer::LineEvent(EventHandlerPtr f, const char* line)
{ {
ConnectionEvent(f, { if ( ! f )
return;
ConnectionEventFast(f, {
BuildConnVal(), BuildConnVal(),
new StringVal(line), new StringVal(line),
}); });
@ -457,7 +460,7 @@ void Login_Analyzer::Confused(const char* msg, const char* line)
if ( login_confused ) if ( login_confused )
{ {
ConnectionEvent(login_confused, { ConnectionEventFast(login_confused, {
BuildConnVal(), BuildConnVal(),
new StringVal(msg), new StringVal(msg),
new StringVal(line), new StringVal(line),
@ -483,7 +486,7 @@ void Login_Analyzer::ConfusionText(const char* line)
{ {
if ( login_confused_text ) if ( login_confused_text )
{ {
ConnectionEvent(login_confused_text, { ConnectionEventFast(login_confused_text, {
BuildConnVal(), BuildConnVal(),
new StringVal(line), new StringVal(line),
}); });

View file

@ -461,7 +461,7 @@ void NVT_Analyzer::SetTerminal(const u_char* terminal, int len)
{ {
if ( login_terminal ) if ( login_terminal )
{ {
ConnectionEvent(login_terminal, { ConnectionEventFast(login_terminal, {
BuildConnVal(), BuildConnVal(),
new StringVal(new BroString(terminal, len, 0)), new StringVal(new BroString(terminal, len, 0)),
}); });

View file

@ -183,11 +183,11 @@ void Rsh_Analyzer::DeliverStream(int len, const u_char* data, bool orig)
else else
vl.append(val_mgr->GetFalse()); vl.append(val_mgr->GetFalse());
ConnectionEvent(rsh_request, std::move(vl)); ConnectionEventFast(rsh_request, std::move(vl));
} }
else else
ConnectionEvent(rsh_reply, std::move(vl)); ConnectionEventFast(rsh_reply, std::move(vl));
} }
void Rsh_Analyzer::ClientUserName(const char* s) void Rsh_Analyzer::ClientUserName(const char* s)

View file

@ -244,7 +244,7 @@ void Rlogin_Analyzer::TerminalType(const char* s)
{ {
if ( login_terminal ) if ( login_terminal )
{ {
ConnectionEvent(login_terminal, { ConnectionEventFast(login_terminal, {
BuildConnVal(), BuildConnVal(),
new StringVal(s), new StringVal(s),
}); });

View file

@ -1358,7 +1358,7 @@ void MIME_Mail::Done()
hash_final(md5_hash, digest); hash_final(md5_hash, digest);
md5_hash = nullptr; md5_hash = nullptr;
analyzer->ConnectionEvent(mime_content_hash, { analyzer->ConnectionEventFast(mime_content_hash, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(content_hash_length), val_mgr->GetCount(content_hash_length),
new StringVal(new BroString(1, digest, 16)), new StringVal(new BroString(1, digest, 16)),
@ -1386,7 +1386,7 @@ void MIME_Mail::BeginEntity(MIME_Entity* /* entity */)
cur_entity_id.clear(); cur_entity_id.clear();
if ( mime_begin_entity ) if ( mime_begin_entity )
analyzer->ConnectionEvent(mime_begin_entity, {analyzer->BuildConnVal()}); analyzer->ConnectionEventFast(mime_begin_entity, {analyzer->BuildConnVal()});
buffer_start = data_start = 0; buffer_start = data_start = 0;
ASSERT(entity_content.size() == 0); ASSERT(entity_content.size() == 0);
@ -1398,8 +1398,7 @@ void MIME_Mail::EndEntity(MIME_Entity* /* entity */)
{ {
BroString* s = concatenate(entity_content); BroString* s = concatenate(entity_content);
analyzer->ConnectionEventFast(mime_entity_data, {
analyzer->ConnectionEvent(mime_entity_data, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(s->Len()), val_mgr->GetCount(s->Len()),
new StringVal(s), new StringVal(s),
@ -1412,7 +1411,7 @@ void MIME_Mail::EndEntity(MIME_Entity* /* entity */)
} }
if ( mime_end_entity ) if ( mime_end_entity )
analyzer->ConnectionEvent(mime_end_entity, {analyzer->BuildConnVal()}); analyzer->ConnectionEventFast(mime_end_entity, {analyzer->BuildConnVal()});
file_mgr->EndOfFile(analyzer->GetAnalyzerTag(), analyzer->Conn()); file_mgr->EndOfFile(analyzer->GetAnalyzerTag(), analyzer->Conn());
cur_entity_id.clear(); cur_entity_id.clear();
@ -1422,7 +1421,7 @@ void MIME_Mail::SubmitHeader(MIME_Header* h)
{ {
if ( mime_one_header ) if ( mime_one_header )
{ {
analyzer->ConnectionEvent(mime_one_header, { analyzer->ConnectionEventFast(mime_one_header, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
BuildHeaderVal(h), BuildHeaderVal(h),
}); });
@ -1433,7 +1432,7 @@ void MIME_Mail::SubmitAllHeaders(MIME_HeaderList& hlist)
{ {
if ( mime_all_headers ) if ( mime_all_headers )
{ {
analyzer->ConnectionEvent(mime_all_headers, { analyzer->ConnectionEventFast(mime_all_headers, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
BuildHeaderTable(hlist), BuildHeaderTable(hlist),
}); });
@ -1470,7 +1469,7 @@ void MIME_Mail::SubmitData(int len, const char* buf)
const char* data = (char*) data_buffer->Bytes() + data_start; const char* data = (char*) data_buffer->Bytes() + data_start;
int data_len = (buf + len) - data; int data_len = (buf + len) - data;
analyzer->ConnectionEvent(mime_segment_data, { analyzer->ConnectionEventFast(mime_segment_data, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(data_len), val_mgr->GetCount(data_len),
new StringVal(data_len, data), new StringVal(data_len, data),
@ -1517,7 +1516,7 @@ void MIME_Mail::SubmitAllData()
BroString* s = concatenate(all_content); BroString* s = concatenate(all_content);
delete_strings(all_content); delete_strings(all_content);
analyzer->ConnectionEvent(mime_all_data, { analyzer->ConnectionEventFast(mime_all_data, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(s->Len()), val_mgr->GetCount(s->Len()),
new StringVal(s), new StringVal(s),
@ -1546,7 +1545,7 @@ void MIME_Mail::SubmitEvent(int event_type, const char* detail)
if ( mime_event ) if ( mime_event )
{ {
analyzer->ConnectionEvent(mime_event, { analyzer->ConnectionEventFast(mime_event, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
new StringVal(category), new StringVal(category),
new StringVal(detail), new StringVal(detail),

View file

@ -63,7 +63,7 @@ void NCP_Session::DeliverFrame(const binpac::NCP::ncp_frame* frame)
{ {
if ( frame->is_orig() ) if ( frame->is_orig() )
{ {
analyzer->ConnectionEvent(f, { analyzer->ConnectionEventFast(f, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(frame->frame_type()), val_mgr->GetCount(frame->frame_type()),
val_mgr->GetCount(frame->body_length()), val_mgr->GetCount(frame->body_length()),
@ -72,7 +72,7 @@ void NCP_Session::DeliverFrame(const binpac::NCP::ncp_frame* frame)
} }
else else
{ {
analyzer->ConnectionEvent(f, { analyzer->ConnectionEventFast(f, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(frame->frame_type()), val_mgr->GetCount(frame->frame_type()),
val_mgr->GetCount(frame->body_length()), val_mgr->GetCount(frame->body_length()),

View file

@ -58,7 +58,7 @@ int NetbiosSSN_Interpreter::ParseMessage(unsigned int type, unsigned int flags,
{ {
if ( netbios_session_message ) if ( netbios_session_message )
{ {
analyzer->ConnectionEvent(netbios_session_message, { analyzer->ConnectionEventFast(netbios_session_message, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_query), val_mgr->GetBool(is_query),
val_mgr->GetCount(type), val_mgr->GetCount(type),
@ -330,14 +330,14 @@ void NetbiosSSN_Interpreter::Event(EventHandlerPtr event, const u_char* data,
if ( is_orig >= 0 ) if ( is_orig >= 0 )
{ {
analyzer->ConnectionEvent(event, { analyzer->ConnectionEventFast(event, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
new StringVal(new BroString(data, len, 0)), new StringVal(new BroString(data, len, 0)),
}); });
} }
else else
analyzer->ConnectionEvent(event, { analyzer->ConnectionEventFast(event, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
new StringVal(new BroString(data, len, 0)), new StringVal(new BroString(data, len, 0)),
}); });

View file

@ -94,6 +94,9 @@ refine connection NTLM_Conn += {
function proc_ntlm_negotiate(val: NTLM_Negotiate): bool function proc_ntlm_negotiate(val: NTLM_Negotiate): bool
%{ %{
if ( ! ntlm_negotiate )
return true;
RecordVal* result = new RecordVal(BifType::Record::NTLM::Negotiate); RecordVal* result = new RecordVal(BifType::Record::NTLM::Negotiate);
result->Assign(0, build_negotiate_flag_record(${val.flags})); result->Assign(0, build_negotiate_flag_record(${val.flags}));
@ -115,6 +118,9 @@ refine connection NTLM_Conn += {
function proc_ntlm_challenge(val: NTLM_Challenge): bool function proc_ntlm_challenge(val: NTLM_Challenge): bool
%{ %{
if ( ! ntlm_challenge )
return true;
RecordVal* result = new RecordVal(BifType::Record::NTLM::Challenge); RecordVal* result = new RecordVal(BifType::Record::NTLM::Challenge);
result->Assign(0, build_negotiate_flag_record(${val.flags})); result->Assign(0, build_negotiate_flag_record(${val.flags}));
@ -136,6 +142,9 @@ refine connection NTLM_Conn += {
function proc_ntlm_authenticate(val: NTLM_Authenticate): bool function proc_ntlm_authenticate(val: NTLM_Authenticate): bool
%{ %{
if ( ! ntlm_authenticate )
return true;
RecordVal* result = new RecordVal(BifType::Record::NTLM::Authenticate); RecordVal* result = new RecordVal(BifType::Record::NTLM::Authenticate);
result->Assign(0, build_negotiate_flag_record(${val.flags})); result->Assign(0, build_negotiate_flag_record(${val.flags}));

View file

@ -62,6 +62,9 @@ void NTP_Analyzer::Message(const u_char* data, int len)
len -= sizeof *ntp_data; len -= sizeof *ntp_data;
data += sizeof *ntp_data; data += sizeof *ntp_data;
if ( ! ntp_message )
return;
RecordVal* msg = new RecordVal(ntp_msg); RecordVal* msg = new RecordVal(ntp_msg);
unsigned int code = ntp_data->status & 0x7; unsigned int code = ntp_data->status & 0x7;
@ -78,7 +81,7 @@ void NTP_Analyzer::Message(const u_char* data, int len)
msg->Assign(9, new Val(LongFloat(ntp_data->rec), TYPE_TIME)); msg->Assign(9, new Val(LongFloat(ntp_data->rec), TYPE_TIME));
msg->Assign(10, new Val(LongFloat(ntp_data->xmt), TYPE_TIME)); msg->Assign(10, new Val(LongFloat(ntp_data->xmt), TYPE_TIME));
ConnectionEvent(ntp_message, { ConnectionEventFast(ntp_message, {
BuildConnVal(), BuildConnVal(),
msg, msg,
new StringVal(new BroString(data, len, 0)), new StringVal(new BroString(data, len, 0)),

View file

@ -833,7 +833,8 @@ void POP3_Analyzer::StartTLS()
if ( ssl ) if ( ssl )
AddChildAnalyzer(ssl); AddChildAnalyzer(ssl);
ConnectionEvent(pop3_starttls, {BuildConnVal()}); if ( pop3_starttls )
ConnectionEventFast(pop3_starttls, {BuildConnVal()});
} }
void POP3_Analyzer::AuthSuccessfull() void POP3_Analyzer::AuthSuccessfull()
@ -932,5 +933,5 @@ void POP3_Analyzer::POP3Event(EventHandlerPtr event, bool is_orig,
if ( arg2 ) if ( arg2 )
vl.append(new StringVal(arg2)); vl.append(new StringVal(arg2));
ConnectionEvent(event, std::move(vl)); ConnectionEventFast(event, std::move(vl));
} }

View file

@ -1,6 +1,7 @@
refine flow RFB_Flow += { refine flow RFB_Flow += {
function proc_rfb_message(msg: RFB_PDU): bool function proc_rfb_message(msg: RFB_PDU): bool
%{ %{
if ( rfb_event )
BifEvent::generate_rfb_event(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn()); BifEvent::generate_rfb_event(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn());
return true; return true;
%} %}
@ -9,12 +10,14 @@ refine flow RFB_Flow += {
%{ %{
if (client) if (client)
{ {
if ( rfb_client_version )
BifEvent::generate_rfb_client_version(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), bytestring_to_val(major), bytestring_to_val(minor)); BifEvent::generate_rfb_client_version(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), bytestring_to_val(major), bytestring_to_val(minor));
connection()->bro_analyzer()->ProtocolConfirmation(); connection()->bro_analyzer()->ProtocolConfirmation();
} }
else else
{ {
if ( rfb_server_version )
BifEvent::generate_rfb_server_version(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), bytestring_to_val(major), bytestring_to_val(minor)); BifEvent::generate_rfb_server_version(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), bytestring_to_val(major), bytestring_to_val(minor));
} }
return true; return true;
@ -22,30 +25,35 @@ refine flow RFB_Flow += {
function proc_rfb_share_flag(shared: bool) : bool function proc_rfb_share_flag(shared: bool) : bool
%{ %{
if ( rfb_share_flag )
BifEvent::generate_rfb_share_flag(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), shared); BifEvent::generate_rfb_share_flag(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), shared);
return true; return true;
%} %}
function proc_security_types(msg: RFBSecurityTypes) : bool function proc_security_types(msg: RFBSecurityTypes) : bool
%{ %{
if ( rfb_authentication_type )
BifEvent::generate_rfb_authentication_type(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), ${msg.sectype}); BifEvent::generate_rfb_authentication_type(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), ${msg.sectype});
return true; return true;
%} %}
function proc_security_types37(msg: RFBAuthTypeSelected) : bool function proc_security_types37(msg: RFBAuthTypeSelected) : bool
%{ %{
if ( rfb_authentication_type )
BifEvent::generate_rfb_authentication_type(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), ${msg.type}); BifEvent::generate_rfb_authentication_type(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), ${msg.type});
return true; return true;
%} %}
function proc_handle_server_params(msg:RFBServerInit) : bool function proc_handle_server_params(msg:RFBServerInit) : bool
%{ %{
if ( rfb_server_parameters )
BifEvent::generate_rfb_server_parameters(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), bytestring_to_val(${msg.name}), ${msg.width}, ${msg.height}); BifEvent::generate_rfb_server_parameters(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), bytestring_to_val(${msg.name}), ${msg.width}, ${msg.height});
return true; return true;
%} %}
function proc_handle_security_result(result : uint32) : bool function proc_handle_security_result(result : uint32) : bool
%{ %{
if ( rfb_auth_result )
BifEvent::generate_rfb_auth_result(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), result); BifEvent::generate_rfb_auth_result(connection()->bro_analyzer(), connection()->bro_analyzer()->Conn(), result);
return true; return true;
%} %}

View file

@ -95,7 +95,7 @@ int MOUNT_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status
{ {
auto vl = event_common_vl(c, rpc_status, mount_status, auto vl = event_common_vl(c, rpc_status, mount_status,
start_time, last_time, reply_len, 0); start_time, last_time, reply_len, 0);
analyzer->ConnectionEvent(mount_reply_status, std::move(vl)); analyzer->ConnectionEventFast(mount_reply_status, std::move(vl));
} }
if ( ! rpc_success ) if ( ! rpc_success )
@ -173,7 +173,7 @@ int MOUNT_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status
if ( reply ) if ( reply )
vl.append(reply); vl.append(reply);
analyzer->ConnectionEvent(event, std::move(vl)); analyzer->ConnectionEventFast(event, std::move(vl));
} }
else else
Unref(reply); Unref(reply);

View file

@ -149,7 +149,7 @@ int NFS_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status,
{ {
auto vl = event_common_vl(c, rpc_status, nfs_status, auto vl = event_common_vl(c, rpc_status, nfs_status,
start_time, last_time, reply_len, 0); start_time, last_time, reply_len, 0);
analyzer->ConnectionEvent(nfs_reply_status, std::move(vl)); analyzer->ConnectionEventFast(nfs_reply_status, std::move(vl));
} }
if ( ! rpc_success ) if ( ! rpc_success )
@ -285,7 +285,7 @@ int NFS_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status,
if ( reply ) if ( reply )
vl.append(reply); vl.append(reply);
analyzer->ConnectionEvent(event, std::move(vl)); analyzer->ConnectionEventFast(event, std::move(vl));
} }
else else
Unref(reply); Unref(reply);

View file

@ -261,7 +261,7 @@ uint32 PortmapperInterp::CheckPort(uint32 port)
{ {
if ( pm_bad_port ) if ( pm_bad_port )
{ {
analyzer->ConnectionEvent(pm_bad_port, { analyzer->ConnectionEventFast(pm_bad_port, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(port), val_mgr->GetCount(port),
}); });
@ -300,7 +300,7 @@ void PortmapperInterp::Event(EventHandlerPtr f, Val* request, BifEnum::rpc_statu
vl.append(request); vl.append(request);
} }
analyzer->ConnectionEvent(f, std::move(vl)); analyzer->ConnectionEventFast(f, std::move(vl));
} }
Portmapper_Analyzer::Portmapper_Analyzer(Connection* conn) Portmapper_Analyzer::Portmapper_Analyzer(Connection* conn)

View file

@ -330,7 +330,7 @@ void RPC_Interpreter::Event_RPC_Dialogue(RPC_CallInfo* c, BifEnum::rpc_status st
{ {
if ( rpc_dialogue ) if ( rpc_dialogue )
{ {
analyzer->ConnectionEvent(rpc_dialogue, { analyzer->ConnectionEventFast(rpc_dialogue, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(c->Program()), val_mgr->GetCount(c->Program()),
val_mgr->GetCount(c->Version()), val_mgr->GetCount(c->Version()),
@ -347,7 +347,7 @@ void RPC_Interpreter::Event_RPC_Call(RPC_CallInfo* c)
{ {
if ( rpc_call ) if ( rpc_call )
{ {
analyzer->ConnectionEvent(rpc_call, { analyzer->ConnectionEventFast(rpc_call, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(c->XID()), val_mgr->GetCount(c->XID()),
val_mgr->GetCount(c->Program()), val_mgr->GetCount(c->Program()),
@ -362,7 +362,7 @@ void RPC_Interpreter::Event_RPC_Reply(uint32_t xid, BifEnum::rpc_status status,
{ {
if ( rpc_reply ) if ( rpc_reply )
{ {
analyzer->ConnectionEvent(rpc_reply, { analyzer->ConnectionEventFast(rpc_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(xid), val_mgr->GetCount(xid),
BifType::Enum::rpc_status->GetVal(status), BifType::Enum::rpc_status->GetVal(status),

View file

@ -6,6 +6,8 @@ refine connection SMB_Conn += {
BifConst::SMB::pipe_filenames->AsTable()->Lookup(filename->CheckString()) ) BifConst::SMB::pipe_filenames->AsTable()->Lookup(filename->CheckString()) )
{ {
set_tree_is_pipe(${header.tid}); set_tree_is_pipe(${header.tid});
if ( smb_pipe_connect_heuristic )
BifEvent::generate_smb_pipe_connect_heuristic(bro_analyzer(), BifEvent::generate_smb_pipe_connect_heuristic(bro_analyzer(),
bro_analyzer()->Conn()); bro_analyzer()->Conn());
} }

View file

@ -66,6 +66,7 @@ refine connection SMB_Conn += {
} }
else else
{ {
if ( smb1_error )
BifEvent::generate_smb1_error(bro_analyzer(), BifEvent::generate_smb1_error(bro_analyzer(),
bro_analyzer()->Conn(), bro_analyzer()->Conn(),
BuildHeaderVal(h), is_orig); BuildHeaderVal(h), is_orig);

View file

@ -7,6 +7,8 @@ refine connection SMB_Conn += {
BifConst::SMB::pipe_filenames->AsTable()->Lookup(filename->CheckString()) ) BifConst::SMB::pipe_filenames->AsTable()->Lookup(filename->CheckString()) )
{ {
set_tree_is_pipe(${h.tree_id}); set_tree_is_pipe(${h.tree_id});
if ( smb_pipe_connect_heuristic )
BifEvent::generate_smb_pipe_connect_heuristic(bro_analyzer(), BifEvent::generate_smb_pipe_connect_heuristic(bro_analyzer(),
bro_analyzer()->Conn()); bro_analyzer()->Conn());
} }

View file

@ -220,7 +220,7 @@ void SMTP_Analyzer::ProcessLine(int length, const char* line, bool orig)
if ( smtp_data && ! skip_data ) if ( smtp_data && ! skip_data )
{ {
ConnectionEvent(smtp_data, { ConnectionEventFast(smtp_data, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
new StringVal(data_len, line), new StringVal(data_len, line),
@ -350,7 +350,7 @@ void SMTP_Analyzer::ProcessLine(int length, const char* line, bool orig)
break; break;
} }
ConnectionEvent(smtp_reply, { ConnectionEventFast(smtp_reply, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig), val_mgr->GetBool(orig),
val_mgr->GetCount(reply_code), val_mgr->GetCount(reply_code),
@ -410,7 +410,8 @@ void SMTP_Analyzer::StartTLS()
if ( ssl ) if ( ssl )
AddChildAnalyzer(ssl); AddChildAnalyzer(ssl);
ConnectionEvent(smtp_starttls, {BuildConnVal()}); if ( smtp_starttls )
ConnectionEventFast(smtp_starttls, {BuildConnVal()});
} }
@ -852,7 +853,9 @@ void SMTP_Analyzer::RequestEvent(int cmd_len, const char* cmd,
int arg_len, const char* arg) int arg_len, const char* arg)
{ {
ProtocolConfirmation(); ProtocolConfirmation();
ConnectionEvent(smtp_request, {
if ( smtp_request )
ConnectionEventFast(smtp_request, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(orig_is_sender), val_mgr->GetBool(orig_is_sender),
(new StringVal(cmd_len, cmd))->ToUpper(), (new StringVal(cmd_len, cmd))->ToUpper(),
@ -872,7 +875,7 @@ void SMTP_Analyzer::Unexpected(const int is_sender, const char* msg,
if ( ! orig_is_sender ) if ( ! orig_is_sender )
is_orig = ! is_orig; is_orig = ! is_orig;
ConnectionEvent(smtp_unexpected, { ConnectionEventFast(smtp_unexpected, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
new StringVal(msg), new StringVal(msg),

View file

@ -22,8 +22,11 @@ refine connection SOCKS_Conn += {
function socks4_request(request: SOCKS4_Request): bool function socks4_request(request: SOCKS4_Request): bool
%{ %{
if ( socks_request )
{
RecordVal* sa = new RecordVal(socks_address); RecordVal* sa = new RecordVal(socks_address);
sa->Assign(0, new AddrVal(htonl(${request.addr}))); sa->Assign(0, new AddrVal(htonl(${request.addr})));
if ( ${request.v4a} ) if ( ${request.v4a} )
sa->Assign(1, array_to_string(${request.name})); sa->Assign(1, array_to_string(${request.name}));
@ -34,6 +37,7 @@ refine connection SOCKS_Conn += {
sa, sa,
val_mgr->GetPort(${request.port}, TRANSPORT_TCP), val_mgr->GetPort(${request.port}, TRANSPORT_TCP),
array_to_string(${request.user})); array_to_string(${request.user}));
}
static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(true); static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(true);
@ -42,6 +46,8 @@ refine connection SOCKS_Conn += {
function socks4_reply(reply: SOCKS4_Reply): bool function socks4_reply(reply: SOCKS4_Reply): bool
%{ %{
if ( socks_reply )
{
RecordVal* sa = new RecordVal(socks_address); RecordVal* sa = new RecordVal(socks_address);
sa->Assign(0, new AddrVal(htonl(${reply.addr}))); sa->Assign(0, new AddrVal(htonl(${reply.addr})));
@ -51,6 +57,7 @@ refine connection SOCKS_Conn += {
${reply.status}, ${reply.status},
sa, sa,
val_mgr->GetPort(${reply.port}, TRANSPORT_TCP)); val_mgr->GetPort(${reply.port}, TRANSPORT_TCP));
}
bro_analyzer()->ProtocolConfirmation(); bro_analyzer()->ProtocolConfirmation();
static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(false); static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(false);
@ -97,6 +104,7 @@ refine connection SOCKS_Conn += {
return false; return false;
} }
if ( socks_request )
BifEvent::generate_socks_request(bro_analyzer(), BifEvent::generate_socks_request(bro_analyzer(),
bro_analyzer()->Conn(), bro_analyzer()->Conn(),
5, 5,
@ -104,6 +112,8 @@ refine connection SOCKS_Conn += {
sa, sa,
val_mgr->GetPort(${request.port}, TRANSPORT_TCP), val_mgr->GetPort(${request.port}, TRANSPORT_TCP),
val_mgr->GetEmptyString()); val_mgr->GetEmptyString());
else
Unref(sa);
static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(true); static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(true);
@ -136,12 +146,15 @@ refine connection SOCKS_Conn += {
return false; return false;
} }
if ( socks_reply )
BifEvent::generate_socks_reply(bro_analyzer(), BifEvent::generate_socks_reply(bro_analyzer(),
bro_analyzer()->Conn(), bro_analyzer()->Conn(),
5, 5,
${reply.reply}, ${reply.reply},
sa, sa,
val_mgr->GetPort(${reply.port}, TRANSPORT_TCP)); val_mgr->GetPort(${reply.port}, TRANSPORT_TCP));
else
Unref(sa);
bro_analyzer()->ProtocolConfirmation(); bro_analyzer()->ProtocolConfirmation();
static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(false); static_cast<analyzer::socks::SOCKS_Analyzer*>(bro_analyzer())->EndpointDone(false);
@ -150,6 +163,9 @@ refine connection SOCKS_Conn += {
function socks5_auth_request_userpass(request: SOCKS5_Auth_Request_UserPass_v1): bool function socks5_auth_request_userpass(request: SOCKS5_Auth_Request_UserPass_v1): bool
%{ %{
if ( ! socks_login_userpass_request )
return true;
StringVal* user = new StringVal(${request.username}.length(), (const char*) ${request.username}.begin()); StringVal* user = new StringVal(${request.username}.length(), (const char*) ${request.username}.begin());
StringVal* pass = new StringVal(${request.password}.length(), (const char*) ${request.password}.begin()); StringVal* pass = new StringVal(${request.password}.length(), (const char*) ${request.password}.begin());
@ -173,6 +189,7 @@ refine connection SOCKS_Conn += {
function socks5_auth_reply_userpass(reply: SOCKS5_Auth_Reply_UserPass_v1): bool function socks5_auth_reply_userpass(reply: SOCKS5_Auth_Reply_UserPass_v1): bool
%{ %{
if ( socks_login_userpass_reply )
BifEvent::generate_socks_login_userpass_reply(bro_analyzer(), BifEvent::generate_socks_login_userpass_reply(bro_analyzer(),
bro_analyzer()->Conn(), bro_analyzer()->Conn(),
${reply.code}); ${reply.code});

View file

@ -17,8 +17,8 @@ refine connection SSL_Conn += {
function proc_v2_client_master_key(rec: SSLRecord, cipher_kind: int) : bool function proc_v2_client_master_key(rec: SSLRecord, cipher_kind: int) : bool
%{ %{
BifEvent::generate_ssl_established(bro_analyzer(), if ( ssl_established )
bro_analyzer()->Conn()); BifEvent::generate_ssl_established(bro_analyzer(), bro_analyzer()->Conn());
return true; return true;
%} %}

View file

@ -31,6 +31,7 @@ refine connection SSL_Conn += {
function proc_alert(rec: SSLRecord, level : int, desc : int) : bool function proc_alert(rec: SSLRecord, level : int, desc : int) : bool
%{ %{
if ( ssl_alert )
BifEvent::generate_ssl_alert(bro_analyzer(), bro_analyzer()->Conn(), BifEvent::generate_ssl_alert(bro_analyzer(), bro_analyzer()->Conn(),
${rec.is_orig}, level, desc); ${rec.is_orig}, level, desc);
return true; return true;
@ -50,8 +51,8 @@ refine connection SSL_Conn += {
established_ == false ) established_ == false )
{ {
established_ = true; established_ = true;
BifEvent::generate_ssl_established(bro_analyzer(), if ( ssl_established )
bro_analyzer()->Conn()); BifEvent::generate_ssl_established(bro_analyzer(), bro_analyzer()->Conn());
} }
if ( ssl_encrypted_data ) if ( ssl_encrypted_data )
@ -72,6 +73,7 @@ refine connection SSL_Conn += {
function proc_heartbeat(rec : SSLRecord, type: uint8, payload_length: uint16, data: bytestring) : bool function proc_heartbeat(rec : SSLRecord, type: uint8, payload_length: uint16, data: bytestring) : bool
%{ %{
if ( ssl_heartbeat )
BifEvent::generate_ssl_heartbeat(bro_analyzer(), BifEvent::generate_ssl_heartbeat(bro_analyzer(),
bro_analyzer()->Conn(), ${rec.is_orig}, ${rec.length}, type, payload_length, bro_analyzer()->Conn(), ${rec.is_orig}, ${rec.length}, type, payload_length,
new StringVal(data.length(), (const char*) data.data())); new StringVal(data.length(), (const char*) data.data()));
@ -93,6 +95,7 @@ refine connection SSL_Conn += {
function proc_ccs(rec: SSLRecord) : bool function proc_ccs(rec: SSLRecord) : bool
%{ %{
if ( ssl_change_cipher_spec )
BifEvent::generate_ssl_change_cipher_spec(bro_analyzer(), BifEvent::generate_ssl_change_cipher_spec(bro_analyzer(),
bro_analyzer()->Conn(), ${rec.is_orig}); bro_analyzer()->Conn(), ${rec.is_orig});

View file

@ -72,6 +72,9 @@ refine connection Handshake_Conn += {
function proc_ec_point_formats(rec: HandshakeRecord, point_format_list: uint8[]) : bool function proc_ec_point_formats(rec: HandshakeRecord, point_format_list: uint8[]) : bool
%{ %{
if ( ! ssl_extension_ec_point_formats )
return true;
VectorVal* points = new VectorVal(internal_type("index_vec")->AsVectorType()); VectorVal* points = new VectorVal(internal_type("index_vec")->AsVectorType());
if ( point_format_list ) if ( point_format_list )
@ -88,6 +91,9 @@ refine connection Handshake_Conn += {
function proc_elliptic_curves(rec: HandshakeRecord, list: uint16[]) : bool function proc_elliptic_curves(rec: HandshakeRecord, list: uint16[]) : bool
%{ %{
if ( ! ssl_extension_elliptic_curves )
return true;
VectorVal* curves = new VectorVal(internal_type("index_vec")->AsVectorType()); VectorVal* curves = new VectorVal(internal_type("index_vec")->AsVectorType());
if ( list ) if ( list )
@ -104,6 +110,9 @@ refine connection Handshake_Conn += {
function proc_client_key_share(rec: HandshakeRecord, keyshare: KeyShareEntry[]) : bool function proc_client_key_share(rec: HandshakeRecord, keyshare: KeyShareEntry[]) : bool
%{ %{
if ( ! ssl_extension_key_share )
return true;
VectorVal* nglist = new VectorVal(internal_type("index_vec")->AsVectorType()); VectorVal* nglist = new VectorVal(internal_type("index_vec")->AsVectorType());
if ( keyshare ) if ( keyshare )
@ -113,11 +122,15 @@ refine connection Handshake_Conn += {
} }
BifEvent::generate_ssl_extension_key_share(bro_analyzer(), bro_analyzer()->Conn(), ${rec.is_orig}, nglist); BifEvent::generate_ssl_extension_key_share(bro_analyzer(), bro_analyzer()->Conn(), ${rec.is_orig}, nglist);
return true; return true;
%} %}
function proc_server_key_share(rec: HandshakeRecord, keyshare: KeyShareEntry) : bool function proc_server_key_share(rec: HandshakeRecord, keyshare: KeyShareEntry) : bool
%{ %{
if ( ! ssl_extension_key_share )
return true;
VectorVal* nglist = new VectorVal(internal_type("index_vec")->AsVectorType()); VectorVal* nglist = new VectorVal(internal_type("index_vec")->AsVectorType());
nglist->Assign(0u, val_mgr->GetCount(keyshare->namedgroup())); nglist->Assign(0u, val_mgr->GetCount(keyshare->namedgroup()));
@ -127,6 +140,9 @@ refine connection Handshake_Conn += {
function proc_signature_algorithm(rec: HandshakeRecord, supported_signature_algorithms: SignatureAndHashAlgorithm[]) : bool function proc_signature_algorithm(rec: HandshakeRecord, supported_signature_algorithms: SignatureAndHashAlgorithm[]) : bool
%{ %{
if ( ! ssl_extension_signature_algorithm )
return true;
VectorVal* slist = new VectorVal(internal_type("signature_and_hashalgorithm_vec")->AsVectorType()); VectorVal* slist = new VectorVal(internal_type("signature_and_hashalgorithm_vec")->AsVectorType());
if ( supported_signature_algorithms ) if ( supported_signature_algorithms )
@ -147,6 +163,9 @@ refine connection Handshake_Conn += {
function proc_apnl(rec: HandshakeRecord, protocols: ProtocolName[]) : bool function proc_apnl(rec: HandshakeRecord, protocols: ProtocolName[]) : bool
%{ %{
if ( ! ssl_extension_application_layer_protocol_negotiation )
return true;
VectorVal* plist = new VectorVal(internal_type("string_vec")->AsVectorType()); VectorVal* plist = new VectorVal(internal_type("string_vec")->AsVectorType());
if ( protocols ) if ( protocols )
@ -183,14 +202,20 @@ refine connection Handshake_Conn += {
} }
} }
if ( ssl_extension_server_name )
BifEvent::generate_ssl_extension_server_name(bro_analyzer(), bro_analyzer()->Conn(), BifEvent::generate_ssl_extension_server_name(bro_analyzer(), bro_analyzer()->Conn(),
${rec.is_orig}, servers); ${rec.is_orig}, servers);
else
Unref(servers);
return true; return true;
%} %}
function proc_supported_versions(rec: HandshakeRecord, versions_list: uint16[]) : bool function proc_supported_versions(rec: HandshakeRecord, versions_list: uint16[]) : bool
%{ %{
if ( ! ssl_extension_supported_versions )
return true;
VectorVal* versions = new VectorVal(internal_type("index_vec")->AsVectorType()); VectorVal* versions = new VectorVal(internal_type("index_vec")->AsVectorType());
if ( versions_list ) if ( versions_list )
@ -207,6 +232,9 @@ refine connection Handshake_Conn += {
function proc_one_supported_version(rec: HandshakeRecord, version: uint16) : bool function proc_one_supported_version(rec: HandshakeRecord, version: uint16) : bool
%{ %{
if ( ! ssl_extension_supported_versions )
return true;
VectorVal* versions = new VectorVal(internal_type("index_vec")->AsVectorType()); VectorVal* versions = new VectorVal(internal_type("index_vec")->AsVectorType());
versions->Assign(0u, val_mgr->GetCount(version)); versions->Assign(0u, val_mgr->GetCount(version));
@ -218,6 +246,9 @@ refine connection Handshake_Conn += {
function proc_psk_key_exchange_modes(rec: HandshakeRecord, mode_list: uint8[]) : bool function proc_psk_key_exchange_modes(rec: HandshakeRecord, mode_list: uint8[]) : bool
%{ %{
if ( ! ssl_extension_psk_key_exchange_modes )
return true;
VectorVal* modes = new VectorVal(internal_type("index_vec")->AsVectorType()); VectorVal* modes = new VectorVal(internal_type("index_vec")->AsVectorType());
if ( mode_list ) if ( mode_list )
@ -272,10 +303,11 @@ refine connection Handshake_Conn += {
response.length(), bro_analyzer()->GetAnalyzerTag(), response.length(), bro_analyzer()->GetAnalyzerTag(),
bro_analyzer()->Conn(), false, file_id, "application/ocsp-response"); bro_analyzer()->Conn(), false, file_id, "application/ocsp-response");
if ( ssl_stapled_ocsp )
BifEvent::generate_ssl_stapled_ocsp(bro_analyzer(), BifEvent::generate_ssl_stapled_ocsp(bro_analyzer(),
bro_analyzer()->Conn(), ${rec.is_orig}, bro_analyzer()->Conn(),
new StringVal(response.length(), ${rec.is_orig},
(const char*) response.data())); new StringVal(response.length(), (const char*) response.data()));
file_mgr->EndOfFile(file_id); file_mgr->EndOfFile(file_id);
} }
@ -288,11 +320,16 @@ refine connection Handshake_Conn += {
if ( ${kex.curve_type} != NAMED_CURVE ) if ( ${kex.curve_type} != NAMED_CURVE )
return true; return true;
if ( ssl_server_curve )
BifEvent::generate_ssl_server_curve(bro_analyzer(), BifEvent::generate_ssl_server_curve(bro_analyzer(),
bro_analyzer()->Conn(), ${kex.params.curve}); bro_analyzer()->Conn(), ${kex.params.curve});
if ( ssl_ecdh_server_params )
BifEvent::generate_ssl_ecdh_server_params(bro_analyzer(), BifEvent::generate_ssl_ecdh_server_params(bro_analyzer(),
bro_analyzer()->Conn(), ${kex.params.curve}, new StringVal(${kex.params.point}.length(), (const char*)${kex.params.point}.data())); bro_analyzer()->Conn(), ${kex.params.curve}, new StringVal(${kex.params.point}.length(), (const char*)${kex.params.point}.data()));
if ( ssl_server_signature )
{
RecordVal* ha = new RecordVal(BifType::Record::SSL::SignatureAndHashAlgorithm); RecordVal* ha = new RecordVal(BifType::Record::SSL::SignatureAndHashAlgorithm);
if ( ${kex.signed_params.uses_signature_and_hashalgorithm} ) if ( ${kex.signed_params.uses_signature_and_hashalgorithm} )
{ {
@ -308,6 +345,7 @@ refine connection Handshake_Conn += {
BifEvent::generate_ssl_server_signature(bro_analyzer(), BifEvent::generate_ssl_server_signature(bro_analyzer(),
bro_analyzer()->Conn(), ha, new StringVal(${kex.signed_params.signature}.length(), (const char*)(${kex.signed_params.signature}).data())); bro_analyzer()->Conn(), ha, new StringVal(${kex.signed_params.signature}.length(), (const char*)(${kex.signed_params.signature}).data()));
}
return true; return true;
%} %}
@ -317,8 +355,11 @@ refine connection Handshake_Conn += {
if ( ${kex.curve_type} != NAMED_CURVE ) if ( ${kex.curve_type} != NAMED_CURVE )
return true; return true;
if ( ssl_server_curve )
BifEvent::generate_ssl_server_curve(bro_analyzer(), BifEvent::generate_ssl_server_curve(bro_analyzer(),
bro_analyzer()->Conn(), ${kex.params.curve}); bro_analyzer()->Conn(), ${kex.params.curve});
if ( ssl_ecdh_server_params )
BifEvent::generate_ssl_ecdh_server_params(bro_analyzer(), BifEvent::generate_ssl_ecdh_server_params(bro_analyzer(),
bro_analyzer()->Conn(), ${kex.params.curve}, new StringVal(${kex.params.point}.length(), (const char*)${kex.params.point}.data())); bro_analyzer()->Conn(), ${kex.params.curve}, new StringVal(${kex.params.point}.length(), (const char*)${kex.params.point}.data()));
@ -327,24 +368,33 @@ refine connection Handshake_Conn += {
function proc_rsa_client_key_exchange(rec: HandshakeRecord, rsa_pms: bytestring) : bool function proc_rsa_client_key_exchange(rec: HandshakeRecord, rsa_pms: bytestring) : bool
%{ %{
if ( ssl_rsa_client_pms )
BifEvent::generate_ssl_rsa_client_pms(bro_analyzer(), bro_analyzer()->Conn(), new StringVal(rsa_pms.length(), (const char*)rsa_pms.data())); BifEvent::generate_ssl_rsa_client_pms(bro_analyzer(), bro_analyzer()->Conn(), new StringVal(rsa_pms.length(), (const char*)rsa_pms.data()));
return true; return true;
%} %}
function proc_dh_client_key_exchange(rec: HandshakeRecord, Yc: bytestring) : bool function proc_dh_client_key_exchange(rec: HandshakeRecord, Yc: bytestring) : bool
%{ %{
if ( ssl_dh_client_params )
BifEvent::generate_ssl_dh_client_params(bro_analyzer(), bro_analyzer()->Conn(), new StringVal(Yc.length(), (const char*)Yc.data())); BifEvent::generate_ssl_dh_client_params(bro_analyzer(), bro_analyzer()->Conn(), new StringVal(Yc.length(), (const char*)Yc.data()));
return true; return true;
%} %}
function proc_ecdh_client_key_exchange(rec: HandshakeRecord, point: bytestring) : bool function proc_ecdh_client_key_exchange(rec: HandshakeRecord, point: bytestring) : bool
%{ %{
if ( ssl_ecdh_client_params )
BifEvent::generate_ssl_ecdh_client_params(bro_analyzer(), bro_analyzer()->Conn(), new StringVal(point.length(), (const char*)point.data())); BifEvent::generate_ssl_ecdh_client_params(bro_analyzer(), bro_analyzer()->Conn(), new StringVal(point.length(), (const char*)point.data()));
return true; return true;
%} %}
function proc_signedcertificatetimestamp(rec: HandshakeRecord, version: uint8, logid: const_bytestring, timestamp: uint64, digitally_signed_algorithms: SignatureAndHashAlgorithm, digitally_signed_signature: const_bytestring) : bool function proc_signedcertificatetimestamp(rec: HandshakeRecord, version: uint8, logid: const_bytestring, timestamp: uint64, digitally_signed_algorithms: SignatureAndHashAlgorithm, digitally_signed_signature: const_bytestring) : bool
%{ %{
if ( ! ssl_extension_signed_certificate_timestamp )
return true;
RecordVal* ha = new RecordVal(BifType::Record::SSL::SignatureAndHashAlgorithm); RecordVal* ha = new RecordVal(BifType::Record::SSL::SignatureAndHashAlgorithm);
ha->Assign(0, val_mgr->GetCount(digitally_signed_algorithms->HashAlgorithm())); ha->Assign(0, val_mgr->GetCount(digitally_signed_algorithms->HashAlgorithm()));
ha->Assign(1, val_mgr->GetCount(digitally_signed_algorithms->SignatureAlgorithm())); ha->Assign(1, val_mgr->GetCount(digitally_signed_algorithms->SignatureAlgorithm()));
@ -363,6 +413,7 @@ refine connection Handshake_Conn += {
function proc_dhe_server_key_exchange(rec: HandshakeRecord, p: bytestring, g: bytestring, Ys: bytestring, signed_params: ServerKeyExchangeSignature) : bool function proc_dhe_server_key_exchange(rec: HandshakeRecord, p: bytestring, g: bytestring, Ys: bytestring, signed_params: ServerKeyExchangeSignature) : bool
%{ %{
if ( ssl_ecdh_server_params )
BifEvent::generate_ssl_dh_server_params(bro_analyzer(), BifEvent::generate_ssl_dh_server_params(bro_analyzer(),
bro_analyzer()->Conn(), bro_analyzer()->Conn(),
new StringVal(p.length(), (const char*) p.data()), new StringVal(p.length(), (const char*) p.data()),
@ -370,6 +421,8 @@ refine connection Handshake_Conn += {
new StringVal(Ys.length(), (const char*) Ys.data()) new StringVal(Ys.length(), (const char*) Ys.data())
); );
if ( ssl_server_signature )
{
RecordVal* ha = new RecordVal(BifType::Record::SSL::SignatureAndHashAlgorithm); RecordVal* ha = new RecordVal(BifType::Record::SSL::SignatureAndHashAlgorithm);
if ( ${signed_params.uses_signature_and_hashalgorithm} ) if ( ${signed_params.uses_signature_and_hashalgorithm} )
{ {
@ -387,12 +440,14 @@ refine connection Handshake_Conn += {
bro_analyzer()->Conn(), ha, bro_analyzer()->Conn(), ha,
new StringVal(${signed_params.signature}.length(), (const char*)(${signed_params.signature}).data()) new StringVal(${signed_params.signature}.length(), (const char*)(${signed_params.signature}).data())
); );
}
return true; return true;
%} %}
function proc_dh_anon_server_key_exchange(rec: HandshakeRecord, p: bytestring, g: bytestring, Ys: bytestring) : bool function proc_dh_anon_server_key_exchange(rec: HandshakeRecord, p: bytestring, g: bytestring, Ys: bytestring) : bool
%{ %{
if ( ssl_dh_server_params )
BifEvent::generate_ssl_dh_server_params(bro_analyzer(), BifEvent::generate_ssl_dh_server_params(bro_analyzer(),
bro_analyzer()->Conn(), bro_analyzer()->Conn(),
new StringVal(p.length(), (const char*) p.data()), new StringVal(p.length(), (const char*) p.data()),
@ -405,6 +460,7 @@ refine connection Handshake_Conn += {
function proc_handshake(is_orig: bool, msg_type: uint8, length: uint24) : bool function proc_handshake(is_orig: bool, msg_type: uint8, length: uint24) : bool
%{ %{
if ( ssl_handshake_message )
BifEvent::generate_ssl_handshake_message(bro_analyzer(), BifEvent::generate_ssl_handshake_message(bro_analyzer(),
bro_analyzer()->Conn(), is_orig, msg_type, to_int()(length)); bro_analyzer()->Conn(), is_orig, msg_type, to_int()(length));

View file

@ -140,15 +140,18 @@ void SteppingStoneEndpoint::Event(EventHandlerPtr f, int id1, int id2)
return; return;
if ( id2 >= 0 ) if ( id2 >= 0 )
endp->TCP()->ConnectionEvent(f, {val_mgr->GetInt(id1), val_mgr->GetInt(id2)}); endp->TCP()->ConnectionEventFast(f, {val_mgr->GetInt(id1), val_mgr->GetInt(id2)});
else else
endp->TCP()->ConnectionEvent(f, {val_mgr->GetInt(id1)}); endp->TCP()->ConnectionEventFast(f, {val_mgr->GetInt(id1)});
} }
void SteppingStoneEndpoint::CreateEndpEvent(int is_orig) void SteppingStoneEndpoint::CreateEndpEvent(int is_orig)
{ {
endp->TCP()->ConnectionEvent(stp_create_endp, { if ( ! stp_create_endp )
return;
endp->TCP()->ConnectionEventFast(stp_create_endp, {
endp->TCP()->BuildConnVal(), endp->TCP()->BuildConnVal(),
val_mgr->GetInt(stp_id), val_mgr->GetInt(stp_id),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),

View file

@ -11,6 +11,9 @@ flow Syslog_Flow
function process_syslog_message(m: Syslog_Message): bool function process_syslog_message(m: Syslog_Message): bool
%{ %{
if ( ! syslog_message )
return true;
if ( ${m.has_pri} ) if ( ${m.has_pri} )
BifEvent::generate_syslog_message( BifEvent::generate_syslog_message(
connection()->bro_analyzer(), connection()->bro_analyzer(),

View file

@ -299,7 +299,7 @@ static void passive_fingerprint(TCP_Analyzer* tcp, bool is_orig,
if ( OS_val ) if ( OS_val )
{ // found new OS version { // found new OS version
tcp->ConnectionEvent(OS_version_found, { tcp->ConnectionEventFast(OS_version_found, {
tcp->BuildConnVal(), tcp->BuildConnVal(),
src_addr_val->Ref(), src_addr_val->Ref(),
OS_val, OS_val,
@ -965,7 +965,7 @@ void TCP_Analyzer::GeneratePacketEvent(
const u_char* data, int len, int caplen, const u_char* data, int len, int caplen,
int is_orig, TCP_Flags flags) int is_orig, TCP_Flags flags)
{ {
ConnectionEvent(tcp_packet, { ConnectionEventFast(tcp_packet, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
new StringVal(flags.AsString()), new StringVal(flags.AsString()),
@ -1280,7 +1280,7 @@ void TCP_Analyzer::DeliverPacket(int len, const u_char* data, bool is_orig,
if ( connection_SYN_packet ) if ( connection_SYN_packet )
{ {
ConnectionEvent(connection_SYN_packet, { ConnectionEventFast(connection_SYN_packet, {
BuildConnVal(), BuildConnVal(),
SYN_vals->Ref(), SYN_vals->Ref(),
}); });
@ -1500,7 +1500,7 @@ int TCP_Analyzer::TCPOptionEvent(unsigned int opt,
{ {
if ( tcp_option ) if ( tcp_option )
{ {
analyzer->ConnectionEvent(tcp_option, { analyzer->ConnectionEventFast(tcp_option, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
val_mgr->GetCount(opt), val_mgr->GetCount(opt),
@ -1821,7 +1821,7 @@ void TCP_Analyzer::EndpointEOF(TCP_Reassembler* endp)
{ {
if ( connection_EOF ) if ( connection_EOF )
{ {
ConnectionEvent(connection_EOF, { ConnectionEventFast(connection_EOF, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(endp->IsOrig()), val_mgr->GetBool(endp->IsOrig()),
}); });
@ -2103,7 +2103,7 @@ int TCPStats_Endpoint::DataSent(double /* t */, uint64 seq, int len, int caplen,
if ( tcp_rexmit ) if ( tcp_rexmit )
{ {
endp->TCP()->ConnectionEvent(tcp_rexmit, { endp->TCP()->ConnectionEventFast(tcp_rexmit, {
endp->TCP()->BuildConnVal(), endp->TCP()->BuildConnVal(),
val_mgr->GetBool(endp->IsOrig()), val_mgr->GetBool(endp->IsOrig()),
val_mgr->GetCount(seq), val_mgr->GetCount(seq),
@ -2158,7 +2158,8 @@ void TCPStats_Analyzer::Done()
{ {
TCP_ApplicationAnalyzer::Done(); TCP_ApplicationAnalyzer::Done();
ConnectionEvent(conn_stats, { if ( conn_stats )
ConnectionEventFast(conn_stats, {
BuildConnVal(), BuildConnVal(),
orig_stats->BuildStats(), orig_stats->BuildStats(),
resp_stats->BuildStats(), resp_stats->BuildStats(),

View file

@ -237,7 +237,7 @@ int TCP_Endpoint::DataSent(double t, uint64 seq, int len, int caplen,
if ( contents_file_write_failure ) if ( contents_file_write_failure )
{ {
tcp_analyzer->ConnectionEvent(contents_file_write_failure, { tcp_analyzer->ConnectionEventFast(contents_file_write_failure, {
Conn()->BuildConnVal(), Conn()->BuildConnVal(),
val_mgr->GetBool(IsOrig()), val_mgr->GetBool(IsOrig()),
new StringVal(buf), new StringVal(buf),

View file

@ -136,7 +136,7 @@ void TCP_Reassembler::Gap(uint64 seq, uint64 len)
if ( report_gap(endp, endp->peer) ) if ( report_gap(endp, endp->peer) )
{ {
dst_analyzer->ConnectionEvent(content_gap, { dst_analyzer->ConnectionEventFast(content_gap, {
dst_analyzer->BuildConnVal(), dst_analyzer->BuildConnVal(),
val_mgr->GetBool(IsOrig()), val_mgr->GetBool(IsOrig()),
val_mgr->GetCount(seq), val_mgr->GetCount(seq),
@ -335,7 +335,7 @@ void TCP_Reassembler::RecordBlock(DataBlock* b, BroFile* f)
if ( contents_file_write_failure ) if ( contents_file_write_failure )
{ {
tcp_analyzer->ConnectionEvent(contents_file_write_failure, { tcp_analyzer->ConnectionEventFast(contents_file_write_failure, {
Endpoint()->Conn()->BuildConnVal(), Endpoint()->Conn()->BuildConnVal(),
val_mgr->GetBool(IsOrig()), val_mgr->GetBool(IsOrig()),
new StringVal("TCP reassembler content write failure"), new StringVal("TCP reassembler content write failure"),
@ -352,7 +352,7 @@ void TCP_Reassembler::RecordGap(uint64 start_seq, uint64 upper_seq, BroFile* f)
if ( contents_file_write_failure ) if ( contents_file_write_failure )
{ {
tcp_analyzer->ConnectionEvent(contents_file_write_failure, { tcp_analyzer->ConnectionEventFast(contents_file_write_failure, {
Endpoint()->Conn()->BuildConnVal(), Endpoint()->Conn()->BuildConnVal(),
val_mgr->GetBool(IsOrig()), val_mgr->GetBool(IsOrig()),
new StringVal("TCP reassembler gap write failure"), new StringVal("TCP reassembler gap write failure"),
@ -425,7 +425,7 @@ void TCP_Reassembler::Overlap(const u_char* b1, const u_char* b2, uint64 n)
BroString* b1_s = new BroString((const u_char*) b1, n, 0); BroString* b1_s = new BroString((const u_char*) b1, n, 0);
BroString* b2_s = new BroString((const u_char*) b2, n, 0); BroString* b2_s = new BroString((const u_char*) b2, n, 0);
tcp_analyzer->ConnectionEvent(rexmit_inconsistency, { tcp_analyzer->ConnectionEventFast(rexmit_inconsistency, {
tcp_analyzer->BuildConnVal(), tcp_analyzer->BuildConnVal(),
new StringVal(b1_s), new StringVal(b1_s),
new StringVal(b2_s), new StringVal(b2_s),
@ -596,7 +596,7 @@ void TCP_Reassembler::DeliverBlock(uint64 seq, int len, const u_char* data)
if ( deliver_tcp_contents ) if ( deliver_tcp_contents )
{ {
tcp_analyzer->ConnectionEvent(tcp_contents, { tcp_analyzer->ConnectionEventFast(tcp_contents, {
tcp_analyzer->BuildConnVal(), tcp_analyzer->BuildConnVal(),
val_mgr->GetBool(IsOrig()), val_mgr->GetBool(IsOrig()),
val_mgr->GetCount(seq), val_mgr->GetCount(seq),

View file

@ -157,7 +157,7 @@ void UDP_Analyzer::DeliverPacket(int len, const u_char* data, bool is_orig,
if ( do_udp_contents ) if ( do_udp_contents )
{ {
ConnectionEvent(udp_contents, { ConnectionEventFast(udp_contents, {
BuildConnVal(), BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),
new StringVal(len, (const char*) data), new StringVal(len, (const char*) data),

View file

@ -32,6 +32,7 @@ refine connection XMPP_Conn += {
if ( !is_orig && ( token == "proceed" || token_no_ns == "proceed" ) && client_starttls ) if ( !is_orig && ( token == "proceed" || token_no_ns == "proceed" ) && client_starttls )
{ {
bro_analyzer()->StartTLS(); bro_analyzer()->StartTLS();
if ( xmpp_starttls )
BifEvent::generate_xmpp_starttls(bro_analyzer(), bro_analyzer()->Conn()); BifEvent::generate_xmpp_starttls(bro_analyzer(), bro_analyzer()->Conn());
} }
else if ( !is_orig && token == "proceed" ) else if ( !is_orig && token == "proceed" )

View file

@ -1016,7 +1016,7 @@ void Manager::ProcessEvent(const broker::topic& topic, broker::bro::Event ev)
} }
if ( static_cast<size_t>(vl.length()) == args.size() ) if ( static_cast<size_t>(vl.length()) == args.size() )
mgr.QueueEvent(handler, std::move(vl), SOURCE_BROKER); mgr.QueueEventFast(handler, std::move(vl), SOURCE_BROKER);
else else
{ {
loop_over_list(vl, i) loop_over_list(vl, i)
@ -1247,6 +1247,9 @@ void Manager::ProcessStatus(broker::status stat)
break; break;
} }
if ( ! event )
return;
auto ei = internal_type("Broker::EndpointInfo")->AsRecordType(); auto ei = internal_type("Broker::EndpointInfo")->AsRecordType();
auto endpoint_info = new RecordVal(ei); auto endpoint_info = new RecordVal(ei);
@ -1275,7 +1278,7 @@ void Manager::ProcessStatus(broker::status stat)
auto str = stat.message(); auto str = stat.message();
auto msg = new StringVal(str ? *str : ""); auto msg = new StringVal(str ? *str : "");
mgr.QueueEvent(event, {endpoint_info, msg}); mgr.QueueEventFast(event, {endpoint_info, msg});
} }
void Manager::ProcessError(broker::error err) void Manager::ProcessError(broker::error err)
@ -1352,7 +1355,7 @@ void Manager::ProcessError(broker::error err)
msg = fmt("[%s] %s", caf::to_string(err.category()).c_str(), caf::to_string(err.context()).c_str()); msg = fmt("[%s] %s", caf::to_string(err.category()).c_str(), caf::to_string(err.context()).c_str());
} }
mgr.QueueEvent(Broker::error, { mgr.QueueEventFast(Broker::error, {
BifType::Enum::Broker::ErrorCode->GetVal(ec), BifType::Enum::Broker::ErrorCode->GetVal(ec),
new StringVal(msg), new StringVal(msg),
}); });

View file

@ -637,7 +637,7 @@ void File::FileEvent(EventHandlerPtr h, val_list* vl)
void File::FileEvent(EventHandlerPtr h, val_list vl) void File::FileEvent(EventHandlerPtr h, val_list vl)
{ {
mgr.QueueEvent(h, std::move(vl)); mgr.QueueEventFast(h, std::move(vl));
if ( h == file_new || h == file_over_new_connection || if ( h == file_new || h == file_over_new_connection ||
h == file_sniff || h == file_sniff ||

View file

@ -443,7 +443,7 @@ string Manager::GetFileID(analyzer::Tag tag, Connection* c, bool is_orig)
EnumVal* tagval = tag.AsEnumVal(); EnumVal* tagval = tag.AsEnumVal();
Ref(tagval); Ref(tagval);
mgr.QueueEvent(get_file_handle, { mgr.QueueEventFast(get_file_handle, {
tagval, tagval,
c->BuildConnVal(), c->BuildConnVal(),
val_mgr->GetBool(is_orig), val_mgr->GetBool(is_orig),

View file

@ -41,7 +41,7 @@ bool DataEvent::DeliverChunk(const u_char* data, uint64 len, uint64 offset)
{ {
if ( ! chunk_event ) return true; if ( ! chunk_event ) return true;
mgr.QueueEvent(chunk_event, { mgr.QueueEventFast(chunk_event, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),
new StringVal(new BroString(data, len, 0)), new StringVal(new BroString(data, len, 0)),
val_mgr->GetCount(offset), val_mgr->GetCount(offset),
@ -54,7 +54,7 @@ bool DataEvent::DeliverStream(const u_char* data, uint64 len)
{ {
if ( ! stream_event ) return true; if ( ! stream_event ) return true;
mgr.QueueEvent(stream_event, { mgr.QueueEventFast(stream_event, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),
new StringVal(new BroString(data, len, 0)), new StringVal(new BroString(data, len, 0)),
}); });

View file

@ -53,6 +53,9 @@ void Entropy::Finalize()
if ( ! fed ) if ( ! fed )
return; return;
if ( ! file_entropy )
return;
double montepi, scc, ent, mean, chisq; double montepi, scc, ent, mean, chisq;
montepi = scc = ent = mean = chisq = 0.0; montepi = scc = ent = mean = chisq = 0.0;
entropy->Get(&ent, &chisq, &mean, &montepi, &scc); entropy->Get(&ent, &chisq, &mean, &montepi, &scc);
@ -64,7 +67,7 @@ void Entropy::Finalize()
ent_result->Assign(3, new Val(montepi, TYPE_DOUBLE)); ent_result->Assign(3, new Val(montepi, TYPE_DOUBLE));
ent_result->Assign(4, new Val(scc, TYPE_DOUBLE)); ent_result->Assign(4, new Val(scc, TYPE_DOUBLE));
mgr.QueueEvent(file_entropy, { mgr.QueueEventFast(file_entropy, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),
ent_result, ent_result,
}); });

View file

@ -48,7 +48,10 @@ void Hash::Finalize()
if ( ! hash->IsValid() || ! fed ) if ( ! hash->IsValid() || ! fed )
return; return;
mgr.QueueEvent(file_hash, { if ( ! file_hash )
return;
mgr.QueueEventFast(file_hash, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),
new StringVal(kind), new StringVal(kind),
hash->Get(), hash->Get(),

View file

@ -81,7 +81,7 @@ refine flow Flow += {
ids_event->Assign(11, to_port(${ev.dst_p}, ${ev.protocol})); ids_event->Assign(11, to_port(${ev.dst_p}, ${ev.protocol}));
ids_event->Assign(17, val_mgr->GetCount(${ev.packet_action})); ids_event->Assign(17, val_mgr->GetCount(${ev.packet_action}));
mgr.QueueEvent(::unified2_event, { mgr.QueueEventFast(::unified2_event, {
connection()->bro_analyzer()->GetFile()->GetVal()->Ref(), connection()->bro_analyzer()->GetFile()->GetVal()->Ref(),
ids_event, ids_event,
}, },
@ -113,7 +113,7 @@ refine flow Flow += {
ids_event->Assign(15, val_mgr->GetCount(${ev.mpls_label})); ids_event->Assign(15, val_mgr->GetCount(${ev.mpls_label}));
ids_event->Assign(16, val_mgr->GetCount(${ev.vlan_id})); ids_event->Assign(16, val_mgr->GetCount(${ev.vlan_id}));
mgr.QueueEvent(::unified2_event, { mgr.QueueEventFast(::unified2_event, {
connection()->bro_analyzer()->GetFile()->GetVal()->Ref(), connection()->bro_analyzer()->GetFile()->GetVal()->Ref(),
ids_event, ids_event,
}, },
@ -135,7 +135,7 @@ refine flow Flow += {
packet->Assign(4, val_mgr->GetCount(${pkt.link_type})); packet->Assign(4, val_mgr->GetCount(${pkt.link_type}));
packet->Assign(5, bytestring_to_val(${pkt.packet_data})); packet->Assign(5, bytestring_to_val(${pkt.packet_data}));
mgr.QueueEvent(::unified2_packet, { mgr.QueueEventFast(::unified2_packet, {
connection()->bro_analyzer()->GetFile()->GetVal()->Ref(), connection()->bro_analyzer()->GetFile()->GetVal()->Ref(),
packet, packet,
}, },

View file

@ -427,7 +427,8 @@ void file_analysis::OCSP::ParseRequest(OCSP_REQUEST* req)
// TODO: try to parse out general name ? // TODO: try to parse out general name ?
#endif #endif
mgr.QueueEvent(ocsp_request, { if ( ocsp_request )
mgr.QueueEventFast(ocsp_request, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),
val_mgr->GetCount(version), val_mgr->GetCount(version),
}); });
@ -470,7 +471,8 @@ void file_analysis::OCSP::ParseResponse(OCSP_RESPVal *resp_val)
const char *status_str = OCSP_response_status_str(OCSP_response_status(resp)); const char *status_str = OCSP_response_status_str(OCSP_response_status(resp));
StringVal* status_val = new StringVal(strlen(status_str), status_str); StringVal* status_val = new StringVal(strlen(status_str), status_str);
mgr.QueueEvent(ocsp_response_status, { if ( ocsp_response_status )
mgr.QueueEventFast(ocsp_response_status, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),
status_val->Ref(), status_val->Ref(),
}); });
@ -491,12 +493,18 @@ void file_analysis::OCSP::ParseResponse(OCSP_RESPVal *resp_val)
// get the basic response // get the basic response
basic_resp = OCSP_response_get1_basic(resp); basic_resp = OCSP_response_get1_basic(resp);
if ( !basic_resp ) if ( !basic_resp )
{
Unref(status_val);
goto clean_up; goto clean_up;
}
#if ( OPENSSL_VERSION_NUMBER < 0x10100000L ) || defined(LIBRESSL_VERSION_NUMBER) #if ( OPENSSL_VERSION_NUMBER < 0x10100000L ) || defined(LIBRESSL_VERSION_NUMBER)
resp_data = basic_resp->tbsResponseData; resp_data = basic_resp->tbsResponseData;
if ( !resp_data ) if ( !resp_data )
{
Unref(status_val);
goto clean_up; goto clean_up;
}
#endif #endif
vl.append(GetFile()->GetVal()->Ref()); vl.append(GetFile()->GetVal()->Ref());

View file

@ -220,6 +220,8 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex)
BASIC_CONSTRAINTS *constr = (BASIC_CONSTRAINTS *) X509V3_EXT_d2i(ex); BASIC_CONSTRAINTS *constr = (BASIC_CONSTRAINTS *) X509V3_EXT_d2i(ex);
if ( constr ) if ( constr )
{
if ( x509_ext_basic_constraints )
{ {
RecordVal* pBasicConstraint = new RecordVal(BifType::Record::X509::BasicConstraints); RecordVal* pBasicConstraint = new RecordVal(BifType::Record::X509::BasicConstraints);
pBasicConstraint->Assign(0, val_mgr->GetBool(constr->ca ? 1 : 0)); pBasicConstraint->Assign(0, val_mgr->GetBool(constr->ca ? 1 : 0));
@ -227,10 +229,12 @@ void file_analysis::X509::ParseBasicConstraints(X509_EXTENSION* ex)
if ( constr->pathlen ) if ( constr->pathlen )
pBasicConstraint->Assign(1, val_mgr->GetCount((int32_t) ASN1_INTEGER_get(constr->pathlen))); pBasicConstraint->Assign(1, val_mgr->GetCount((int32_t) ASN1_INTEGER_get(constr->pathlen)));
mgr.QueueEvent(x509_ext_basic_constraints, { mgr.QueueEventFast(x509_ext_basic_constraints, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),
pBasicConstraint, pBasicConstraint,
}); });
}
BASIC_CONSTRAINTS_free(constr); BASIC_CONSTRAINTS_free(constr);
} }

View file

@ -35,6 +35,9 @@ refine connection MockConnection += {
function proc_signedcertificatetimestamp(rec: HandshakeRecord, version: uint8, logid: const_bytestring, timestamp: uint64, digitally_signed_algorithms: SignatureAndHashAlgorithm, digitally_signed_signature: const_bytestring) : bool function proc_signedcertificatetimestamp(rec: HandshakeRecord, version: uint8, logid: const_bytestring, timestamp: uint64, digitally_signed_algorithms: SignatureAndHashAlgorithm, digitally_signed_signature: const_bytestring) : bool
%{ %{
if ( ! x509_ocsp_ext_signed_certificate_timestamp )
return true;
BifEvent::generate_x509_ocsp_ext_signed_certificate_timestamp((analyzer::Analyzer *) bro_analyzer(), BifEvent::generate_x509_ocsp_ext_signed_certificate_timestamp((analyzer::Analyzer *) bro_analyzer(),
bro_analyzer()->GetFile()->GetVal()->Ref(), bro_analyzer()->GetFile()->GetVal()->Ref(),
version, version,

View file

@ -715,7 +715,7 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
// Raise the log event. // Raise the log event.
if ( stream->event ) if ( stream->event )
mgr.QueueEvent(stream->event, {columns->Ref()}, SOURCE_LOCAL); mgr.QueueEventFast(stream->event, {columns->Ref()}, SOURCE_LOCAL);
// Send to each of our filters. // Send to each of our filters.
for ( list<Filter*>::iterator i = stream->filters.begin(); for ( list<Filter*>::iterator i = stream->filters.begin();

View file

@ -340,7 +340,7 @@ void terminate_bro()
EventHandlerPtr bro_done = internal_handler("bro_done"); EventHandlerPtr bro_done = internal_handler("bro_done");
if ( bro_done ) if ( bro_done )
mgr.QueueEvent(bro_done, val_list{}); mgr.QueueEventFast(bro_done, val_list{});
timer_mgr->Expire(); timer_mgr->Expire();
mgr.Drain(); mgr.Drain();
@ -1138,7 +1138,7 @@ int main(int argc, char** argv)
EventHandlerPtr bro_init = internal_handler("bro_init"); EventHandlerPtr bro_init = internal_handler("bro_init");
if ( bro_init ) if ( bro_init )
mgr.QueueEvent(bro_init, val_list{}); mgr.QueueEventFast(bro_init, val_list{});
EventRegistry::string_list* dead_handlers = EventRegistry::string_list* dead_handlers =
event_registry->UnusedHandlers(); event_registry->UnusedHandlers();
@ -1184,17 +1184,20 @@ int main(int argc, char** argv)
if ( override_ignore_checksums ) if ( override_ignore_checksums )
ignore_checksums = 1; ignore_checksums = 1;
if ( bro_script_loaded )
{
// Queue events reporting loaded scripts. // Queue events reporting loaded scripts.
for ( std::list<ScannedFile>::iterator i = files_scanned.begin(); i != files_scanned.end(); i++ ) for ( std::list<ScannedFile>::iterator i = files_scanned.begin(); i != files_scanned.end(); i++ )
{ {
if ( i->skipped ) if ( i->skipped )
continue; continue;
mgr.QueueEvent(bro_script_loaded, { mgr.QueueEventFast(bro_script_loaded, {
new StringVal(i->name.c_str()), new StringVal(i->name.c_str()),
val_mgr->GetCount(i->include_level), val_mgr->GetCount(i->include_level),
}); });
} }
}
reporter->ReportViaEvents(true); reporter->ReportViaEvents(true);