mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 05:51:15 +02:00
feat: implement traffic insight marker backend (ubridge mark filter)
Add compute-side marker subsystem that receives ubridge UDP MARK signals
and forwards them as project-scoped notifications to the web UI for
real-time traffic coloring. Matched packets are always saved to per-link
pcaps for future replay.
Key components:
- gns3server/compute/marker/: MarkerManager (singleton, UDP listener +
O(1) registry keyed by (node_id, filter_name)) + MarkerListener
(DatagramProtocol parsing MARK lines per ubridge integration contract)
- gns3server/compute/base_node.py: marker sink/node config at ubridge
startup; shared _ubridge_add_marker_filter / _ubridge_delete_marker_filter
- Per-node start_marker/stop_marker: VPCS (VPCS-{id}), QEMU
(QEMU-{id}-{adapter}), Docker (bridge{adapter})
- Compute REST /markers/start + /markers/stop (vpcs/qemu/docker route files)
- Controller Link._markers state + UDPLink.start_marker/stop_marker/
update_marker (mirror capture pattern: BPF validation, _choose_capture_side,
node.post forwarding, topology persistence)
- Controller REST GET/POST/DELETE/PUT /v3/projects/{p}/links/{l}/markers
- Config: marker_listen_host / marker_listen_port in ServerSettings
- Signal routing: creation-time registry O(1) lookup, no node-table scan;
project-scoped WS stream (not global); event payload always carries
project_id for frontend scoping
Tests: 14 unit tests (registry, listener parsing, UDP round-trip);
562 existing tests pass with zero regressions.
This commit is contained in:
21 files changed
+1135
-1
No files matched your search
@@ -1440,6 +1440,44 @@ class DockerVM(BaseNode):
|
||||
)
|
||||
)
|
||||
|
||||
async def start_marker(self, adapter_number, name, bpf, pcap_path, tag=None):
|
||||
"""
|
||||
Attach a traffic-insight ``mark`` filter to this adapter's uBridge bridge.
|
||||
On BPF match uBridge emits a MARK signal and appends the packet to the pcap.
|
||||
|
||||
:param adapter_number: adapter number
|
||||
:param name: stable filter name — pcap identity and echoed in MARK signals
|
||||
:param bpf: libpcap BPF expression
|
||||
:param pcap_path: absolute path ubridge appends matched packets to
|
||||
:param tag: optional correlation id echoed in MARK signals
|
||||
"""
|
||||
|
||||
if self.status == "started" and self.ubridge:
|
||||
adapter = f"bridge{adapter_number}"
|
||||
await self._ubridge_add_marker_filter(adapter, name, bpf, pcap_path, tag)
|
||||
log.info(
|
||||
"Docker VM '{name}' [{id}]: starting marker '{marker}' on adapter {adapter_number}".format(
|
||||
name=self.name, id=self.id, marker=name, adapter_number=adapter_number
|
||||
)
|
||||
)
|
||||
|
||||
async def stop_marker(self, adapter_number, name):
|
||||
"""
|
||||
Remove a traffic-insight ``mark`` filter from this adapter's uBridge bridge.
|
||||
|
||||
:param adapter_number: adapter number
|
||||
:param name: filter name previously passed to start_marker
|
||||
"""
|
||||
|
||||
if self.status == "started" and self.ubridge:
|
||||
adapter = f"bridge{adapter_number}"
|
||||
await self._ubridge_delete_marker_filter(adapter, name)
|
||||
log.info(
|
||||
"Docker VM '{name}' [{id}]: stopping marker '{marker}' on adapter {adapter_number}".format(
|
||||
name=self.name, id=self.id, marker=name, adapter_number=adapter_number
|
||||
)
|
||||
)
|
||||
|
||||
async def _get_log(self):
|
||||
"""
|
||||
Returns the log from the container
|
||||
|
||||
Reference in new issue
Block a user