|
IBR-DTNSuite 0.6
|
00001 /* 00002 * DiscoveryAgent.cpp 00003 * 00004 * Created on: 14.09.2009 00005 * Author: morgenro 00006 */ 00007 00008 #include "net/DiscoveryAgent.h" 00009 #include "net/DiscoveryService.h" 00010 #include "net/DiscoveryAnnouncement.h" 00011 #include "core/TimeEvent.h" 00012 #include "core/NodeEvent.h" 00013 #include <ibrdtn/utils/Utils.h> 00014 #include "Configuration.h" 00015 #include <ibrcommon/Logger.h> 00016 00017 using namespace dtn::core; 00018 00019 namespace dtn 00020 { 00021 namespace net 00022 { 00023 DiscoveryAgent::DiscoveryAgent(const dtn::daemon::Configuration::Discovery &config) 00024 : _config(config), _sn(0) 00025 { 00026 } 00027 00028 DiscoveryAgent::~DiscoveryAgent() 00029 { 00030 } 00031 00032 void DiscoveryAgent::addService(std::string name, std::string parameters) 00033 { 00034 DiscoveryService service(name, parameters); 00035 _services.push_back(service); 00036 } 00037 00038 void DiscoveryAgent::addService(DiscoveryServiceProvider *provider) 00039 { 00040 DiscoveryService service(provider); 00041 _services.push_back(service); 00042 } 00043 00044 void DiscoveryAgent::received(const DiscoveryAnnouncement &announcement) 00045 { 00046 // calculating RTT with the service timestamp 00047 size_t rtt = 2700; 00048 00049 // convert the announcement into NodeEvents 00050 Node n(Node::NODE_FLOATING, rtt); 00051 00052 // set the EID and some parameters of this Node 00053 n.setEID(announcement.getEID()); 00054 00055 // get configured timeout value 00056 n.setTimeout( _config.timeout() ); 00057 00058 const list<DiscoveryService> services = announcement.getServices(); 00059 for (list<DiscoveryService>::const_iterator iter = services.begin(); iter != services.end(); iter++) 00060 { 00061 const DiscoveryService &s = (*iter); 00062 00063 if (s.getName() == "tcpcl") 00064 { 00065 n.add(Node::URI(s.getParameters(), Node::CONN_TCPIP)); 00066 } 00067 else if (s.getName() == "udpcl") 00068 { 00069 n.add(Node::URI(s.getParameters(), Node::CONN_UDPIP)); 00070 } 00071 else 00072 { 00073 n.add(Node::Attribute(s.getName(), s.getParameters())); 00074 } 00075 } 00076 00077 // create and raise a new event 00078 dtn::core::NodeEvent::raise(n, NODE_INFO_UPDATED); 00079 } 00080 00081 void DiscoveryAgent::timeout() 00082 { 00083 // check if announcements are enabled 00084 if (_config.announce()) 00085 { 00086 IBRCOMMON_LOGGER_DEBUG(25) << "send discovery announcement" << IBRCOMMON_LOGGER_ENDL; 00087 00088 sendAnnoucement(_sn, _services); 00089 00090 // increment sequencenumber 00091 _sn++; 00092 } 00093 } 00094 } 00095 }