IBR-DTNSuite 0.6

daemon/src/routing/epidemic/EpidemicRoutingExtension.h

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