Source code for simulator.routers.DtnAbstractRouter

import abc
from collections import namedtuple
from simulator.core.DtnCore import Simulable

""" A routing record to be returned by a router when a bundle needs to be
    routed in the network. It contains the following information:
    
    1) bundle: The bundle that this record applies to
    2) neighbor: ID of the duct through which to send (see ``DtnNode.store_routed_bundle``)
    3) contact: Next contact in the route as a dictionary
        ``{'cid': Contact id in the contact plan. If not known (e.g. static routing), use None 
           'orig': 'N1',
           'dest': 'N2',        
           'tstart': 0.0,
           'tend': 63072000.0,
           'duration': 63072000,
           'capacity': 79218432000000.0,
           'range': 600,
           'rate': 1256000.0}``
    4) route: End to end route that has been computed for this bundle along
              with information on the route validity
              - Example 1 (from CGR):    ``{'contacts': (1,), 'tend': 63072000, 'tstart': 0}``
              - Example 2 (from static): ``{'contacts': (),   'tend': np.inf,   'tstart': 0}``
    5) priority: 0 if critical, 1 if standard
"""
class RtRecord():
    def __init__(self, bundle=None, contact=None, route=None,
                 priority=None, neighbor=None):
        self.bundle   = bundle
        self.contact  = contact
        self.route    = route
        self.priority = priority
        self.neighbor = neighbor

    def to_dict(self):
        if self.bundle is None:
            return {}

        d = self.bundle.to_dict()
        d['neighbor'] = self.neighbor
        d.update(self.contact)

        return d

[docs]class DtnAbstractRouter(Simulable, metaclass=abc.ABCMeta): """ An abstract router """ def __init__(self, env, parent): # Call parent constructor super(DtnAbstractRouter, self).__init__(env) # Initialize variables self.parent = parent self.type = self.config[parent.type].router self.props = self.config[self.type] # Counter for number of times the routing procedure is called self.counter = 0 # If this router is opportunistic in nature, flag it # By default, assume false self.opportunistic = False def reset(self): pass @abc.abstractmethod def initialize(self, *args, **kwargs): pass @property def is_alive(self): return self.parent.is_alive
[docs] @abc.abstractmethod def find_routes(self, bundle, first_time, **kwargs): """ This function is called by the DtnNode to route a bundle :param bundle: Bundle to route :param first_time: True if this is the first time this is routed :param kwargs: Arguments specific to each router :return: Tuple with the following elements (in this order): 1) List of RtRecords to use when forwarding this bundle. The contact within the RtRecord will be used to infer which neighbor to forward this bundle towards. If none, return empty list ([]). 2) List of cids (i.e. list of integers) that indicate which contacts should not be used to forward this bundle. They are provided to the node's limbo function that adds them to the bundle excluded node. If none, return empty list ([]). .. tip:: If the return value of this function is ([], []), then the bundle will be dropped. """ pass
[docs] def find_bundle_priority(self, bundle): ''' 0=critical, 256=bulk ''' return bundle.priority