29 #include <ibrcommon/Logger.h>
41 struct CompareNodeDestination:
42 public std::binary_function< dtn::core::Node, dtn::data::EID, bool > {
44 return node.
getEID() == destination;
49 : _next_autoconnect(0)
76 ibrcommon::MutexLock l(_cl_lock);
79 _cl_protocols.clear();
83 ibrcommon::MutexLock l(_node_lock);
88 _next_autoconnect = 0;
98 ibrcommon::MutexLock l(_node_lock);
99 const Node &n = nodeevent.getNode();
101 switch (nodeevent.getAction())
109 }
catch (
const ibrcommon::Exception&) {
131 switch (connection.getState())
135 add(connection.getNode());
141 remove(connection.getNode());
152 switch (global.getAction()) {
153 case GlobalEvent::GLOBAL_INTERNET_AVAILABLE:
157 case GlobalEvent::GLOBAL_INTERNET_UNAVAILABLE:
169 if(n.has(Node::CONN_EMAIL) && !n.getEID().getScheme().compare(
"mail") == 0)
173 std::list<Node::URI> uri = node.
get(Node::CONN_EMAIL);
174 for(std::list<Node::URI>::iterator iter = uri.begin(); iter != uri.end(); iter++)
178 (*iter).decode(address, port);
185 updateNeighbor(fakeNode);
192 if(node.
getAll().size() == 0)
196 updateNeighbor(node);
201 ibrcommon::MutexLock l(_node_lock);
202 pair<nodemap::iterator,bool> ret = _nodes.insert( pair<dtn::data::EID, dtn::core::Node>(n.getEID(), n) );
212 if (old != db.
size()) {
217 IBRCOMMON_LOGGER_DEBUG_TAG(
"ConnectionManager", 56) <<
"New node available: " << db << IBRCOMMON_LOGGER_ENDL;
230 ibrcommon::MutexLock l(_node_lock);
239 if (old != db.
size()) {
244 IBRCOMMON_LOGGER_DEBUG_TAG(
"ConnectionManager", 56) <<
"Node attributes removed: " << db << IBRCOMMON_LOGGER_ENDL;
250 ibrcommon::MutexLock l(_cl_lock);
257 ibrcommon::MutexLock l(_cl_lock);
261 _cl_protocols.clear();
262 for (std::set<ConvergenceLayer*>::const_iterator iter = _cl.begin(); iter != _cl.end(); ++iter)
271 ibrcommon::MutexLock l(_cl_lock);
272 for (std::set<ConvergenceLayer*>::const_iterator iter = _cl.begin(); iter != _cl.end(); ++iter)
281 ibrcommon::MutexLock l(_cl_lock);
282 for (std::set<ConvergenceLayer*>::iterator iter = _cl.begin(); iter != _cl.end(); ++iter)
291 ibrcommon::MutexLock l(_dialup_lock);
292 _dialups.insert(ext);
297 ibrcommon::MutexLock l(_dialup_lock);
310 bool ConnectionManager::isReachable(
const dtn::core::Node &node)
throw ()
312 const std::list<Node::URI> urilist = node.getAll();
314 for (std::list<Node::URI>::const_iterator uri_it = urilist.begin(); uri_it != urilist.end(); ++uri_it)
318 if (uri.
type == Node::NODE_P2P_DIALUP)
321 ibrcommon::MutexLock l(_dialup_lock);
324 for (std::set<P2PDialupExtension*>::iterator iter = _dialups.begin(); iter != _dialups.end(); ++iter)
337 ibrcommon::MutexLock l(_cl_lock);
340 for (std::set<ConvergenceLayer*>::iterator iter = _cl.begin(); iter != _cl.end(); ++iter)
355 void ConnectionManager::check_available()
357 ibrcommon::MutexLock l(_node_lock);
360 for (nodemap::iterator iter = _nodes.begin(); iter != _nodes.end(); ++iter)
374 void ConnectionManager::check_unavailable()
376 ibrcommon::MutexLock l(_node_lock);
379 nodemap::iterator iter = _nodes.begin();
380 while ( iter != _nodes.end() )
403 _nodes.erase( iter++ );
412 void ConnectionManager::check_autoconnect()
414 std::queue<dtn::core::Node> connect_nodes;
417 if (interval == 0)
return;
422 ibrcommon::MutexLock l(_node_lock);
423 for (nodemap::const_iterator iter = _nodes.begin(); iter != _nodes.end(); ++iter)
425 const Node &n = (*iter).second;
426 std::list<Node::URI> ul = n.
get(Node::NODE_CONNECTED, Node::CONN_TCPIP);
428 if (ul.empty() && n.
isAvailable() && isReachable(n))
430 connect_nodes.push(n);
438 while (!connect_nodes.empty())
441 open(connect_nodes.front());
442 }
catch (
const ibrcommon::Exception&) {
451 const std::list<Node::URI> urilist = node.getAll();
453 for (std::list<Node::URI>::const_iterator uri_it = urilist.begin(); uri_it != urilist.end(); ++uri_it)
457 if (uri.
type == Node::NODE_P2P_DIALUP)
460 ibrcommon::MutexLock l(_dialup_lock);
461 for (std::set<P2PDialupExtension*>::iterator iter = _dialups.begin(); iter != _dialups.end(); ++iter)
475 ibrcommon::MutexLock l(_cl_lock);
478 for (std::set<ConvergenceLayer*>::iterator iter = _cl.begin(); iter != _cl.end(); ++iter)
498 ibrcommon::MutexLock l(_node_lock);
504 IBRCOMMON_LOGGER_DEBUG_TAG(
"ConnectionManager", 2) <<
"next hop: " << n << IBRCOMMON_LOGGER_ENDL;
508 ibrcommon::MutexLock lcl(_cl_lock);
511 for (std::set<ConvergenceLayer*>::iterator iter = _cl.begin(); iter != _cl.end(); ++iter)
526 ibrcommon::MutexLock ldu(_dialup_lock);
527 for (std::set<P2PDialupExtension*>::iterator iter = _dialups.begin(); iter != _dialups.end(); ++iter)
537 for (std::list<Node::URI>::const_iterator uri_it = urilist.begin(); uri_it != urilist.end(); ++uri_it)
540 if (p2puri.
type == Node::NODE_CONNECTED) {
563 ibrcommon::MutexLock l(_cl_lock);
564 return _cl_protocols;
572 const std::list<Node::URI> protocols = node.
getAll();
575 ibrcommon::MutexLock l(_cl_lock);
577 for (std::list<Node::URI>::const_iterator iter = protocols.begin(); iter != protocols.end(); ++iter)
580 if (uri.
type == Node::NODE_P2P_DIALUP || _cl_protocols.find(uri.
protocol) != _cl_protocols.end())
591 ibrcommon::MutexLock l(_node_lock);
593 std::set<dtn::core::Node> ret;
595 for (nodemap::const_iterator iter = _nodes.begin(); iter != _nodes.end(); ++iter)
597 const Node &n = (*iter).second;
598 if (n.
isAvailable() && isReachable(n)) ret.insert( n );
606 ibrcommon::MutexLock l(_node_lock);
607 const Node &n = getNode(eid);
616 ibrcommon::MutexLock l(_node_lock);
617 const Node &n = getNode(node.getEID());
618 if (n.
isAvailable() && isReachable(n))
return true;
631 return "ConnectionManager";
636 nodemap::iterator iter = _nodes.find(eid);
638 return (*iter).second;
static Configuration & getInstance(bool reset=false)
const std::set< dtn::core::Node > getNeighbors()
static dtn::data::EID local
virtual ~ConnectionManager()
static void add(EventReceiver< E > *receiver)
dtn::data::Size size() const
virtual void open(const dtn::core::Node &)
bool isNeighbor(const dtn::core::Node &)
virtual void componentUp()
void remove(const dtn::core::Node &n)
std::list< dtn::core::Node::Protocol > protocol_list
virtual void componentDown()
static void remove(const EventReceiver< E > *receiver)
void setAnnounced(bool val)
void getStats(dtn::net::ConvergenceLayer::stats_data &data)
void addRoute(const dtn::data::EID &destination, const dtn::data::EID &nexthop, const dtn::data::Timeout timeout=0)
void remove(const URI &u)
virtual void resetStats()
const Configuration::Network & getNetwork() const
void add(const dtn::core::Node &n)
void discovered(const dtn::core::Node &node)
std::set< dtn::core::Node::Protocol > protocol_set
const dtn::data::EID & getNeighbor() const
void queue(dtn::net::BundleTransfer &job)
bool doConnectImmediately() const
virtual dtn::core::Node::Protocol getProtocol() const =0
virtual void getStats(ConvergenceLayer::stats_data &data) const
std::map< string, string > stats_data
dtn::core::Node::Protocol getProtocol() const
const protocol_set getSupportedProtocols()
virtual const std::string getName() const
static dtn::data::Timestamp getTime()
virtual void queue(const dtn::core::Node &n, const dtn::net::BundleTransfer &job)=0
std::list< URI > get(Node::Protocol proto) const
void abort(const TransferAbortedEvent::AbortReason reason)
virtual dtn::core::Node::Protocol getDiscoveryProtocol() const =0
static void raise(const Node &n, const EventNodeAction action)
virtual void connect(const dtn::core::Node::URI &uri)=0
const dtn::data::EID & getEID() const
void raiseEvent(const dtn::core::TimeEvent &evt)
void updateNeighbor(const dtn::core::Node &n)
std::list< Node::URI > getAll() const
const dtn::core::Node getNeighbor(const dtn::data::EID &eid)
void open(const dtn::core::Node &node)
dtn::data::Timeout getAutoConnect() const
static BundleCore & getInstance()