Wheelhouse docs

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 lldp

Nothing changes until you commit. It needs the operator role.

Three states, three different messages:

StateWhat 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 presentThe 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 neighbors

Reading the two together#

SymptomWhat to look at
A host is unreachableARP first. No entry means the kernel never resolved it — wrong VLAN, wrong subnet, or it is genuinely absent.
Traffic is on the wrong interfaceLLDP. The port a switch reports is the port the cable is in.
A MAC has moved between interfacesARP, filtered by the MAC.
An interface is up but sees nothingLLDP 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#


Checked against ui/src/pages/Diagnostics.tsx, agent/parity.go, agent/opmode.go, agent/main.go.

Updated 2026-09-02 manual diagnostics lldp arp neighbours