mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 22:11:14 +02:00
marker: forward dir= from ubridge and add per-marker direction filter
Direction field in marker.match events
=======================================
Read ubridge dir=<tx|rx> from MARK signal datagrams and forward it
as a "dir" key in the marker.match notification event. The field is
additive -- older ubridge builds omit it and the parser leaves it null,
so consumers fall back to undirected rendering with no version coupling.
Semantics are relative to the capture node (the signal's node=<id>):
tx = capture node is sending (ingressed device-side NIO), rx = it is
receiving (ingressed link-side NIO).
Per-marker direction filter (opt-in, server-side pipeline)
==========================================================
Add a direction field to MarkerCreate and MarkerDefinitionCreate
schemas ("tx" | "rx" | null). Plumb it through the full pipeline:
Schema -> controller (start_marker/update_marker, marker_entry,
_markers_for_node, update_marker_definition sync)
-> REST/MCP handlers -> compute _ubridge_add_marker_filter +
IOU _ubridge_apply_markers -> bridge add_packet_filter dir <tx|rx>
When set, ubridge only fires the mark handler (signal + pcap) for
packets matching the chosen direction. null (default/legacy) = both
directions -- zero behavioural change for existing markers.
Docs and tests
==============
- docs/features/marker-traffic-insight.md: signal format updated,
new Direction section with NIO mapping, arrow mapping, and additive
compatibility note.
- tests/compute/marker/test_marker_manager.py: 3 new parser tests
(dir tx/rx/absent) plus existing test extended to assert dir=None.
13 files, +123/-22, 72 tests pass (zero breakage)
This commit is contained in:
13 files changed
+122
-21
No files matched your search
@@ -100,6 +100,31 @@ pcap file, and its own `link=`. The shared bridge name is irrelevant to attribut
|
||||
capable node types (`qemu`, `docker`, `vpcs`, `cloud`) already use one bridge per link; `link`
|
||||
applies uniformly to all of them.
|
||||
|
||||
## Direction
|
||||
|
||||
A `MARK` signal optionally carries `dir=<tx|rx>` — the matched packet's travel direction
|
||||
**relative to the capture node** (the `node=<id>` in the same signal, i.e. the node whose
|
||||
uBridge hosts the marker):
|
||||
|
||||
| `dir` | Ingress NIO | Meaning |
|
||||
|-------|-------------|---------|
|
||||
| `tx` | device side (`source_nio` on a generic bridge; the IOL instance on an IOU `IOL-BRIDGE`) | capture node is **sending** |
|
||||
| `rx` | link side (`destination_nio` on a generic bridge; the NIO side on an IOU `IOL-BRIDGE`) | capture node is **receiving** |
|
||||
|
||||
A marker is single-sided: only the chosen capture node's uBridge installs the `mark` filter,
|
||||
yet both directions of the link transit that one bridge (it carries exactly two NIOs — the
|
||||
device side and the link side), so that single uBridge observes and classifies both
|
||||
directions. The `marker.match` event forwards `dir` through unchanged; the Web UI combines it
|
||||
with the link's two endpoints and the capture `node_id` to draw an arrow:
|
||||
|
||||
- `dir=tx` → `capture_node → far_node`
|
||||
- `dir=rx` → `far_node → capture_node`
|
||||
- `dir` absent (older uBridge) → undirected highlight (current behaviour)
|
||||
|
||||
Because the listener ignores unknown keys, `dir` is **additive**: an older server silently
|
||||
drops it and an older uBridge simply omits it — either way the system falls back to
|
||||
undirected rendering with no error.
|
||||
|
||||
## API Endpoints
|
||||
|
||||
All endpoints require a JWT bearer token (`POST /v3/access/users/authenticate`). The
|
||||
@@ -217,10 +242,11 @@ extra request.
|
||||
| Event | Payload | Delivered to |
|
||||
|-------|---------|--------------|
|
||||
| `link.updated` | Link object (its `markers` field is the source of truth) | Project notification ws |
|
||||
| `marker.match` | `project_id`, `node_id`, `link_id`, `filter`, `tag`, `ts`, `len` | Project notification ws only |
|
||||
| `marker.match` | `project_id`, `node_id`, `link_id`, `filter`, `tag`, `ts`, `len`, `dir` | Project notification ws only |
|
||||
|
||||
The `marker.match` `link_id` is taken from the signal's `link=` field (authoritative); see
|
||||
[Per-link attribution](#per-link-attribution).
|
||||
[Per-link attribution](#per-link-attribution). The `dir` field is the matched packet's travel
|
||||
direction relative to the capture node; see [Direction](#direction).
|
||||
|
||||
## Error Responses
|
||||
|
||||
|
||||
Reference in new issue
Block a user