marker: key _marker_filter_bridges by (name, link_id) so multi-link nodes toggle every copy

The _marker_filter_bridges dict was keyed by marker name alone, so when one
node hosted the same filter name on several links (IUOL-BRIDGE per node with
many bays/units, or a multi-interface router), successive apply calls
overwrote earlier entries. pause_marker_definition then toggled only the last
recorded bridge/location — other copies stayed active and kept emitting.

Key by (name, link_id) so each copy is independent, and iterate all matching
entries in _ubridge_set_marker_filter_state (both generic bridge and IOU
iol_bridge override). Toggle route existence checks also iterate matching
names. Tests updated.
This commit is contained in:
YueGuobin committed 2026-08-02 23:48:24 +08:00
1 parent 34b644a548
commit ff907da5f6
9 files changed
+25 -28

No files matched your search

+5 -8
View File
@@ -1330,18 +1330,15 @@ class IOUVM(BaseNode):
str(self.project.id), self._id, name, link_id, tag
)
# Record name -> location (bridge bay unit) for instant toggle.
self._marker_filter_bridges[name] = location
self._marker_filter_bridges[name, link_id] = location
async def _ubridge_set_marker_filter_state(self, name, enabled):
"""IOU override: toggle via ``iol_bridge enable_packet_filter <bridge> <bay> <unit> <name> on|off``."""
"""IOU override: toggle every (name, link_id) entry via ``iol_bridge``."""
location = self._marker_filter_bridges.get(name)
if not location:
# Marker not installed on this uBridge (node not started, or not yet
# applied); controller-layer `enabled` is authoritative. No-op.
return
state = "on" if enabled else "off"
await self._ubridge_send(f"iol_bridge enable_packet_filter {location} {name} {state}")
for (n, lid), location in list(self._marker_filter_bridges.items()):
if n == name:
await self._ubridge_send(f"iol_bridge enable_packet_filter {location} {name} {state}")
async def adapter_remove_nio_binding(self, adapter_number, port_number):
"""