Source code for simulator.generators.DtnFileGenerator

import numpy as np
import random
from simulator.core.DtnBundle import Bundle
from simulator.generators.DtnAbstractGenerator import DtnAbstractGenerator

[docs]class DtnFileGenerator(DtnAbstractGenerator): def initialize(self): # Get generator properties self.file_sz = self.props.size # in [bits] self.tstart = self.props.tstart # in [sec] from start of simulation. # Get bundle properties self.data_type = self.props.data_type self.bundle_sz = self.props.bundle_size self.bundle_lat = self.props.bundle_TTL self.critical = self.props.critical self.repeat = self.props.repeat self.wait = self.props.wait # Get origin and destination self.orig = self.parent.nid self.dest = self.props.destination # Compute how many bundles to generate self.Nbnd = int(np.ceil(self.file_sz / self.bundle_sz)) # Run generator self.env.process(self.run()) def run(self): # Wait until it is time to start this flow yield self.env.timeout(self.tstart) # Initialize variables nodes = list(self.env.nodes.keys()) nodes.remove(self.parent.nid) # Get random indices if necessary if not self.dest: rnd_idx = np.random.randint(0, high=len(nodes), size=(self.repeat,)) # Send file as many times as needed for i in range(self.repeat): # Choose destination at random dest = self.dest if self.dest else nodes[rnd_idx[i]] # Create all the bundles for this file at once for _ in range(self.Nbnd): # Create the new bundle new_bundle = self.new_bundle(dest) # Monitor the new bundle creation self.monitor_new_bundle(new_bundle) # Log the new bundle creation self.disp('{} is created at node {}', new_bundle, self.parent.nid) # If the node is no longer alive, you are done if self.is_alive == False: yield self.env.exit() # Schedule routers of bundle self.parent.forward(new_bundle) # Wait for a while before sending the file again yield self.env.timeout(self.wait)
[docs] def predicted_data_vol(self): return self.Nbnd*self.bundle_sz*self.repeat
def new_bundle(self, dest): return Bundle(self.env, self.orig, dest, self.data_type, self.bundle_sz, self.bundle_lat, self.critical, fid=self.fid, TTL=self.bundle_lat)