Status page: what moved, what is missing, and a dark room

The attention strip's names lead to the peer's row, which lights up for a
moment. The IPv4 and IPv6 sessions of one neighbour (NAME-v4, NAME-v6) are
listed together, joined down the side, the name said once in full. A route
count that moved by more than 2% between refreshes carries ▲ or ▼ for two
minutes; a row whose state or count changed while the tab was in the
background carries ● until it is clicked. A compact mode drops the next
hop and session columns, and is remembered by the browser. Colours are
variables, with a second set for prefers-color-scheme: dark.

A new per-peer `expected_routes` says about how many routes a peer sends
when all is well. The daemon only passes it to the API; the page lists an
established peer with under half of it as needing attention, a minute
after the session came up, with the expected count beside the actual one.
An established session with next to no routes looked, until now, exactly
like one that was fine.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Rayhaan JaufeerallyandClaude Fable 5.1 committed 2026-10-07 23:16:01 +02:00
1 parent 7b6547d3c9
commit 277b973f1a
11 files changed
+305 -57

No files matched your search

+29
View File
@@ -233,6 +233,35 @@ message with the subcode Administrative Shutdown to every neighbor. If the
`kernel` statement is configured, it then removes its routes from the
kernel. See [Kernel Route Installation](@/docs/guides/kernel.md).
## Expected Route Counts
An established session with no routes, or with a small fraction of the
routes that the neighbor normally advertises, indicates a problem that the
session state does not show: a filter on the neighbor's side, an import
policy that rejects everything, or a neighbor that has not finished
sending its table. The `expected_routes` statement specifies the
approximate number of routes that the neighbor advertises in normal
operation:
```textproto
peers {
name: "transit-a"
endpoint { address: "192.0.2.1" }
remote_asn: 64496
role: PROVIDER
expected_routes: 1000000
import { max_prefixes: 1200000 }
}
```
The status page compares the number of routes accepted from the neighbor
with this value. An established session with fewer than half the expected
routes is listed under **Needing attention**, with the expected number
beside the actual one. The comparison starts one minute after the session
is established, so that a neighbor that is still sending its table is not
reported. The value does not affect route processing; `max_prefixes` is
the limit that Ferrix enforces.
## Verifying BGP Sessions
To verify the state of each neighbor, use one of the following:
+17 -4
View File
@@ -31,7 +31,7 @@ neighbors that are restarting; the kernel not in step with the routing
table, or refusing routes; and RPKI data that is missing or about to
expire. When nothing needs attention, the line says so. A second line
summarizes the normal state: sessions established, routes installed, and
the RPKI state.
the RPKI state. Each neighbor named in the line is a link to its row.
Below the status line, the page displays the following information:
@@ -39,8 +39,12 @@ Below the status line, the page displays the following information:
- Each neighbor, with its session state, time established, next hop,
session properties, number of accepted routes, rejected announcements,
and held routes, and its last error. Neighbors that need attention are
listed first; the others are grouped by role. The **problems only**
option hides the neighbors that need no attention.
listed first; the others are grouped by role. The IPv4 and IPv6 sessions
of one neighbor, named `NAME-v4` and `NAME-v6`, are listed together and
joined by a bar. The **problems only** option hides the neighbors that
need no attention; the **compact** option removes the next hop and
session columns, for a small or distant screen, and is remembered by the
browser.
- RPKI validation: the cache, the RTR version, and the age of the data.
- The originated routes.
- Kernel route installation: the number of installed routes, the number of
@@ -60,7 +64,14 @@ action, such as a session that is down; amber indicates a degraded state,
such as held or stale routes; green indicates a function that is operating
normally, such as the RPKI cache being synchronized; gray indicates an
inactive or expected state, such as a passive neighbor waiting for a
connection. Normal values are displayed in black.
connection. Normal values are displayed in black. When the operating
system or browser requests a dark color scheme, the page uses the same
colors on a dark background.
An established neighbor whose route count is below half of its
`expected_routes` value is listed under **Needing attention**, with the
expected count beside the actual one. See [Expected Route
Counts](@/docs/guides/peers.md#expected-route-counts).
Properties that repeat on many rows are displayed as glyphs. Table 2 lists
them. Point to a glyph to display its meaning.
@@ -77,6 +88,8 @@ them. Point to a glyph to display its meaning.
| `×N` | After an AS number in an AS path: the AS appears N times in a row (prepending). |
| `OTC`, `AA`, `AGG`, `AS4`, `OID`, `CL`, `EXT` | Path attributes without a column of their own: Only to Customer, ATOMIC_AGGREGATE, AGGREGATOR, AS4_PATH, ORIGINATOR_ID, CLUSTER_LIST, and extended communities. |
| `✓`, `✗`, `–` | RPKI or ASPA validation state: valid, invalid, or not found. |
| `▲`, `▼` | The neighbor's route count rose or fell by more than 2% between the last two refreshes. Displayed for two minutes. |
| `●` | The row changed while the browser tab was in the background: the session state changed, or the route count moved by more than 2%. Click the row to clear the mark. |
An AS path or a list of communities that runs to more than a few lines is
displayed shortened, with a **more** control. Click the control, or
@@ -77,6 +77,7 @@ Statements for a BGP neighbor.
| `role` <span class="type">[Role](#role)</span> | None | Specifies the BGP role of the neighbor (RFC 9234). Not permitted for IBGP neighbors. Required for every EBGP neighbor if any `export` statement enables `learned_routes`. |
| `require_role` <span class="type">bool</span> | `false` | Rejects the session if the neighbor does not advertise a BGP role. Requires `role`. |
| `passive` <span class="type">bool</span> | `false` | Prevents Ferrix from initiating connections to the neighbor. Ferrix accepts connections from the address of `endpoint`; the port of `endpoint` is not used. See [Passive Neighbors](@/docs/guides/peers.md#passive-neighbors). |
| `expected_routes` <span class="type">uint32</span> | 0 | Specifies the approximate number of routes that the neighbor advertises in normal operation. The status page marks an established session with fewer than half this number of routes as needing attention. The value does not affect route processing. 0 disables the comparison. See [Expected Route Counts](@/docs/guides/peers.md#expected-route-counts). |
| `export` <span class="type">[ExportPolicy](#exportpolicy)</span> | Top-level `export` | Specifies the export policy for the neighbor. Replaces the top-level `export` statement. |
| `graceful_restart` <span class="type">[GracefulRestart](#gracefulrestart)</span> | Top-level `graceful_restart` | Specifies graceful restart for the neighbor. Each statement that is set replaces the corresponding top-level statement. |
| `route_reflector_client` <span class="type">bool</span> | `false` | Makes the IBGP neighbor a route reflector client: Ferrix advertises to it the routes learned from other IBGP neighbors, and advertises its routes to them. Permitted only for IBGP neighbors. See [Route Reflection](@/docs/guides/passing-routes-on.md#route-reflection). |
+2
View File
@@ -62,6 +62,7 @@ neighbor:
"routes": 1,
"rejected_routes": 1,
"held_routes": 0,
"expected_routes": null,
"role": null,
"role_confirmed": null,
"last_error": null,
@@ -84,6 +85,7 @@ neighbor:
| `routes` | Number of the neighbor's routes in the routing table. |
| `rejected_routes` | Number of the neighbor's routes rejected by its import policy. |
| `held_routes` | Number of held routes: routes rejected for a reason that can change without a new UPDATE, such as RPKI validity or next hop resolution. |
| `expected_routes` | The `expected_routes` value from the configuration, or `null` if it is not set. |
| `role_confirmed` | Whether the neighbor advertised a BGP role that matches the configured role. |
| `retry_at_unix` | For a neighbor without a session, the time of the next connection attempt. |
| `graceful_restart` | Graceful restart, if both neighbors advertised it: the restart time of the neighbor, whether the N bit is in use (RFC 8538), the address families whose routes are retained, and those for which the neighbor preserved its forwarding state. |