marker: let callers pin the capture node via capture_node_id

A marker is single-sided — only the chosen capture node's uBridge installs the
mark filter — and dir=tx|rx is interpreted from that node's perspective. Until
now the observer was always auto-picked (_choose_marker_side), so dir=tx meant
"the auto-chosen endpoint is sending", which is unpredictable and makes the
direction filter hard to render meaningfully in the Web UI.

Add an optional create-only capture_node_id to MarkerCreate: when set, the
marker is pinned to that endpoint's uBridge (validated as a link endpoint and a
marker-capable type); when omitted, behavior is unchanged (auto-pick). The
chosen id is already echoed back as capture_node_id and in MARK signals, so the
UI can always render the observer regardless of who picked it.

capture_node_id is create-only (changing it would silently flip the meaning of
stored direction; recreate instead) and is not accepted on project-level
definitions — they are link-agnostic and have no endpoints, so inherited
markers keep auto-picking per link.

Plumbed through REST create_marker, the MCP link_marker tool, and base
Link.start_marker. update_marker does not forward it.
This commit is contained in:
YueGuobin committed 2026-08-01 22:24:47 +08:00
1 parent 6749b872fa
commit 71fa778d50
8 files changed
+112 -6

No files matched your search

+1 -1
View File
@@ -334,7 +334,7 @@ class Link:
raise NotImplementedError
async def start_marker(self, name, bpf, tag=None, direction=None):
async def start_marker(self, name, bpf, tag=None, direction=None, capture_node_id=None):
"""
Attach a traffic-insight marker to this link (base — UDPLink overrides).
"""