40 #include <ibrcommon/Logger.h>
41 #include <ibrcommon/thread/MutexLock.h>
50 const std::string StaticRoutingExtension::TAG =
"StaticRoutingExtension";
62 for (std::list<StaticRoute*>::iterator iter = _routes.begin();
63 iter != _routes.end(); ++iter)
81 : _entry(entry), _routes(routes), _plist(plist), _context(context)
86 virtual dtn::data::Size limit()
const throw () {
return _entry.getFreeTransferSlots(); };
111 if (_entry.has(meta))
121 for (std::list<const StaticRoute*>::const_iterator iter = _routes.begin(); iter != _routes.end(); ++iter)
128 for (dtn::net::ConnectionManager::protocol_list::const_iterator it = _plist.begin(); it != _plist.end(); ++it)
153 const std::list<const StaticRoute*> &_routes;
161 for (std::multimap<std::string, std::string>::const_iterator iter = routes.begin(); iter != routes.end(); ++iter)
172 std::list<const StaticRoute*> routes;
175 Task *t = _taskqueue.poll();
176 std::auto_ptr<Task> killer(t);
178 IBRCOMMON_LOGGER_DEBUG_TAG(StaticRoutingExtension::TAG, 5) <<
"processing task " << t->toString() << IBRCOMMON_LOGGER_ENDL;
181 SearchNextBundleTask &task =
dynamic_cast<SearchNextBundleTask&
>(*t);
190 for (std::list<StaticRoute*>::const_iterator iter = _routes.begin();
191 iter != _routes.end(); ++iter)
197 routes.push_back(route);
206 ibrcommon::MutexLock l(db);
226 IBRCOMMON_LOGGER_DEBUG_TAG(StaticRoutingExtension::TAG, 40) <<
"search some bundles not known by " << task.eid.getString() << IBRCOMMON_LOGGER_ENDL;
229 (**this).getSeeker().get(filter, list);
233 for (RoutingResult::const_iterator iter = list.begin(); iter != list.end(); ++iter)
237 transferTo(task.eid, (*iter).first, (*iter).second);
242 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
244 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
246 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
248 IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) <<
"task " << t->toString() <<
" aborted: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
249 }
catch (
const std::bad_cast&) { };
252 const ProcessBundleTask &task =
dynamic_cast<ProcessBundleTask&
>(*t);
253 IBRCOMMON_LOGGER_DEBUG_TAG(StaticRoutingExtension::TAG, 50) <<
"search static route for " << task.bundle.toString() << IBRCOMMON_LOGGER_ENDL;
259 for (std::list<StaticRoute*>::const_iterator iter = _routes.begin(); iter != _routes.end(); ++iter)
263 IBRCOMMON_LOGGER_DEBUG_TAG(StaticRoutingExtension::TAG, 50) <<
"check static route: " << route.
toString() << IBRCOMMON_LOGGER_ENDL;
266 if (route.
match(task.bundle.destination))
272 ibrcommon::MutexLock l(db);
276 if (entry.
has(task.bundle))
continue;
289 for (dtn::net::ConnectionManager::protocol_list::const_iterator it = plist.begin(); it != plist.end(); ++it)
315 }
catch (
const std::bad_cast&) { };
318 const RouteChangeTask &task =
dynamic_cast<RouteChangeTask&
>(*t);
321 for (std::list<StaticRoute*>::iterator iter = _routes.begin();
322 iter != _routes.end();)
325 if (route->
equals(*task.route))
328 _routes.erase(iter++);
336 if (task.type == RouteChangeTask::ROUTE_ADD)
338 _routes.push_back(task.route);
339 _taskqueue.push(
new SearchNextBundleTask(task.route->getDestination()) );
341 if (task.route->getExpiration() > 0)
343 ibrcommon::MutexLock l(_expire_lock);
344 if (next_expire == 0 || next_expire > task.route->getExpiration())
346 next_expire = task.route->getExpiration();
355 ibrcommon::MutexLock l(_expire_lock);
358 }
catch (
const bad_cast&) { };
361 dynamic_cast<ClearRoutesTask&
>(*t);
364 for (std::list<StaticRoute*>::iterator iter = _routes.begin();
365 iter != _routes.end(); ++iter)
372 ibrcommon::MutexLock l(_expire_lock);
374 }
catch (
const bad_cast&) { };
377 const ExpireTask &task =
dynamic_cast<ExpireTask&
>(*t);
379 ibrcommon::MutexLock l(_expire_lock);
383 for (std::list<StaticRoute*>::iterator iter = _routes.begin();
384 iter != _routes.end();)
392 _routes.erase(iter++);
396 if ((next_expire == 0) || (next_expire > route->
getExpiration()))
404 }
catch (
const bad_cast&) { };
406 }
catch (
const std::exception &ex) {
407 IBRCOMMON_LOGGER_DEBUG_TAG(StaticRoutingExtension::TAG, 15) <<
"terminated due to " << ex.what() << IBRCOMMON_LOGGER_ENDL;
417 _taskqueue.push(
new SearchNextBundleTask(peer) );
422 _taskqueue.push(
new ProcessBundleTask(meta, peer) );
430 ibrcommon::MutexLock l(_expire_lock);
431 if ((next_expire != 0) && (next_expire < monotonic))
433 _taskqueue.push(
new ExpireTask( monotonic ) );
442 _taskqueue.push(
new ClearRoutesTask() );
448 if (route.pattern.length() > 0)
454 r =
new EIDRoute(route.pattern, route.nexthop, et);
460 r =
new EIDRoute(route.destination, route.nexthop, et);
466 _taskqueue.push(
new RouteChangeTask( RouteChangeTask::ROUTE_ADD, r ) );
470 _taskqueue.push(
new RouteChangeTask( RouteChangeTask::ROUTE_DEL, r ) );
490 }
catch (
const ibrcommon::ThreadException &ex) {
491 IBRCOMMON_LOGGER_TAG(StaticRoutingExtension::TAG, error) <<
"componentUp failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
505 }
catch (
const ibrcommon::ThreadException &ex) {
506 IBRCOMMON_LOGGER_TAG(StaticRoutingExtension::TAG, error) <<
"componentDown failed: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
516 : _nexthop(nexthop), _match(match), expiretime(et)
520 StaticRoutingExtension::EIDRoute::~EIDRoute()
524 bool StaticRoutingExtension::EIDRoute::match(
const dtn::data::EID &eid)
const
526 return _match.sameHost(eid);
529 const dtn::data::EID& StaticRoutingExtension::EIDRoute::getDestination()
const
538 const std::string StaticRoutingExtension::EIDRoute::toString()
const
540 std::stringstream ss;
541 ss << _match.
getString() <<
" => " << _nexthop.getString();
550 void StaticRoutingExtension::EIDRoute::raiseExpired()
const
555 bool StaticRoutingExtension::EIDRoute::equals(
const StaticRoute &route)
const
558 const StaticRoutingExtension::EIDRoute &r =
dynamic_cast<const StaticRoutingExtension::EIDRoute&
>(route);
559 return (_nexthop == r._nexthop) && (_match == r._match);
560 }
catch (
const std::bad_cast&) {
567 StaticRoutingExtension::SearchNextBundleTask::SearchNextBundleTask(
const dtn::data::EID &e)
571 StaticRoutingExtension::SearchNextBundleTask::~SearchNextBundleTask()
574 std::string StaticRoutingExtension::SearchNextBundleTask::toString()
576 return "SearchNextBundleTask: " + eid.
getString();
582 : bundle(meta), origin(o)
585 StaticRoutingExtension::ProcessBundleTask::~ProcessBundleTask()
588 std::string StaticRoutingExtension::ProcessBundleTask::toString()
590 return "ProcessBundleTask: " + bundle.toString();
595 StaticRoutingExtension::ClearRoutesTask::ClearRoutesTask()
599 StaticRoutingExtension::ClearRoutesTask::~ClearRoutesTask()
603 std::string StaticRoutingExtension::ClearRoutesTask::toString()
605 return "ClearRoutesTask";
610 StaticRoutingExtension::RouteChangeTask::RouteChangeTask(CHANGE_TYPE t, StaticRoute *r)
616 StaticRoutingExtension::RouteChangeTask::~RouteChangeTask()
621 std::string StaticRoutingExtension::RouteChangeTask::toString()
623 return "RouteChangeTask: " + (*route).toString();
634 StaticRoutingExtension::ExpireTask::~ExpireTask()
639 std::string StaticRoutingExtension::ExpireTask::toString()
641 std::stringstream ss;
642 ss <<
"ExpireTask: " << timestamp.toString();
static Configuration & getInstance(bool reset=false)
static dtn::data::EID local
static void add(EventReceiver< E > *receiver)
virtual void raiseExpired() const =0
virtual bool match(const dtn::data::EID &eid) const =0
std::list< dtn::core::Node::Protocol > protocol_list
bool isTransferThresholdReached() const
virtual void eventDataChanged(const dtn::data::EID &peer)
static void remove(const EventReceiver< E > *receiver)
bool has(const dtn::data::BundleID &, const bool require_bloomfilter=false) const
NeighborDatabase::NeighborEntry & get(const dtn::data::EID &eid, bool noCached=false)
dtn::net::ConnectionManager & getConnectionManager()
static void raiseEvent(CHANGE_TYPE type)
virtual void eventBundleQueued(const dtn::data::EID &peer, const dtn::data::MetaBundle &meta)
BundleFilter::ACTION evaluate(BundleFilter::TABLE table, const FilterContext &context) const
void setProtocol(const dtn::core::Node::Protocol &protocol)
const Configuration::Network & getNetwork() const
virtual bool equals(const StaticRoute &route) const =0
void setPeer(const dtn::data::EID &endpoint)
void transferTo(const dtn::data::EID &destination, const dtn::data::MetaBundle &meta, const dtn::core::Node::Protocol)
void setMetaBundle(const dtn::data::MetaBundle &data)
const protocol_set getSupportedProtocols()
const std::multimap< std::string, std::string > & getStaticRoutes() const
void raiseEvent(const dtn::core::TimeEvent &evt)
virtual const std::string toString() const =0
std::string getString() const
virtual const std::string getTag() const
static dtn::data::Timestamp getMonotonicTimestamp()
virtual const dtn::data::Timestamp & getExpiration() const =0
void setRouting(const dtn::routing::RoutingExtension &routing)
virtual ~StaticRoutingExtension()
virtual const dtn::data::EID & getDestination() const =0
static BundleCore & getInstance()