Skip to content
Snippets Groups Projects
Commit 6fb0abc9 authored by Jarrod Pas's avatar Jarrod Pas
Browse files

Adds bandwidth delay to routers

parent 28e81adf
No related branches found
No related tags found
1 merge request!3Version 0.2
......@@ -82,10 +82,10 @@ class Network:
def send_link(self, a, b, packet):
''''''
if self.graph[a][b]['state']:
# TODO: transfer delay
b.recv(packet)
return True
else:
raise Exception('Nodes {} and {} not connected'.format(a, b))
return False
def __getitem__(self, node):
''''''
......
from collections import Iterable
from simpy import Store
from .buffer import Buffer
from .core import TickProcess
......@@ -19,6 +21,8 @@ class Node(TickProcess):
self.network = network
self.id = nid
self.bandwidth = float('inf')
self.buffer = Buffer(self.env, capacity=buffer_size)
if router is None:
......@@ -27,6 +31,8 @@ class Node(TickProcess):
self.start(self.env)
self.transfer_queue = Store(self.env)
def route_packets(self):
packets_to_delete = []
......@@ -47,26 +53,47 @@ class Node(TickProcess):
if not isinstance(targets, Iterable):
targets = [targets]
# send the packet
self.send(targets, packet, reason)
# add the packet to the transfer queue
self.transfer_queue.put((packet, targets, reason))
#self.send(targets, packet, reason)
# if the router requested deletion from the buffer do it
if delete:
packets_to_delete.append(packet)
for packet in packets_to_delete:
self.buffer.remove(packet)
def process(self, **kwargs):
''''''
while True:
yield self.tick()
packet, targets, reason = yield self.transfer_queue.get()
# simulate transfer delay of packet
delay = packet.size / self.bandwidth
yield self.env.timeout(delay)
success = []
# simulates broadcast
for target in targets:
# try sending packet
if self.network.send_link(self, target, packet):
success.append(target)
self.router.on_send_success(target, packet)
else:
self.router.on_send_failure(target, packet)
packet.send(self, success, reason=reason)
'''
def send(self, targets, packet, reason):
# TODO: transfer delay
packet.send(self, targets, reason=reason)
for target in targets:
self.network.send_link(self, target, packet)
'''
def recv(self, packet):
if packet.destination == self:
......@@ -78,17 +105,19 @@ class Node(TickProcess):
def community(self):
return self.network.community[self]
def connected_to(self, other):
return self.network[self][other]['state']
@property
def links(self):
'''
Returns a list of connected links.
'''
links = {
return {
met: data
for met, data in self.network[self].items()
if data['state']
if self.connected_to(met)
}
return links
def __repr__(self):
return 'Node(id={})'.format(self.id)
......
......@@ -61,6 +61,7 @@ class Packet:
self.destination = destination
self.ttl = ttl
self.payload = payload
self.size = 0
self.path = []
......
......@@ -11,3 +11,8 @@ class Router:
def __call__(self, packet):
raise NotImplementedError
def on_send_success(self, packet, target):
pass
def on_send_failure(self, packet, target):
pass
......@@ -17,3 +17,6 @@ class BubbleRouter(CommunityRouter):
return None, None, False
def on_send_failure(self, target, packet):
self.node.buffer.add(packet)
......@@ -6,3 +6,6 @@ class DirectRouter(Router):
return packet.destination, 'direct', True
return None, None, False
def on_send_failure(self, target, packet):
self.node.buffer.add(packet)
......@@ -17,9 +17,6 @@ class EpidemicRouter(Router):
if met not in self.sent[packet]
]
# update set of nodes a packet was sent to
self.sent[packet].update(targets)
# return list of nodes to send packet to
# (targets, remove from buffer, reason)
if targets:
......@@ -27,3 +24,6 @@ class EpidemicRouter(Router):
else:
return None, None, False
def on_send_success(self, target, packet):
self.sent[packet].add(target)
......@@ -33,3 +33,6 @@ class HCBFRouter(CommunityRouter):
return None, None, False
def on_send_failure(self, target, packet):
self.node.buffer.add(packet)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment