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

daemon/src/routing/NeighborDatabase.h

Go to the documentation of this file.
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_ */

Generated on Wed Mar 30 2011 11:11:49 for IBR-DTNSuite by  doxygen 1.7.1