Go to the documentation of this file.00001
00002
00003
00004
00005
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 }