Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from collections import Iterable
from .buffer import Buffer
from .core import TickProcess
def NodeFactory(router, **kwargs):
def factory(network, nid):
return Node(network, nid, router=router, **kwargs)
return factory
class Node(TickProcess):
''''''
def __init__(self, network, nid,
buffer_size=None, tick_time=1, router=None):
''''''
super().__init__(tick_time)
self.env = network.env
self.network = network
self.id = nid
self.buffer = Buffer(self.env, capacity=buffer_size)
if router is None:
router = routers['direct']
self.router = router(self)
self.start(self.env)
def route_packets(self):
packets_to_delete = []
for packet in self.buffer:
# remove expired packets from buffer
if packet.expired(self.env.now):
packets_to_delete.append(packet)
continue
# ask the router what to do
targets, reason, delete = self.router(packet)
# check if there are targets to send to
if targets is None:
continue
# allow for targets to be iterable or single item
if not isinstance(targets, Iterable):
targets = [targets]
# send the packet
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()
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:
packet.recv()
else:
self.buffer.add(packet)
@property
def community(self):
return self.network.community[self]
@property
def links(self):
'''
Returns a list of connected links.
'''
links = {
met: data
for met, data in self.network[self].items()
if data['state']
}
return links
def __repr__(self):
return 'Node(id={})'.format(self.id)