Source code for simulator.ducts.outducts.DtnOutductBasic
# -*- coding: utf-8 -*-
from simulator.ducts.DtnAbstractDuct import DtnAbstractDuct
[docs]class DtnOutductBasic(DtnAbstractDuct):
duct_type = 'outduct'
def __init__(self, env, name, parent, neighbor):
super(DtnOutductBasic, self).__init__(env, name, parent, neighbor)
def initialize(self, peer, radio='', **kwargs):
# Call the parent initializer
super(DtnOutductBasic, self).initialize(peer)
# Get all the connections for this duct
self.outcons = {d: self.env.connections[o, d] for o, d in
self.env.connections if o == self.parent.nid}
# Get the radio
self.radio = self.parent.available_radios[radio]
def total_datarate(self, dest):
return self.radio.datarate
@property
def radios(self):
return {}
[docs] def radio_error(self, message):
pass
[docs] def run(self):
""" Send through a BasicRadio that is shared by all outducts """
while self.is_alive:
# Wait until there is something to transmit
message = yield from self.in_queue.get()
# Log ready to transmit
self.disp('{} starts transmission', message)
# Send through radio
self.radio.put(self.neighbor, message, self.peer, self.transmit_mode)
# Notify the success of this message
self.notify_success(message)
# Log exit of convergence layer
self.disp('{} ends transmission (no propagation delay yet)', message)
[docs] def deprecated_run(self):
""" DEPRECATED! DOES NOT USE A RADIO AS A SHARED RESOURCE! """
# Get the relevant connection
conn = self.outcons[self.neighbor]
while self.is_alive:
# Wait until there is something to transmit
message = yield from self.in_queue.get()
# Log ready to transmit
self.disp('{} starts transmission', message)
# Transmit the bundle
while True:
# Wait while bundle is being transmitted
yield self.env.timeout(message.num_bits/self.datarate) # UNCOMMENT FOR SIMULATION
# If the connection has ended by now, then wait for next contact
# to this neighbor. When it starts, you have to retransmit, hence the while.
# NOTE: This model a bundle that does not have time to exit at the convergence layer.
# I assume that it will be re-transmitted, as if there was an ARQ mechanism or similar.
if conn.active.is_red: yield conn.active.green; continue
# If you reach this point then the bundle has been transmitted while the connection
# is active, so you can exit the loop
break
# Transmit the message through an error-less connection.
# This is a non-blocking call since the bundle is out in transit
conn.transmit(self.peer, message, 0.0)
# Notify the success of this message
self.notify_success(message)
# Log exit of convergence layer
self.disp('{} ends transmission (no propagation delay yet)', message)
def __str__(self):
return "<BasicOutduct {}-{}>".format(self.parent.nid, self.neighbor)
def __repr__(self):
return str(self)