IBR-DTNSuite
0.8
|
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_ */