IBR-DTNSuite  0.8
daemon/src/routing/NodeHandshakeExtension.h
Go to the documentation of this file.
00001 /*
00002  * NodeHandshakeExtension.h
00003  *
00004  *  Created on: 08.12.2011
00005  *      Author: morgenro
00006  */
00007 
00008 #ifndef NODEHANDSHAKEEXTENSION_H_
00009 #define NODEHANDSHAKEEXTENSION_H_
00010 
00011 #include "routing/BaseRouter.h"
00012 #include "core/AbstractWorker.h"
00013 
00014 #include <ibrcommon/thread/Mutex.h>
00015 #include <ibrcommon/thread/Queue.h>
00016 #include <map>
00017 
00018 namespace dtn
00019 {
00020         namespace routing
00021         {
00022                 class NodeHandshakeExtension : public BaseRouter::Extension
00023                 {
00024                 public:
00025                         NodeHandshakeExtension();
00026                         virtual ~NodeHandshakeExtension();
00027 
00028                         void notify(const dtn::core::Event *evt);
00029 
00030                         void doHandshake(const dtn::data::EID &eid);
00031 
00035                         void requestHandshake(const dtn::data::EID &destination, NodeHandshake &request) const;
00036 
00040                         void responseHandshake(const dtn::data::EID &source, const NodeHandshake &request, NodeHandshake &answer);
00041 
00045                         void processHandshake(const dtn::data::EID &source, NodeHandshake &answer);
00046 
00047                 protected:
00048                         void processHandshake(const dtn::data::Bundle &bundle);
00049                         const std::list<BaseRouter::Extension*>& getExtensions();
00050 
00051                 private:
00052                         class HandshakeEndpoint : public dtn::core::AbstractWorker
00053                         {
00054                         public:
00055                                 HandshakeEndpoint(NodeHandshakeExtension &callback);
00056                                 virtual ~HandshakeEndpoint();
00057 
00058                                 void callbackBundleReceived(const Bundle &b);
00059                                 void query(const dtn::data::EID &eid);
00060 
00061                                 void send(const dtn::data::Bundle &b);
00062 
00063                                 void removeFromBlacklist(const dtn::data::EID &eid);
00064 
00065                         private:
00066                                 NodeHandshakeExtension &_callback;
00067                                 std::map<dtn::data::EID, size_t> _blacklist;
00068                                 ibrcommon::Mutex _blacklist_lock;
00069                         };
00070 
00074                         HandshakeEndpoint _endpoint;
00075                 };
00076         } /* namespace routing */
00077 } /* namespace dtn */
00078 #endif /* NODEHANDSHAKEEXTENSION_H_ */