31 #include <ibrcommon/Logger.h>
33 using namespace dtn::core;
39 DiscoveryAgent::DiscoveryAgent()
40 : _config(dtn::daemon::Configuration::getInstance().getDiscovery()),
41 _enabled(true), _sn(0), _adv_next(0), _beacon_period(_config.interval())
51 return "DiscoveryAgent";
58 if (_config.
announce() && (_adv_next <= ts)) {
63 _adv_next = ts + _beacon_period;
79 _beacon_period = _config.interval() * 10;
83 _beacon_period = _config.interval();
108 ibrcommon::MutexLock l(_provider_lock);
109 handler_list &list = _providers[iface];
110 list.push_back(handler);
115 ibrcommon::MutexLock l(_provider_lock);
116 handler_list &list = _providers[_any_iface];
117 list.push_back(handler);
122 ibrcommon::MutexLock l(_provider_lock);
125 for (handler_map::iterator it_p = _providers.begin(); it_p != _providers.end();)
127 handler_list &list = (*it_p).second;
129 for (handler_list::iterator it = list.begin(); it != list.end(); ++it) {
130 if ((*it) == handler) {
137 _providers.erase(it_p++);
145 ibrcommon::MutexLock l(_provider_lock);
146 if (_providers.find(iface) == _providers.end())
return;
148 handler_list &list = _providers[iface];
150 for (handler_list::iterator it = list.begin(); it != list.end(); ++it) {
151 if ((*it) == handler) {
153 if (list.empty()) _providers.erase(iface);
174 IBRCOMMON_LOGGER_TAG(
"DiscoveryAgent", info) <<
"DTN2 compatibility mode" << IBRCOMMON_LOGGER_ENDL;
198 const std::list<DiscoveryService> &services = beacon.
getServices();
200 for (std::list<DiscoveryService>::const_iterator iter = services.begin(); iter != services.end(); ++iter)
213 to_value_mailcl = configTime;
231 if (!_config.
announce() && _enabled)
238 IBRCOMMON_LOGGER_DEBUG_TAG(
"DiscoveryAgent", 55) <<
"reply with discovery beacon" << IBRCOMMON_LOGGER_ENDL;
244 _adv_next = ts + _beacon_period;
249 void DiscoveryAgent::onAdvertise()
252 if (!_enabled)
return;
254 IBRCOMMON_LOGGER_DEBUG_TAG(
"DiscoveryAgent", 55) <<
"advertise discovery beacon" << IBRCOMMON_LOGGER_ENDL;
261 ibrcommon::MutexLock l(_provider_lock);
264 const handler_list &any_list = _providers[_any_iface];
266 for (handler_map::const_iterator it_p = _providers.begin(); it_p != _providers.end(); ++it_p)
268 const ibrcommon::vinterface &iface = (*it_p).first;
269 const handler_list &plist = (*it_p).second;
277 for (handler_list::const_iterator iter = plist.begin(); iter != plist.end(); ++iter)
290 if (iface != _any_iface)
292 for (handler_list::const_iterator iter = any_list.begin(); iter != any_list.end(); ++iter)
307 for (handler_list::const_iterator iter = plist.begin(); iter != plist.end(); ++iter)
static Configuration & getInstance(bool reset=false)
virtual void componentUp()
service_list & getServices()
DiscoveryBeacon obtainBeacon() const
size_t getNodeAvailableTime() const
static dtn::data::EID local
dtn::core::Node::Protocol getProtocol() const
static void add(EventReceiver< E > *receiver)
const std::string & getName() const
static void remove(const EventReceiver< E > *receiver)
void raiseEvent(const dtn::core::TimeEvent &evt)
dtn::net::ConnectionManager & getConnectionManager()
const dtn::data::EID & getEID() const
void unregisterService(const ibrcommon::vinterface &iface, const dtn::net::DiscoveryBeaconHandler *handler)
const std::string & getParameters() const
virtual void componentDown()
virtual const std::string getName() const
const dtn::data::Number & getPeriod() const
void setPeriod(const dtn::data::Number &period)
virtual void onAdvertiseBeacon(const ibrcommon::vinterface &iface, const DiscoveryBeacon &beacon)
unsigned int interval() const
void onBeaconReceived(const DiscoveryBeacon &beacon)
virtual ~DiscoveryAgent()
const Configuration::EMail & getEMail() const
static dtn::data::Timestamp getMonotonicTimestamp()
void registerService(const ibrcommon::vinterface &iface, dtn::net::DiscoveryBeaconHandler *handler)
virtual void onUpdateBeacon(const ibrcommon::vinterface &iface, DiscoveryBeacon &beacon)
void updateNeighbor(const dtn::core::Node &n)
static BundleCore & getInstance()
void setSequencenumber(uint16_t sequence)