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/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_ */