00001 /* 00002 * EpidemicRoutingExtension.h 00003 * 00004 * Created on: 18.02.2010 00005 * Author: morgenro 00006 */ 00007 00008 #ifndef EPIDEMICROUTINGEXTENSION_H_ 00009 #define EPIDEMICROUTINGEXTENSION_H_ 00010 00011 #include "core/Node.h" 00012 00013 #include "net/DiscoveryServiceProvider.h" 00014 #include "routing/SummaryVector.h" 00015 #include "routing/BaseRouter.h" 00016 #include "routing/NeighborDatabase.h" 00017 00018 #include <ibrdtn/data/Block.h> 00019 #include <ibrdtn/data/SDNV.h> 00020 #include <ibrdtn/data/BundleString.h> 00021 #include <ibrdtn/data/BundleList.h> 00022 #include <ibrdtn/data/ExtensionBlockFactory.h> 00023 00024 #include <ibrcommon/thread/ThreadSafeQueue.h> 00025 00026 #include <list> 00027 #include <queue> 00028 00029 namespace dtn 00030 { 00031 namespace routing 00032 { 00033 class EpidemicRoutingExtension : public BaseRouter::ThreadedExtension, public dtn::net::DiscoveryServiceProvider 00034 { 00035 public: 00036 EpidemicRoutingExtension(); 00037 ~EpidemicRoutingExtension(); 00038 00039 void notify(const dtn::core::Event *evt); 00040 00041 void update(std::string &name, std::string &data); 00042 00043 virtual void stopExtension(); 00044 00045 class EpidemicExtensionBlock : public dtn::data::Block 00046 { 00047 public: 00048 class Factory : public dtn::data::ExtensionBlockFactory 00049 { 00050 public: 00051 Factory() : dtn::data::ExtensionBlockFactory(EpidemicExtensionBlock::BLOCK_TYPE) {}; 00052 virtual ~Factory() {}; 00053 virtual dtn::data::Block* create(); 00054 }; 00055 00056 static const char BLOCK_TYPE = 201; 00057 00058 EpidemicExtensionBlock(); 00059 ~EpidemicExtensionBlock(); 00060 00061 void set(dtn::data::SDNV value); 00062 dtn::data::SDNV get() const; 00063 00064 void setSummaryVector(const SummaryVector &vector); 00065 const SummaryVector& getSummaryVector() const; 00066 00067 virtual size_t getLength() const; 00068 virtual std::ostream &serialize(std::ostream &stream) const; 00069 virtual std::istream &deserialize(std::istream &stream); 00070 00071 private: 00072 dtn::data::SDNV _counter; 00073 dtn::data::BundleString _data; 00074 SummaryVector _vector; 00075 }; 00076 00077 protected: 00078 void run(); 00079 00085 bool wasSeenBefore(const dtn::data::BundleID &id) const; 00086 00087 // /** 00088 // * remove a bundle out of all local bundle lists 00089 // * @param id The ID of the Bundle. 00090 // */ 00091 // void remove(const dtn::data::MetaBundle &meta); 00092 00093 private: 00094 class Task 00095 { 00096 public: 00097 virtual ~Task() {}; 00098 virtual std::string toString() = 0; 00099 }; 00100 00101 class ExpireTask : public Task 00102 { 00103 public: 00104 ExpireTask(const size_t timestamp); 00105 virtual ~ExpireTask(); 00106 00107 virtual std::string toString(); 00108 00109 const size_t timestamp; 00110 }; 00111 00112 class SearchNextBundleTask : public Task 00113 { 00114 public: 00115 SearchNextBundleTask(const dtn::data::EID &eid); 00116 virtual ~SearchNextBundleTask(); 00117 00118 virtual std::string toString(); 00119 00120 const dtn::data::EID eid; 00121 }; 00122 00123 class BroadcastSummaryVectorTask : public Task 00124 { 00125 public: 00126 BroadcastSummaryVectorTask(); 00127 virtual ~BroadcastSummaryVectorTask(); 00128 00129 virtual std::string toString(); 00130 }; 00131 00132 class UpdateSummaryVectorTask : public Task 00133 { 00134 public: 00135 UpdateSummaryVectorTask(const dtn::data::EID &eid); 00136 virtual ~UpdateSummaryVectorTask(); 00137 00138 virtual std::string toString(); 00139 00140 const dtn::data::EID eid; 00141 }; 00142 00143 class ProcessBundleTask : public Task 00144 { 00145 public: 00146 ProcessBundleTask(const dtn::data::MetaBundle &meta); 00147 virtual ~ProcessBundleTask(); 00148 00149 virtual std::string toString(); 00150 00151 const dtn::data::MetaBundle bundle; 00152 }; 00153 00154 void transferEpidemicInformation(const dtn::data::EID &eid); 00155 00159 ibrcommon::Mutex _list_mutex; 00160 00164 dtn::data::BundleList _seenlist; 00165 00166 // /** 00167 // * contains the own summary vector for all stored bundles 00168 // */ 00169 // SummaryVector _bundle_vector; 00170 00174 dtn::routing::NeighborDatabase _neighbors; 00175 00179 ibrcommon::ThreadSafeQueue<EpidemicRoutingExtension::Task* > _taskqueue; 00180 }; 00181 00185 static EpidemicRoutingExtension::EpidemicExtensionBlock::Factory __EpidemicExtensionFactory__; 00186 } 00187 } 00188 00189 #endif /* EPIDEMICROUTINGEXTENSION_H_ */
1.6.3