34 #include <ibrcommon/thread/MutexLock.h>
35 #include <ibrcommon/Logger.h>
52 const std::string FloodRoutingExtension::TAG =
"FloodRoutingExtension";
57 IBRCOMMON_LOGGER_TAG(FloodRoutingExtension::TAG, info) <<
"Initializing flooding routing module" << IBRCOMMON_LOGGER_ENDL;
68 _taskqueue.push(
new SearchNextBundleTask( peer ) );
76 for (std::set<dtn::core::Node>::const_iterator iter = nl.begin(); iter != nl.end(); ++iter)
83 eventDataChanged(n.
getEID());
97 }
catch (
const ibrcommon::ThreadException &ex) {
98 IBRCOMMON_LOGGER_TAG(FloodRoutingExtension::TAG, error) <<
"componentUp failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
108 }
catch (
const ibrcommon::ThreadException &ex) {
109 IBRCOMMON_LOGGER_TAG(FloodRoutingExtension::TAG, error) <<
"componentDown failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
129 : _entry(entry), _neighbors(neighbors), _plist(plist), _context(context)
134 virtual dtn::data::Size limit()
const throw () {
return _entry.getFreeTransferSlots(); };
171 if (_neighbors.find(n) != _neighbors.end())
178 if (_entry.has(meta))
188 for (dtn::net::ConnectionManager::protocol_list::const_iterator it = _plist.begin(); it != _plist.end(); ++it)
211 const std::set<dtn::core::Node> &_neighbors;
220 std::set<dtn::core::Node> neighbors;
225 Task *t = _taskqueue.poll();
226 std::auto_ptr<Task> killer(t);
228 IBRCOMMON_LOGGER_DEBUG_TAG(FloodRoutingExtension::TAG, 50) <<
"processing task " << t->toString() << IBRCOMMON_LOGGER_ENDL;
232 SearchNextBundleTask &task =
dynamic_cast<SearchNextBundleTask&
>(*t);
241 ibrcommon::MutexLock l(db);
269 IBRCOMMON_LOGGER_DEBUG_TAG(FloodRoutingExtension::TAG, 40) <<
"search some bundles not known by " << task.eid.getString() << IBRCOMMON_LOGGER_ENDL;
272 (**this).getSeeker().get(filter, list);
276 for (RoutingResult::const_iterator iter = list.begin(); iter != list.end(); ++iter)
280 transferTo(task.eid, (*iter).first, (*iter).second);
284 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
286 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
288 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
290 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
291 }
catch (
const std::bad_cast&) { };
292 }
catch (
const ibrcommon::Exception &ex) {
293 IBRCOMMON_LOGGER_DEBUG_TAG(FloodRoutingExtension::TAG, 20) <<
"task failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
295 }
catch (
const std::exception &ex) {
296 IBRCOMMON_LOGGER_DEBUG_TAG(FloodRoutingExtension::TAG, 15) <<
"terminated due to " << ex.what() << IBRCOMMON_LOGGER_ENDL;
306 FloodRoutingExtension::SearchNextBundleTask::SearchNextBundleTask(
const dtn::data::EID &e)
310 FloodRoutingExtension::SearchNextBundleTask::~SearchNextBundleTask()
313 std::string FloodRoutingExtension::SearchNextBundleTask::toString()
315 return "SearchNextBundleTask: " + eid.getString();
static Configuration & getInstance(bool reset=false)
const std::set< dtn::core::Node > getNeighbors()
static dtn::data::EID local
std::list< dtn::core::Node::Protocol > protocol_list
bool isTransferThresholdReached() const
virtual void eventDataChanged(const dtn::data::EID &peer)
virtual ~FloodRoutingExtension()
NeighborDatabase::NeighborEntry & get(const dtn::data::EID &eid, bool noCached=false)
dtn::net::ConnectionManager & getConnectionManager()
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)
void setMetaBundle(const dtn::data::MetaBundle &data)
const protocol_set getSupportedProtocols()
virtual const std::string getTag() const
const dtn::data::EID & getEID() const
void setRouting(const dtn::routing::RoutingExtension &routing)
bool doPreferDirect() const
static BundleCore & getInstance()
virtual void eventBundleQueued(const dtn::data::EID &peer, const dtn::data::MetaBundle &meta)