• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

daemon/src/routing/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 
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_ */

Generated on Thu Nov 11 2010 09:49:47 for IBR-DTNSuite by  doxygen 1.7.1