# Leon Seng and Ahmet Sekercioglu last modified: 23 May 2020 from random import expovariate, random import functools import simpy from SimComponents import PacketGenerator, PacketSink, PortMonitor from IQSwitchComponents import IQSwitchInputPort, IQSwitchOutputPort def run_sim(): # Create the SimPy environment # Operating in bytes unless specified otherwise link_rate_bps = 10e6 link_rate = link_rate_bps/8 link_load = 0.1 mean_packet_size = 300 mean_interarrival_time = mean_packet_size/(link_rate*link_load) input_queue_size = 10*mean_packet_size # bytes - should give an # indication of average queue # size when loaded env = simpy.Environment() # define elements interarrival_dist = functools.partial(expovariate, 1/mean_interarrival_time) size_dist = functools.partial(expovariate, 1/mean_packet_size) pg1 = PacketGenerator(env, "LAN1", adist=interarrival_dist, sdist=size_dist) pg2 = PacketGenerator(env, "LAN2", adist=interarrival_dist, sdist=size_dist) input_sp1 = IQSwitchInputPort(env, id="in1", qlimit=input_queue_size, limit_bytes=True, rate=link_rate_bps, probs=[0.5, 0.5]) input_sp2 = IQSwitchInputPort(env, id="in2", qlimit=input_queue_size, limit_bytes=True, rate=link_rate_bps, probs=[0.5, 0.5]) output_sp1 = IQSwitchOutputPort(env, rate=link_rate_bps, debug=True) output_sp2 = IQSwitchOutputPort(env, rate=link_rate_bps, debug=True) ps_debug = True ps1 = PacketSink(env, debug=True) ps2 = PacketSink(env, debug=ps_debug) # Wire packet generators and sinks together pg1.out = input_sp1 pg2.out = input_sp2 input_sp1.outs = [output_sp1, output_sp2] input_sp2.outs = [output_sp1, output_sp2] output_sp1.out = ps1 output_sp2.out = ps2 # Using a PortMonitor to track queue sizes over time sample_dist = lambda : 100*mean_interarrival_time pm = PortMonitor(env, input_sp1, dist=sample_dist) env.run(until=2) # print(pm.sizes) print(input_sp1.packets_drop) print(output_sp1.packets_drop) print(input_sp2.packets_drop) print(output_sp2.packets_drop) if __name__ == '__main__': run_sim()