• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

daemon/src/routing/NeighborDatabase.cpp

Go to the documentation of this file.
00001 /*
00002  * NeighborDatabase.cpp
00003  *
00004  *  Created on: 23.07.2010
00005  *      Author: morgenro
00006  */
00007 
00008 #include "routing/NeighborDatabase.h"
00009 #include <ibrdtn/utils/Clock.h>
00010 
00011 namespace dtn
00012 {
00013         namespace routing
00014         {
00015                 NeighborDatabase::NeighborEntry::NeighborEntry()
00016                  : _eid(), _filter(), _filter_age(0), _lastseen(0), _lastupdate(0), _available(false), _transfer_semaphore(5), _transfer_max(5)
00017                 {};
00018 
00019                 NeighborDatabase::NeighborEntry::NeighborEntry(const dtn::data::EID &eid)
00020                  : _eid(eid), _filter(), _filter_age(0), _lastseen(0), _lastupdate(0), _available(false), _transfer_semaphore(5), _transfer_max(5)
00021                 { }
00022 
00023                 NeighborDatabase::NeighborEntry::~NeighborEntry()
00024                 { }
00025 
00026                 void NeighborDatabase::NeighborEntry::updateLastSeen()
00027                 {
00028                         _lastseen = dtn::utils::Clock::getTime();
00029                 }
00030 
00031                 void NeighborDatabase::NeighborEntry::updateBundles(const ibrcommon::BloomFilter &bf)
00032                 {
00033                         _filter = bf;
00034                         _lastupdate = dtn::utils::Clock::getTime();
00035                 }
00036 
00037                 void NeighborDatabase::NeighborEntry::acquireTransfer() throw (NoMoreTransfersAvailable)
00038                 {
00039                         ibrcommon::MutexLock l(_transfer_lock);
00040                         if (_transfer_semaphore == 0) throw NoMoreTransfersAvailable();
00041                         _transfer_semaphore--;
00042                 }
00043 
00044                 void NeighborDatabase::NeighborEntry::releaseTransfer()
00045                 {
00046                         ibrcommon::MutexLock l(_transfer_lock);
00047                         if (_transfer_semaphore >= _transfer_max) return;
00048                         _transfer_semaphore++;
00049                 }
00050 
00051                 NeighborDatabase::NeighborDatabase()
00052                 {
00053                 }
00054 
00055                 NeighborDatabase::~NeighborDatabase()
00056                 {
00057                 }
00058 
00059                 NeighborDatabase::NeighborEntry& NeighborDatabase::get(const dtn::data::EID &eid)
00060                 {
00061                         if (_entries.find(eid) == _entries.end())
00062                         {
00063                                 NeighborEntry entry(eid);
00064                                 _entries[eid] = entry;
00065                         }
00066 
00067                         return _entries[eid];
00068                 }
00069 
00070                 void NeighborDatabase::updateBundles(const dtn::data::EID &eid, const ibrcommon::BloomFilter &bf)
00071                 {
00072                         NeighborEntry &entry = get(eid);
00073                         entry.updateBundles(bf);
00074                 }
00075 
00076                 bool NeighborDatabase::knowBundle(const dtn::data::EID &eid, const dtn::data::BundleID &bundle) throw (BloomfilterNotAvailableException)
00077                 {
00078                         NeighborEntry &entry = get(eid);
00079                         return entry._filter.contains(bundle.toString());
00080                 }
00081 
00082                 void NeighborDatabase::setAvailable(const dtn::data::EID &eid)
00083                 {
00084                         NeighborEntry &entry = get(eid);
00085                         entry.updateLastSeen();
00086                         entry._available = true;
00087                 }
00088 
00089                 void NeighborDatabase::setUnavailable(const dtn::data::EID &eid)
00090                 {
00091                         NeighborEntry &entry = get(eid);
00092                         entry.updateLastSeen();
00093                         entry._available = false;
00094                 }
00095 
00096                 const std::set<dtn::data::EID> NeighborDatabase::getAvailable() const
00097                 {
00098                         std::set<dtn::data::EID> ret;
00099 
00100                         for (std::map<dtn::data::EID, NeighborDatabase::NeighborEntry>::const_iterator iter = _entries.begin(); iter != _entries.end(); iter++)
00101                         {
00102                                 if ((*iter).second._available)
00103                                 {
00104                                         ret.insert((*iter).first);
00105                                 }
00106                         }
00107 
00108                         return ret;
00109                 }
00110         }
00111 }

Generated on Thu Nov 11 2010 09:49:47 for IBR-DTNSuite by  doxygen 1.7.1