37 #include <ibrcommon/thread/MutexLock.h>
38 #include <ibrcommon/Logger.h>
57 const std::string EpidemicRoutingExtension::TAG =
"EpidemicRoutingExtension";
62 IBRCOMMON_LOGGER_TAG(EpidemicRoutingExtension::TAG, info) <<
"Initializing epidemic routing module" << IBRCOMMON_LOGGER_ENDL;
78 _taskqueue.push(
new SearchNextBundleTask( peer ) );
86 for (std::set<dtn::core::Node>::const_iterator iter = nl.begin(); iter != nl.end(); ++iter)
93 eventDataChanged(n.
getEID());
103 _taskqueue.push(
new SearchNextBundleTask( handshake.peer ) );
118 }
catch (
const ibrcommon::ThreadException &ex) {
119 IBRCOMMON_LOGGER_TAG(EpidemicRoutingExtension::TAG, error) <<
"componentUp failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
131 }
catch (
const ibrcommon::ThreadException &ex) {
132 IBRCOMMON_LOGGER_TAG(EpidemicRoutingExtension::TAG, error) <<
"componentDown failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
152 : _entry(entry), _neighbors(neighbors), _plist(plist), _context(context)
157 virtual dtn::data::Size limit()
const throw () {
return _entry.getFreeTransferSlots(); };
194 if (_neighbors.find(n) != _neighbors.end())
203 if (_entry.has(meta,
true))
216 for (dtn::net::ConnectionManager::protocol_list::const_iterator it = _plist.begin(); it != _plist.end(); ++it)
239 const std::set<dtn::core::Node> &_neighbors;
248 std::set<dtn::core::Node> neighbors;
253 Task *t = _taskqueue.poll();
254 std::auto_ptr<Task> killer(t);
256 IBRCOMMON_LOGGER_DEBUG_TAG(EpidemicRoutingExtension::TAG, 50) <<
"processing task " << t->toString() << IBRCOMMON_LOGGER_ENDL;
265 SearchNextBundleTask &task =
dynamic_cast<SearchNextBundleTask&
>(*t);
273 ibrcommon::MutexLock l(db);
298 const BundleFilter filter(entry, neighbors, context, plist);
301 IBRCOMMON_LOGGER_DEBUG_TAG(EpidemicRoutingExtension::TAG, 40) <<
"search some bundles not known by " << task.eid.getString() << IBRCOMMON_LOGGER_ENDL;
304 (**this).getSeeker().get(filter, list);
307 (**this).doHandshake(task.eid);
311 for (RoutingResult::const_iterator iter = list.begin(); iter != list.end(); ++iter)
315 transferTo(task.eid, (*iter).first, (*iter).second);
319 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
321 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
323 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
325 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
326 }
catch (
const std::bad_cast&) { };
327 }
catch (
const ibrcommon::Exception &ex) {
328 IBRCOMMON_LOGGER_DEBUG_TAG(EpidemicRoutingExtension::TAG, 20) <<
"task failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
330 }
catch (
const std::exception &ex) {
331 IBRCOMMON_LOGGER_DEBUG_TAG(EpidemicRoutingExtension::TAG, 15) <<
"terminated due to " << ex.what() << IBRCOMMON_LOGGER_ENDL;
341 EpidemicRoutingExtension::SearchNextBundleTask::SearchNextBundleTask(
const dtn::data::EID &e)
345 EpidemicRoutingExtension::SearchNextBundleTask::~SearchNextBundleTask()
348 std::string EpidemicRoutingExtension::SearchNextBundleTask::toString()
350 return "SearchNextBundleTask: " + eid.getString();
static Configuration & getInstance(bool reset=false)
const std::set< dtn::core::Node > getNeighbors()
virtual ~EpidemicRoutingExtension()
static dtn::data::EID local
static void add(EventReceiver< E > *receiver)
std::list< dtn::core::Node::Protocol > protocol_list
bool isTransferThresholdReached() const
static void remove(const EventReceiver< E > *receiver)
NeighborDatabase::NeighborEntry & get(const dtn::data::EID &eid, bool noCached=false)
dtn::net::ConnectionManager & getConnectionManager()
EpidemicRoutingExtension()
BundleFilter::ACTION evaluate(BundleFilter::TABLE table, const FilterContext &context) const
void setProtocol(const dtn::core::Node::Protocol &protocol)
const Configuration::Network & getNetwork() const
void setPeer(const dtn::data::EID &endpoint)
void transferTo(const dtn::data::EID &destination, const dtn::data::MetaBundle &meta, const dtn::core::Node::Protocol)
virtual void requestHandshake(const dtn::data::EID &, NodeHandshake &) const
void setMetaBundle(const dtn::data::MetaBundle &data)
static const dtn::data::Number identifier
const protocol_set getSupportedProtocols()
virtual void eventDataChanged(const dtn::data::EID &peer)
void raiseEvent(const dtn::routing::NodeHandshakeEvent &evt)
const dtn::data::EID & getEID() const
void addRequest(const dtn::data::Number &identifier)
virtual void eventBundleQueued(const dtn::data::EID &peer, const dtn::data::MetaBundle &meta)
void setRouting(const dtn::routing::RoutingExtension &routing)
bool doPreferDirect() const
static BundleCore & getInstance()
virtual const std::string getTag() const