Diagnostics — neighbours#
Two tables that answer the same question at two layers: LLDP says what each interface is plugged into, and the ARP/NDP table says which addresses the kernel has actually resolved on the wire. Together they are the fastest way to settle "is that host really there, and is this cable in the port I think it is".
LLDP#
The panel title reads LLDP — 3 neighbours when it is on, or LLDP — off when it is
not. GET /api/lldp returns the service lldp configuration and, when it is present,
the parsed output of show lldp neighbors, polled every 15 s.
The button in the panel header toggles it, and it stages rather than acting:
# Turn on (all interfaces)
set service lldp interface all
# Turn off
delete service lldpNothing changes until you commit. It needs the operator role.
Three states, three different messages:
| State | What the panel says |
|---|---|
| Off | "Link Layer Discovery lets switches and routers announce their name, model and port to each other. Turn it on and this table shows what each interface is plugged into." |
| On, nothing heard | "Nothing heard yet. Neighbours announce every 30 s; the switch must have LLDP on too." — with the router's own status error appended when there was one. |
| On, neighbours present | The table, one row per neighbour, with every column the router printed. |
That middle state is the one that saves time. LLDP is a two-sided protocol: turning it on here makes this router announce, and it only hears a neighbour that is announcing too. Thirty seconds of nothing is normal; a minute of nothing usually means the switch has LLDP disabled.
The table's columns are whatever show lldp neighbors produced on this build — the page
does not impose a schema on the router's output, it renders the keys the parser found.
An LLDP status read that failed for a reason other than "not configured" is surfaced as
status_error rather than shown as an empty table —
agent/parity.go, handleLLDP.
ARP / NDP#
GET /api/neighbors is show arp, parsed into rows, polled every 10 s. The panel title
carries the row count and a filter box that searches every column, which is how you find
one MAC address in a table of two hundred.
Every value is rendered in monospace, again with whatever columns the router printed.
The empty state is a real answer, not a failure: "No neighbours — the kernel has resolved no addresses yet", with two commands for the console:
show arp
show ipv6 neighborsReading the two together#
| Symptom | What to look at |
|---|---|
| A host is unreachable | ARP first. No entry means the kernel never resolved it — wrong VLAN, wrong subnet, or it is genuinely absent. |
| Traffic is on the wrong interface | LLDP. The port a switch reports is the port the cable is in. |
| A MAC has moved between interfaces | ARP, filtered by the MAC. |
| An interface is up but sees nothing | LLDP first: if the switch is announcing and this interface hears nothing, the problem is below IP. |
What this tab will not do#
- No static ARP entries. Nothing here writes an ARP entry; there is no editor.
- No flush. You cannot clear a stale entry from this page.
- No per-interface LLDP. The button turns LLDP on for
interface all. Per-interface control is available in the configuration tree and is not offered here. - No vendor lookup. A MAC address is shown as the router printed it; there is no OUI database in the product.
See also#
- Diagnostics — the other five tabs.
- Diagnostics — tools — when the host resolves but does not answer.
- Interfaces — neighbours — the same ARP/NDP table, on the page that owns the interfaces.
- DHCP — where most of these addresses came from.
Checked against ui/src/pages/Diagnostics.tsx,
agent/parity.go, agent/opmode.go,
agent/main.go.