35 #include <ibrcommon/Logger.h>
36 #include <ibrcommon/thread/MutexLock.h>
37 #include <ibrcommon/thread/RWLock.h>
40 #ifdef IBRDTN_SUPPORT_BSP
48 const std::string BaseRouter::TAG =
"BaseRouter";
54 : _known_bundles(
"router-known-bundles"), _purged_bundles(
"router-purged-bundles"), _extension_state(false), _next_expiration(0)
75 ibrcommon::RWLock l(_extensions_mutex);
76 _extensions.insert(extension);
81 ibrcommon::RWLock l(_extensions_mutex);
82 _extensions.erase(extension);
87 return _extensions_mutex;
97 ibrcommon::RWLock l(_extensions_mutex);
100 for (extension_list::iterator iter = _extensions.begin(); iter != _extensions.end(); ++iter)
110 ibrcommon::MutexLock l(_extensions_mutex);
115 for (extension_list::iterator iter = _extensions.begin(); iter != _extensions.end(); ++iter)
121 _extension_state =
true;
126 for (std::set<dtn::core::Node>::const_iterator iter = nl.begin(); iter != nl.end(); ++iter)
131 __eventDataChanged( n.
getEID() );
137 ibrcommon::MutexLock l(_extensions_mutex);
139 _extension_state =
false;
142 for (extension_list::iterator iter = _extensions.begin(); iter != _extensions.end(); ++iter)
165 for (BaseRouter::extension_list::const_iterator iter = extensions.begin(); iter != extensions.end(); ++iter)
185 for (BaseRouter::extension_list::const_iterator iter = extensions.begin(); iter != extensions.end(); ++iter)
205 for (BaseRouter::extension_list::const_iterator iter = extensions.begin(); iter != extensions.end(); ++iter)
246 ibrcommon::MutexLock l(_neighbor_database);
251 entry.
add(event.getBundle());
255 __eventTransferCompleted(event.getPeer(),
event.getBundle());
258 __eventDataChanged(event.getPeer());
264 if (event.bundle.hopcount == 0)
return;
275 __eventBundleQueued(event.origin, event.bundle);
287 getStorage().store(event.bundle);
296 else if (!filterKnown(m))
315 ibrcommon::MutexLock l(_neighbor_database);
318 _neighbor_database.get(event.peer).add(m);
322 getStorage().store(bundle);
329 IBRCOMMON_LOGGER_DEBUG_TAG(BaseRouter::TAG, 5) <<
"Duplicate bundle " <<
event.bundle.toString() <<
" from " <<
event.peer.getString() <<
" ignored." << IBRCOMMON_LOGGER_ENDL;
334 #ifdef IBRDTN_SUPPORT_BSP
336 IBRCOMMON_LOGGER_TAG(BaseRouter::TAG, notice) <<
"Security checks failed (" << ex.what() <<
"), bundle will be dropped: " <<
event.bundle.toString() << IBRCOMMON_LOGGER_ENDL;
338 }
catch (
const ibrcommon::IOException &ex) {
339 IBRCOMMON_LOGGER_TAG(BaseRouter::TAG, notice) <<
"Unable to store bundle " <<
event.bundle.toString() << IBRCOMMON_LOGGER_ENDL;
344 IBRCOMMON_LOGGER_TAG(BaseRouter::TAG, notice) <<
"No space left for bundle " <<
event.bundle.toString() << IBRCOMMON_LOGGER_ENDL;
348 }
catch (
const ibrcommon::Exception &ex) {
349 IBRCOMMON_LOGGER_TAG(BaseRouter::TAG, error) <<
"Bundle " <<
event.bundle.toString() <<
" dropped: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
361 ibrcommon::MutexLock l(_neighbor_database);
383 __eventDataChanged(event.getPeer());
393 ibrcommon::MutexLock l(_neighbor_database);
394 _neighbor_database.create( event.getNode().getEID() );
398 __eventDataChanged(event.getNode().getEID());
403 __eventDataChanged(event.getNode().getEID());
408 ibrcommon::MutexLock l(_neighbor_database);
409 _neighbor_database.get( event.getNode().getEID() ).reset();
415 for (std::set<dtn::core::Node>::const_iterator iter = nl.begin(); iter != nl.end(); ++iter)
420 __eventDataChanged( n.
getEID() );
431 ibrcommon::MutexLock l(_neighbor_database);
432 _neighbor_database.create( event.getNode().getEID() );
436 __eventDataChanged( event.getNode().getEID() );
446 setPurged(event.bundle);
455 if (expire_time > _next_expiration) {
457 _next_expiration = expire_time + 60;
460 if (expire_time <= 60) expire_time = 0;
461 else expire_time -= 60;
464 ibrcommon::MutexLock l(_known_bundles_lock);
465 _known_bundles.expire(expire_time);
468 _known_bundles.sync();
472 ibrcommon::MutexLock l(_purged_bundles_lock);
473 _purged_bundles.expire(expire_time);
476 _purged_bundles.sync();
480 ibrcommon::MutexLock l(_neighbor_database);
486 for (std::set<dtn::core::Node>::const_iterator it = neighbors.begin(); it != neighbors.end(); ++it) {
488 _neighbor_database.get( (*it).getEID() );
493 _neighbor_database.expire(event.getTimestamp());
498 void BaseRouter::__eventDataChanged(
const dtn::data::EID &peer)
throw ()
501 if (!_extension_state)
return;
503 _nh_extension.eventDataChanged(peer);
504 _retransmission_extension.eventDataChanged(peer);
507 for (extension_list::const_iterator iter = _extensions.begin(); iter != _extensions.end(); ++iter)
509 (*iter)->eventDataChanged(peer);
516 if (!_extension_state)
return;
518 _nh_extension.eventBundleQueued(peer, meta);
519 _retransmission_extension.eventBundleQueued(peer, meta);
522 for (extension_list::const_iterator iter = _extensions.begin(); iter != _extensions.end(); ++iter)
524 (*iter)->eventBundleQueued(peer, meta);
531 if (!_extension_state)
return;
533 _nh_extension.eventTransferCompleted(peer, meta);
534 _retransmission_extension.eventTransferCompleted(peer, meta);
537 for (extension_list::const_iterator iter = _extensions.begin(); iter != _extensions.end(); ++iter)
539 (*iter)->eventTransferCompleted(peer, meta);
565 ibrcommon::MutexLock l(_known_bundles_lock);
566 return _known_bundles.
add(meta);
572 ibrcommon::MutexLock l(_known_bundles_lock);
573 return _known_bundles.
has(
id);
581 ibrcommon::MutexLock l(_known_bundles_lock);
582 bool ret = _known_bundles.
has(meta);
583 if (!ret) _known_bundles.
add(meta);
590 ibrcommon::MutexLock l(_known_bundles_lock);
591 return _known_bundles;
597 ibrcommon::MutexLock l(_purged_bundles_lock);
598 return _purged_bundles.
has(
id);
603 ibrcommon::MutexLock l(_purged_bundles_lock);
604 return _purged_bundles.
add(meta);
609 ibrcommon::MutexLock l(_purged_bundles_lock);
610 return _purged_bundles;
620 return _neighbor_database;
void add(RoutingExtension *extension)
const extension_list & getExtensions() const
const std::set< dtn::core::Node > getNeighbors()
void processHandshake(const dtn::data::EID &source, NodeHandshake &answer)
void add(const dtn::data::MetaBundle &)
static dtn::data::EID local
static void add(EventReceiver< E > *receiver)
ibrcommon::RWMutex & getExtensionMutex()
std::set< RoutingExtension * > extension_list
void doHandshake(const dtn::data::EID &eid)
static void raise(const dtn::data::MetaBundle &bundle, const dtn::data::EID &origin)
void pushHandshakeUpdated(const NodeHandshakeItem::IDENTIFIER id)
void requestHandshake(const dtn::data::EID &destination, NodeHandshake &request) const
static void remove(const EventReceiver< E > *receiver)
void setRouter(dtn::routing::BaseRouter *router)
void setKnown(const dtn::data::MetaBundle &meta)
dtn::net::ConnectionManager & getConnectionManager()
void requestHandshake(const dtn::data::EID &destination, NodeHandshake &request)
const dtn::data::BundleSet getPurgedBundles()
dtn::storage::BundleSeeker & getSeeker()
virtual void processHandshake(const dtn::data::EID &, NodeHandshake &)
virtual void add(const dtn::data::MetaBundle &bundle)
virtual void componentDown()
void append(const dtn::data::EID &eid)
void pushHandshakeUpdated(const NodeHandshakeItem::IDENTIFIER id)
bool isPurged(const dtn::data::BundleID &id)
void responseHandshake(const dtn::data::EID &source, const NodeHandshake &request, NodeHandshake &answer)
void remove(RoutingExtension *extension)
virtual void componentUp()=0
void increment(const Number &hops=1)
void doHandshake(const dtn::data::EID &eid)
bool isKnown(const dtn::data::BundleID &id)
virtual bool has(const dtn::data::BundleID &bundle) const
virtual void responseHandshake(const dtn::data::EID &, const NodeHandshake &, NodeHandshake &)
dtn::storage::BundleStorage & getStorage()
void setPurged(const dtn::data::MetaBundle &meta)
const dtn::data::BundleSet getKnownBundles()
NeighborDatabase & getNeighborDB()
iterator find(block_t blocktype)
static void raise(const dtn::data::MetaBundle &bundle, EventBundleAction action, dtn::data::StatusReportBlock::REASON_CODE reason=dtn::data::StatusReportBlock::NO_ADDITIONAL_INFORMATION)
dtn::storage::BundleSeeker & getSeeker()
void processHandshake(const dtn::data::EID &source, NodeHandshake &answer)
const dtn::data::EID & getEID() const
virtual void componentUp()
virtual void requestHandshake(const dtn::data::EID &, NodeHandshake &) const
bool filterKnown(const dtn::data::MetaBundle &meta)
dtn::storage::BundleStorage & getStorage()
void raiseEvent(const dtn::net::TransferAbortedEvent &evt)
virtual const std::string getName() const
void responseHandshake(const dtn::data::EID &, const NodeHandshake &, NodeHandshake &)
virtual void componentDown()=0
static BundleCore & getInstance()
void releaseTransfer(const dtn::data::BundleID &id)