diff --git a/scripts/base/frameworks/comm/main.bro b/scripts/base/frameworks/comm/main.bro index a2cd1f6ac0..66dc1715f4 100644 --- a/scripts/base/frameworks/comm/main.bro +++ b/scripts/base/frameworks/comm/main.bro @@ -5,6 +5,11 @@ export { const endpoint_name = "" &redef; + type EndpointFlags: record { + auto_publish: bool &default = T; + auto_advertise: bool &default = T; + }; + type SendFlags: record { self: bool &default = F; peers: bool &default = T; diff --git a/src/comm/Manager.cc b/src/comm/Manager.cc index 1dc7cc5415..832718b595 100644 --- a/src/comm/Manager.cc +++ b/src/comm/Manager.cc @@ -41,7 +41,25 @@ static int require_field(RecordType* rt, const char* name) return rval; } -bool comm::Manager::Enable() +static int GetEndpointFlags(Val* broker_endpoint_flags) + { + int rval = 0; + auto r = broker_endpoint_flags->AsRecordVal(); + Val* auto_publish_flag = r->Lookup("auto_publish", true); + Val* auto_advertise_flag = r->Lookup("auto_advertise", true); + + if ( auto_publish_flag->AsBool() ) + rval |= broker::AUTO_PUBLISH; + + if ( auto_advertise_flag->AsBool() ) + rval |= broker::AUTO_ADVERTISE; + + Unref(auto_publish_flag); + Unref(auto_advertise_flag); + return rval; + } + +bool comm::Manager::Enable(Val* broker_endpoint_flags) { if ( endpoint != nullptr ) return true; @@ -93,11 +111,22 @@ bool comm::Manager::Enable() name = fmt("bro@.%ld", static_cast(getpid())); } - endpoint = unique_ptr(new broker::endpoint(name)); + int flags = GetEndpointFlags(broker_endpoint_flags); + endpoint = unique_ptr(new broker::endpoint(name, flags)); iosource_mgr->Register(this, true); return true; } +bool comm::Manager::SetEndpointFlags(Val* broker_endpoint_flags) + { + if ( ! Enabled() ) + return false; + + int flags = GetEndpointFlags(broker_endpoint_flags); + endpoint->set_flags(flags); + return true; + } + bool comm::Manager::Listen(uint16_t port, const char* addr, bool reuse_addr) { if ( ! Enabled() ) diff --git a/src/comm/Manager.h b/src/comm/Manager.h index 2317ecea2c..ef1532fbc8 100644 --- a/src/comm/Manager.h +++ b/src/comm/Manager.h @@ -24,7 +24,9 @@ public: ~Manager(); - bool Enable(); + bool Enable(Val* flags); + + bool SetEndpointFlags(Val* flags); bool Enabled() { return endpoint != nullptr; } diff --git a/src/comm/comm.bif b/src/comm/comm.bif index e87c6c1144..aa7efac472 100644 --- a/src/comm/comm.bif +++ b/src/comm/comm.bif @@ -7,9 +7,16 @@ module Comm; -function Comm::enable%(%): bool +type Comm::EndpointFlags: record; + +function Comm::enable%(flags: EndpointFlags &default = EndpointFlags()%): bool %{ - return new Val(comm_mgr->Enable(), TYPE_BOOL); + return new Val(comm_mgr->Enable(flags), TYPE_BOOL); + %} + +function Comm::set_endpoint_flags%(flags: EndpointFlags &default = EndpointFlags()%): bool + %{ + return new Val(comm_mgr->SetEndpointFlags(flags), TYPE_BOOL); %} event Comm::outgoing_connection_established%(peer_address: string,