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/Queue.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 private: 00036 static const dtn::data::EID EPIDEMIC_ROUTING_ADDRESS; 00037 00038 public: 00039 EpidemicRoutingExtension(); 00040 ~EpidemicRoutingExtension(); 00041 00042 void notify(const dtn::core::Event *evt); 00043 00044 void update(std::string &name, std::string &data); 00045 00046 virtual void stopExtension(); 00047 00048 class EpidemicExtensionBlock : public dtn::data::Block 00049 { 00050 public: 00051 class Factory : public dtn::data::ExtensionBlockFactory 00052 { 00053 public: 00054 Factory() : dtn::data::ExtensionBlockFactory(EpidemicExtensionBlock::BLOCK_TYPE) {}; 00055 virtual ~Factory() {}; 00056 virtual dtn::data::Block* create(); 00057 }; 00058 00059 static const char BLOCK_TYPE = 201; 00060 00061 EpidemicExtensionBlock(); 00062 ~EpidemicExtensionBlock(); 00063 00064 void set(dtn::data::SDNV value); 00065 dtn::data::SDNV get() const; 00066 00067 void setPurgeVector(const SummaryVector &vector); 00068 void setSummaryVector(const SummaryVector &vector); 00069 const SummaryVector& getSummaryVector() const; 00070 const SummaryVector& getPurgeVector() const; 00071 00072 virtual size_t getLength() const; 00073 virtual std::ostream &serialize(std::ostream &stream) const; 00074 virtual std::istream &deserialize(std::istream &stream); 00075 00076 private: 00077 dtn::data::SDNV _counter; 00078 dtn::data::BundleString _data; 00079 SummaryVector _vector; 00080 SummaryVector _purge; 00081 }; 00082 00083 protected: 00084 void run(); 00085 bool __cancellation(); 00086 00087 private: 00088 class Task 00089 { 00090 public: 00091 virtual ~Task() {}; 00092 virtual std::string toString() = 0; 00093 }; 00094 00095 class ExpireTask : public Task 00096 { 00097 public: 00098 ExpireTask(const size_t timestamp); 00099 virtual ~ExpireTask(); 00100 00101 virtual std::string toString(); 00102 00103 const size_t timestamp; 00104 }; 00105 00106 class SearchNextBundleTask : public Task 00107 { 00108 public: 00109 SearchNextBundleTask(const dtn::data::EID &eid); 00110 virtual ~SearchNextBundleTask(); 00111 00112 virtual std::string toString(); 00113 00114 const dtn::data::EID eid; 00115 }; 00116 00117 class TransferSummaryVectorTask : public Task 00118 { 00119 public: 00120 TransferSummaryVectorTask(const dtn::data::EID &eid); 00121 virtual ~TransferSummaryVectorTask(); 00122 00123 virtual std::string toString(); 00124 00125 const dtn::data::EID eid; 00126 }; 00127 00128 class ProcessBundleTask : public Task 00129 { 00130 public: 00131 ProcessBundleTask(const dtn::data::MetaBundle &meta, const dtn::data::EID &origin); 00132 virtual ~ProcessBundleTask(); 00133 00134 virtual std::string toString(); 00135 00136 const dtn::data::MetaBundle bundle; 00137 const dtn::data::EID origin; 00138 }; 00139 00146 void prepareEpidemicInfo(dtn::data::Bundle &b); 00147 00151 ibrcommon::Mutex _list_mutex; 00152 00156 dtn::routing::BundleSummary _purge_vector; 00157 00161 dtn::routing::NeighborDatabase _neighbors; 00162 00166 ibrcommon::Queue<EpidemicRoutingExtension::Task* > _taskqueue; 00167 00171 dtn::data::Bundle _epidemic_bundle; 00172 }; 00173 00177 static EpidemicRoutingExtension::EpidemicExtensionBlock::Factory __EpidemicExtensionFactory__; 00178 } 00179 } 00180 00181 #endif /* EPIDEMICROUTINGEXTENSION_H_ */
1.7.1