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 "routing/BundleSummary.h" 00012 00013 #include <ibrdtn/data/EID.h> 00014 #include <ibrdtn/data/BundleID.h> 00015 #include <ibrcommon/data/BloomFilter.h> 00016 #include <ibrcommon/Exceptions.h> 00017 #include <map> 00018 00019 namespace dtn 00020 { 00021 namespace routing 00022 { 00028 class NeighborDatabase : public ibrcommon::Mutex 00029 { 00030 public: 00031 class BloomfilterNotAvailableException : public ibrcommon::Exception 00032 { 00033 public: 00034 BloomfilterNotAvailableException(const dtn::data::EID &host) 00035 : ibrcommon::Exception("Bloom filter is not available for this node."), eid(host) { }; 00036 00037 virtual ~BloomfilterNotAvailableException() throw () { }; 00038 00039 const dtn::data::EID eid; 00040 }; 00041 00042 class NoMoreTransfersAvailable : public ibrcommon::Exception 00043 { 00044 public: 00045 NoMoreTransfersAvailable() : ibrcommon::Exception("No more transfers allowed.") { }; 00046 virtual ~NoMoreTransfersAvailable() throw () { }; 00047 }; 00048 00049 class AlreadyInTransitException : public ibrcommon::Exception 00050 { 00051 public: 00052 AlreadyInTransitException() : ibrcommon::Exception("This bundle is already in transit.") { }; 00053 virtual ~AlreadyInTransitException() throw () { }; 00054 }; 00055 00056 class NeighborNotAvailableException : public ibrcommon::Exception 00057 { 00058 public: 00059 NeighborNotAvailableException() : ibrcommon::Exception("Entry for this neighbor not found.") { }; 00060 virtual ~NeighborNotAvailableException() throw () { }; 00061 }; 00062 00063 class NeighborEntry 00064 { 00065 public: 00066 NeighborEntry(); 00067 NeighborEntry(const dtn::data::EID &eid); 00068 virtual ~NeighborEntry(); 00069 00075 void update(const ibrcommon::BloomFilter &bf, const size_t lifetime = 0); 00076 00077 void reset(); 00078 00079 void add(const dtn::data::MetaBundle&); 00080 00081 bool has(const dtn::data::BundleID&, const bool require_bloomfilter = false) const; 00082 00087 void acquireFilterRequest() throw (NoMoreTransfersAvailable); 00088 00093 void acquireTransfer(const dtn::data::BundleID &id) throw (NoMoreTransfersAvailable, AlreadyInTransitException); 00094 00099 void releaseTransfer(const dtn::data::BundleID &id); 00100 00101 // the EID of the corresponding node 00102 const dtn::data::EID eid; 00103 00108 void expire(const size_t timestamp); 00109 00110 private: 00111 // stores bundle currently in transit 00112 ibrcommon::Mutex _transit_lock; 00113 std::set<dtn::data::BundleID> _transit_bundles; 00114 size_t _transit_max; 00115 00116 // bloomfilter used as summary vector 00117 ibrcommon::BloomFilter _filter; 00118 BundleSummary _summary; 00119 size_t _filter_expire; 00120 00121 enum FILTER_REQUEST_STATE 00122 { 00123 FILTER_AWAITING = 0, 00124 FILTER_AVAILABLE = 1, 00125 FILTER_EXPIRED = 2 00126 } _filter_state; 00127 }; 00128 00129 NeighborDatabase(); 00130 virtual ~NeighborDatabase(); 00131 00138 NeighborDatabase::NeighborEntry& get(const dtn::data::EID &eid) throw (NeighborNotAvailableException); 00139 00146 NeighborDatabase::NeighborEntry& create(const dtn::data::EID &eid); 00147 00153 NeighborDatabase::NeighborEntry& reset(const dtn::data::EID &eid); 00154 00159 void remove(const dtn::data::EID &eid); 00160 00164 void addBundle(const dtn::data::EID &neighbor, const dtn::data::MetaBundle &b); 00165 00170 void expire(const size_t timestamp); 00171 00172 private: 00173 std::map<dtn::data::EID, NeighborDatabase::NeighborEntry* > _entries; 00174 }; 00175 } 00176 } 00177 00178 #endif /* NEIGHBORDATABASE_H_ */
1.7.1