00001 /* 00002 * NeighborDatabase.h 00003 * 00004 * Created on: 23.07.2010 00005 * Author: morgenro 00006 */ 00007 00008 #ifndef NEIGHBORDATABASE_H_ 00009 #define NEIGHBORDATABASE_H_ 00010 00011 #include <ibrdtn/data/EID.h> 00012 #include <ibrdtn/data/BundleID.h> 00013 #include <ibrcommon/data/BloomFilter.h> 00014 #include <ibrcommon/Exceptions.h> 00015 #include <map> 00016 00017 namespace dtn 00018 { 00019 namespace routing 00020 { 00026 class NeighborDatabase 00027 { 00028 public: 00029 class BloomfilterNotAvailableException : public ibrcommon::Exception 00030 { 00031 public: 00032 BloomfilterNotAvailableException(const dtn::data::EID &host) 00033 : ibrcommon::Exception("Bloom filter is not available for this node."), eid(host) { }; 00034 00035 virtual ~BloomfilterNotAvailableException() throw () { }; 00036 00037 const dtn::data::EID eid; 00038 }; 00039 00040 class NoMoreTransfersAvailable : public ibrcommon::Exception 00041 { 00042 public: 00043 NoMoreTransfersAvailable() : ibrcommon::Exception("No more transfers allowed.") { }; 00044 virtual ~NoMoreTransfersAvailable() throw () { }; 00045 }; 00046 00047 class NeighborEntry 00048 { 00049 public: 00050 NeighborEntry(); 00051 NeighborEntry(const dtn::data::EID &eid); 00052 ~NeighborEntry(); 00053 00054 void updateLastSeen(); 00055 void updateBundles(const ibrcommon::BloomFilter &bf); 00056 00057 dtn::data::EID _eid; 00058 ibrcommon::BloomFilter _filter; 00059 size_t _filter_age; 00060 size_t _lastseen; 00061 size_t _lastupdate; 00062 bool _available; 00063 00064 void acquireTransfer() throw (NoMoreTransfersAvailable); 00065 void releaseTransfer(); 00066 00067 private: 00068 ibrcommon::Mutex _transfer_lock; 00069 size_t _transfer_semaphore; 00070 size_t _transfer_max; 00071 }; 00072 00073 NeighborDatabase(); 00074 virtual ~NeighborDatabase(); 00075 00076 void updateBundles(const dtn::data::EID &eid, const ibrcommon::BloomFilter &bf); 00077 00085 bool knowBundle(const dtn::data::EID &eid, const dtn::data::BundleID &bundle) throw (BloomfilterNotAvailableException); 00086 00087 void setAvailable(const dtn::data::EID &eid); 00088 void setUnavailable(const dtn::data::EID &eid); 00089 00090 const std::set<dtn::data::EID> getAvailable() const; 00091 00092 NeighborDatabase::NeighborEntry& get(const dtn::data::EID &eid); 00093 00094 private: 00095 std::map<dtn::data::EID, NeighborDatabase::NeighborEntry> _entries; 00096 }; 00097 } 00098 } 00099 00100 #endif /* NEIGHBORDATABASE_H_ */
1.7.1