/** * Transfer one bundle to another node. * @param destination The EID of the other node. * @param id The ID of the bundle to transfer. This bundle must be stored in the storage. */ void RoutingExtension::transferTo(const dtn::data::EID &destination, const dtn::data::MetaBundle &meta) { // acquire the transfer of this bundle, could throw already in transit or no resource left exception { // lock the list of neighbors ibrcommon::MutexLock l((**this).getNeighborDB()); // get the neighbor entry for the next hop NeighborDatabase::NeighborEntry &entry = (**this).getNeighborDB().get(destination, true); // acquire the transfer, could throw already in transit or no resource left exception entry.acquireTransfer(meta); } try { // create a new bundle transfer object dtn::net::BundleTransfer transfer(destination, meta); // transfer the bundle to the next hop dtn::core::BundleCore::getInstance().getConnectionManager().queue(transfer); IBRCOMMON_LOGGER_DEBUG_TAG(RoutingExtension::TAG, 20) << "bundle " << meta.toString() << " queued for " << destination.getString() << IBRCOMMON_LOGGER_ENDL; } catch (const dtn::core::P2PDialupException&) { // lock the list of neighbors ibrcommon::MutexLock l((**this).getNeighborDB()); // get the neighbor entry for the next hop NeighborDatabase::NeighborEntry &entry = (**this).getNeighborDB().get(destination); // release the transfer entry.releaseTransfer(meta); // and abort the query throw NeighborDatabase::NeighborNotAvailableException(); } catch (const ibrcommon::Exception &e) { // ignore any other error } }
void NativeSession::receive() throw (NativeSessionException) { Registration ® = _registration; try { try { const dtn::data::MetaBundle id = reg.receiveMetaBundle(); if (id.procflags & dtn::data::PrimaryBlock::APPDATA_IS_ADMRECORD) { // transform custody signals & status reports into notifies fireNotificationAdministrativeRecord(id); // announce the delivery of this bundle reg.delivered(id); } else { IBRCOMMON_LOGGER_DEBUG_TAG(NativeSession::TAG, 20) << "fire notification for new bundle " << id.toString() << IBRCOMMON_LOGGER_ENDL; // put the bundle into the API queue _bundle_queue.push(id); // notify the client about the new bundle fireNotificationBundle(id); } } catch (const dtn::storage::NoBundleFoundException&) { IBRCOMMON_LOGGER_DEBUG_TAG(NativeSession::TAG, 25) << "no more bundles found - wait until we are notified" << IBRCOMMON_LOGGER_ENDL; reg.wait_for_bundle(); } } catch (const ibrcommon::QueueUnblockedException &ex) { throw NativeSessionException(std::string("loop aborted - ") + ex.what()); } catch (const std::exception &ex) { throw NativeSessionException(std::string("loop aborted - ") + ex.what()); } }
void Registration::RegistrationQueue::put(const dtn::data::MetaBundle &bundle) throw () { try { _queue.push(bundle); ibrcommon::MutexLock l(_lock); _recv_bundles.add(bundle); IBRCOMMON_LOGGER_DEBUG_TAG(Registration::TAG, 10) << "[RegistrationQueue] add bundle to list of delivered bundles: " << bundle.toString() << IBRCOMMON_LOGGER_ENDL; } catch (const ibrcommon::Exception&) { } }
virtual bool shouldAdd(const dtn::data::MetaBundle &meta) const throw (dtn::storage::BundleSelectorException) { // filter fragments if requested if (meta.isFragment() && _fragment_filter) { return false; } if (_endpoints.find(meta.destination) == _endpoints.end()) { return false; } // filter own bundles if (!_loopback) { if (_endpoints.find(meta.source) != _endpoints.end()) { return false; } } IBRCOMMON_LOGGER_DEBUG_TAG(Registration::TAG, 30) << "search bundle in the list of delivered bundles: " << meta.toString() << IBRCOMMON_LOGGER_ENDL; if (_queue.has(meta)) { return false; } return true; };