-
Notifications
You must be signed in to change notification settings - Fork 2
/
scale_send_to_all_neighbors.m
65 lines (52 loc) · 2.62 KB
/
scale_send_to_all_neighbors.m
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
function [Nodes_list] = scale_send_to_all_neighbors(Nodes_list, event)
% Send an event to a neighbor node
if isempty(Nodes_list(event.source).neighbors)
return;
end
% drop the message if its ttl is expired
if(event.ttl <= 0)
return;
end
neighbors = Nodes_list(event.source).neighbors;
%disp(sprintf('EVENT with message id# %d FORWARDED TO Neighbor ID %d', neighbor_id, event.id));
for k=1:numel(neighbors)
neighbor_id = neighbors(k).id;
% receiving node get its own event
if event.originator == event.source
Nodes_list(event.source).duplicated_events = Nodes_list(event.source).duplicated_events + 1;
continue;
end
%record total replayed_events
Nodes_list(event.source).relayed_events = Nodes_list(event.source).relayed_events + 1;
if ~isempty(Nodes_list(neighbor_id))
if Nodes_list(neighbor_id).status == 1
% record total received events
Nodes_list(neighbor_id).received_events = Nodes_list(neighbor_id).received_events + 1;
%Check to see if the node has received this event
if ~isempty(Nodes_list(neighbor_id).recieved_events_queue)
event_queue_index = find([Nodes_list(neighbor_id).recieved_events_queue(:).id] == event.id, 1);
if(isempty(event_queue_index))
Nodes_list(neighbor_id).recieved_events_queue = [Nodes_list(neighbor_id).recieved_events_queue, event];
else
Nodes_list(neighbor_id).duplicated_events = Nodes_list(neighbor_id).duplicated_events + 1;
end
else
Nodes_list(neighbor_id).recieved_events_queue = [Nodes_list(neighbor_id).recieved_events_queue, event];
end
action = [];
action.type = 'receiving';
action.packet_size = event.size;
Nodes_list(neighbor_id).power = scale_power_consumption(Nodes_list(neighbor_id).power, action);
% record total replayed events
Nodes_list(neighbor_id).relayed_events = Nodes_list(neighbor_id).relayed_events + 1;
% add the event into the neighbor's buffer
event.source = neighbor_id;
event.ttl = event.ttl - 1;
Nodes_list = scale_send_event(Nodes_list, event);
else
Nodes_list(neighbor_id).buffer = [Nodes_list(neighbor_id).buffer, event];
end
end
end
return;
end