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