Source code for simulator.ducts.DtnAbstractDuctMBLTP
import abc
from simulator.ducts.DtnAbstractDuctLTP import DtnAbstractDuctLTP
from simulator.utils.DtnUtils import load_class_dynamically
[docs]class DtnAbstractDuctMBLTP(DtnAbstractDuctLTP, metaclass=abc.ABCMeta):
""" An abstract Multiband LTP duct. It is subclassed by both ``DtnOuductMBLTP`` and
``DtnInductMBLTP``. It extends the capabilities of ``DtnAbstractDuctLTP`` by allowing:
1) Multiple LTP engines that have independent LTP configuration parameters
2) Mutliple radios, one per band, with its associated queues, data rates and BERs
The generation of unique session ids for a multiband LTP duct is different from an LTP duct.
For the latter, you use a hash based function (see ``DtnAbstractDuctLTP``). However, for the
multiband case you need the session ids to be sequential and therefore we use a counter object.
The need to have sequential session ids comes from the fact that a segment can arrive at an
induct for a session that has already succeeded and is no longer available. Therefore, we use
this sequential property to detect this corner case and not re-open a session for a block that
has already been delivered to the DTN node.
"""
def __init__(self, env, name, parent, neighbor):
# Call parent constructor
super(DtnAbstractDuctMBLTP, self).__init__(env, name, parent, neighbor)
# For a multi-band LTP, you will have more than one radio. Therefore, index
# them in a dictionary
self.radio = {}
# Counter for session ids
self.sid_counter = 0
def initialize(self, peer, *args, bands=None, **kwargs):
# Call DtnAbstractDuct initializer. Note that you are
# calling the constructor of the grandparent.
super(DtnAbstractDuctLTP, self).initialize(peer, **kwargs)
# Store the bands available in this duct
self.bands = bands
# Get the radios to use
self.radio = {b: self.parent.radios[kwargs[b]] for b in bands}
[docs] def get_session_id(self, block):
""" Utilize a global session counter. This is needed because session ids
must be sequential
"""
self.sid_counter += 1
return self.sid_counter
def total_datarate(self, dest):
return sum(r.datarate for r in self.radio.values())
@property
def radios(self):
return self.radio