[virtual-time-simulator] optimize ACK radio events (#5559)

This commit optimizes Virtual Time Simulator by only sending ACK to
nodes that are expecting it.
This commit is contained in:
Simon Lin
2020-10-30 12:28:39 -07:00
committed by GitHub
parent a6e8848a5e
commit 050129a819
3 changed files with 162 additions and 1 deletions
+23 -1
View File
@@ -40,6 +40,7 @@ import config
import mesh_cop
import message
import pcap
import wpan
def dbg_print(*args):
@@ -162,6 +163,8 @@ class VirtualTime(BaseSimulator):
self.current_time = 0
self.current_event = None
self.awake_devices = set()
self._nodes_by_ack_seq = {}
self._node_ack_seq = {}
self._pcap = pcap.PcapCodec(os.getenv('TEST_NAME', 'current'))
# the addr for spinel-cli sending OT_SIM_EVENT_POSTCMD
@@ -325,7 +328,15 @@ class VirtualTime(BaseSimulator):
elif type == self.OT_SIM_EVENT_RADIO_RECEIVED:
assert self._is_radio(addr)
# add radio receive events event queue
for device in self.devices:
frame_info = wpan.dissect(data)
recv_devices = None
if frame_info.frame_type == wpan.FrameType.ACK:
recv_devices = self._nodes_by_ack_seq.get(frame_info.seq_no)
recv_devices = recv_devices or self.devices.keys()
for device in recv_devices:
if device != addr and self._is_radio(device):
event = (
event_time,
@@ -354,6 +365,9 @@ class VirtualTime(BaseSimulator):
self.event_sequence += 1
bisect.insort(self.event_queue, event)
if frame_info.frame_type != wpan.FrameType.ACK and not frame_info.is_broadcast:
self._on_ack_seq_change(addr, frame_info.seq_no)
self.awake_devices.add(addr)
elif type == self.OT_SIM_EVENT_RADIO_SPINEL_WRITE:
@@ -400,6 +414,14 @@ class VirtualTime(BaseSimulator):
if self.current_nodeid == nodeid:
self.current_nodeid = None
def _on_ack_seq_change(self, device: tuple, seq_no: int):
old_seq = self._node_ack_seq.pop(device, None)
if old_seq is not None:
self._nodes_by_ack_seq[old_seq].remove(device)
self._node_ack_seq[device] = seq_no
self._nodes_by_ack_seq.setdefault(seq_no, set()).add(device)
def _send_message(self, message, addr):
while True:
try: