|
IBR-DTNSuite 0.6
|
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 #include "core/AbstractWorker.h" 00013 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/ExtensionBlock.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 00034 { 00035 public: 00036 EpidemicRoutingExtension(); 00037 virtual ~EpidemicRoutingExtension(); 00038 00039 void notify(const dtn::core::Event *evt); 00040 virtual void stopExtension(); 00041 00042 protected: 00043 void run(); 00044 bool __cancellation(); 00045 00046 private: 00047 class Task 00048 { 00049 public: 00050 virtual ~Task() {}; 00051 virtual std::string toString() = 0; 00052 }; 00053 00054 class ExecutableTask : public Task 00055 { 00056 public: 00057 virtual ~ExecutableTask() {}; 00058 virtual std::string toString() = 0; 00059 virtual void execute() const = 0; 00060 }; 00061 00062 class EpidemicEndpoint : public dtn::core::AbstractWorker 00063 { 00064 public: 00065 EpidemicEndpoint(ibrcommon::Queue<EpidemicRoutingExtension::Task* > &queue, dtn::routing::BundleSummary &purge); 00066 virtual ~EpidemicEndpoint(); 00067 00068 void callbackBundleReceived(const Bundle &b); 00069 void query(const dtn::data::EID &eid); 00070 00071 void send(const dtn::data::Bundle &b); 00072 00073 private: 00074 ibrcommon::Queue<EpidemicRoutingExtension::Task* > &_taskqueue; 00075 dtn::routing::BundleSummary &_purge_vector; 00076 }; 00077 00078 class ExpireTask : public Task 00079 { 00080 public: 00081 ExpireTask(const size_t timestamp); 00082 virtual ~ExpireTask(); 00083 00084 virtual std::string toString(); 00085 00086 const size_t timestamp; 00087 }; 00088 00089 class SearchNextBundleTask : public Task 00090 { 00091 public: 00092 SearchNextBundleTask(const dtn::data::EID &eid); 00093 virtual ~SearchNextBundleTask(); 00094 00095 virtual std::string toString(); 00096 00097 const dtn::data::EID eid; 00098 }; 00099 00100 class ProcessEpidemicBundleTask : public Task 00101 { 00102 public: 00103 ProcessEpidemicBundleTask(const dtn::data::Bundle &b); 00104 virtual ~ProcessEpidemicBundleTask(); 00105 00106 virtual std::string toString(); 00107 00108 const dtn::data::Bundle bundle; 00109 }; 00110 00111 class QuerySummaryVectorTask : public ExecutableTask 00112 { 00113 public: 00114 QuerySummaryVectorTask(NeighborDatabase &ndb, const dtn::data::EID &origin, EpidemicEndpoint &endpoint); 00115 virtual ~QuerySummaryVectorTask(); 00116 00117 virtual std::string toString(); 00118 virtual void execute() const; 00119 00120 NeighborDatabase &ndb; 00121 const dtn::data::EID origin; 00122 EpidemicEndpoint &endpoint; 00123 }; 00124 00125 class TransferCompletedTask : public Task 00126 { 00127 public: 00128 TransferCompletedTask(const dtn::data::EID &eid, const dtn::data::MetaBundle &meta); 00129 virtual ~TransferCompletedTask(); 00130 00131 virtual std::string toString(); 00132 00133 const dtn::data::EID peer; 00134 const dtn::data::MetaBundle meta; 00135 }; 00136 00142 void processECM(const dtn::data::Bundle &b); 00143 00147 dtn::routing::BundleSummary _purge_vector; 00148 00152 ibrcommon::Queue<EpidemicRoutingExtension::Task* > _taskqueue; 00153 00157 EpidemicEndpoint _endpoint; 00158 }; 00159 } 00160 } 00161 00162 #endif /* EPIDEMICROUTINGEXTENSION_H_ */