Source code for simulator.routers.DtnStaticRouter
from .DtnAbstractRouter import DtnAbstractRouter, RtRecord
import numpy as np
[docs]class DtnStaticRouter(DtnAbstractRouter):
def initialize(self):
# Get the static routes
self.next_hop = self.props.routes
# Down-select the routes for this node
self.next_hop = self.next_hop[self.parent.nid] if self.parent.nid \
in self.next_hop else None
[docs] def find_routes(self, bundle, first_time, **kwargs):
# If this node does not have any routes assigned to it, throw error
# TODO: This should be checked in a parser
if not self.next_hop:
raise RuntimeError(f'Node {self.parent.nid} does not have any '
f'routes specified and uses a static router')
# Increase counter
self.counter += 1
# Figure out the priority of this bundle (0=critical, 1=false)
priority = self.find_bundle_priority(bundle)
# Initialize variables
con = {'cid': None, 'orig': self.parent.nid, 'dest': None, 'tstart': 0.0, 'tend': np.inf,
'duration': np.inf, 'capacity': np.inf, 'range': np.nan, 'rate': np.nan}
rte = {'tstart': 0.0, 'tend': np.inf, 'contacts': ()}
# If there is a route indicated, use it
if bundle.dest in self.next_hop: con['dest'] = self.next_hop[bundle.dest]
# If there is a default next hop, use it
if 'default' in self.next_hop: con['dest'] = self.next_hop['default']
# If the next hop could not be computed, return empty. At the DtnNode, this will
# force the bundle to be dropped since you do not know how to route it. Therefore,
# the limbo is not used in this case.
if not con['dest']: return [], []
# If you reach this point, create a routing record and use it
rec = RtRecord(bundle=bundle, contact=con, route=rte, priority=priority, neighbor=con['dest'])
# Return a record
return [rec], []