mirror of
https://github.com/espressif/openthread.git
synced 2026-08-04 18:07:47 +00:00
[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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user