mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Implements the standard 802.1D-2004/802.1w configuration surface:
Bridge: priority (0-15 x4096), hello time, max age, forward delay,
force-version (RSTP v2 / STP-compatible v0 Config BPDUs), tx hold
count (per-port per-second BPDU budget).
Per port: enable, admin edge (forwarding immediately - no listen gap),
auto edge (forwarding after 3 s of BPDU silence; DEFAULT, so
host-facing ports no longer take the full forward delay),
path cost (0=auto/20000), port priority, BPDU guard (port disabled
on BPDU receipt), root guard (never accept a better root on the
port), BPDU filter (no BPDUs in or out).
Engine additions: root max-age expiry (reclaim the tree when the root goes
silent), root path cost accounting (rx cost + root-port cost, advertised in
our BPDUs), loop detection (our own BPDU coming back blocks the port for a
listen period), topology-change counter, approximated per-port roles
(Root/Designated/Alternate) for diagnostics.
CLI: "stp prio|hello|maxage|fwd|txhold|version ..." and
"stp port <n> on|off|edge|cost|prio|guard|filter ..." (stp_parse, delegated
from cmd_parser); all forms accepted by the startup-config validator so the
whole configuration persists. /stp.json now reports config + status; the
Spanning Tree page exposes everything with immediate-apply controls and live
state/role columns (edit-in-flight guard against the 2 s refresh).
8051 memory: the module moves to code BANK2; internal-RAM pressure from
cross-bank calls resolved by xdata loop iterators/scratch, __reentrant on
the small helpers, and moving httpd's header-pointer globals to xdata.
Verified on hardware (SWTGW218AS): defaults land per standard; priority and
hello change live; admin-edge ports (the LACP bond uplinks) keep the LAN at
0% loss THROUGH "stp on"; auto-edge ports forward after 3 s; a port that
heard real BPDUs (a VM bridge behind physical port 6) correctly declined
auto-edge, sat out the full listen period and became Designated; tc counts
promotions; we win the root election at priority 16384 vs 32768.
(cherry picked from commit 09a34dc6acdc81ab9cab0727d2f4a59c68131a3e)
49 lines
2.4 KiB
C
49 lines
2.4 KiB
C
#ifndef _RTL837X_STP_H_
|
|
#define _RTL837X_STP_H_
|
|
|
|
#include <stdint.h>
|
|
void stp_in(void) __banked;
|
|
void stp_setup(void) __banked;
|
|
void stp_timers(void) __banked;
|
|
void stp_off(void) __banked;
|
|
void stp_parse(void) __banked __reentrant; /* "stp ..." CLI handler (cmd_parser delegates here) */
|
|
void stp_defaults(void) __banked; /* boot init: 802.1D/w default configuration */
|
|
|
|
/* Bridge identifier as carried in a BPDU (priority, extension, MAC). */
|
|
struct bridge {
|
|
uint8_t prio;
|
|
uint8_t ext;
|
|
uint8_t mac[6];
|
|
};
|
|
|
|
/* ---- Configuration (defaults per 802.1D-2004/802.1w, set in stp_defaults) --- */
|
|
extern __xdata uint8_t stpEnabled;
|
|
extern __xdata uint8_t stp_prio; /* bridge priority, high byte: 0x80 = 32768; CLI takes 0-15 (steps of 4096) */
|
|
extern __xdata uint8_t stp_hello_s; /* hello time, 1-10 s (default 2) */
|
|
extern __xdata uint8_t stp_maxage_s; /* max age, 6-40 s (default 20) */
|
|
extern __xdata uint8_t stp_fwddelay_s; /* forward delay, 4-30 s (default 15); our listen period */
|
|
extern __xdata uint8_t stp_rstp; /* 1 = RSTP BPDUs (v2), 0 = STP-compatible Config BPDUs (v0) */
|
|
extern __xdata uint8_t stp_txhold; /* max BPDUs per port per second (default 6) */
|
|
|
|
/* Per-port config/status flags (stp_pflags[]) */
|
|
#define STP_PF_ENABLED 0x01 /* port participates in STP (default on) */
|
|
#define STP_PF_ADMEDGE 0x02 /* admin edge: forwarding immediately */
|
|
#define STP_PF_AUTOEDGE 0x04 /* auto edge: forward after 3 s without BPDU */
|
|
#define STP_PF_BPDUGUARD 0x08 /* disable port if a BPDU arrives */
|
|
#define STP_PF_ROOTGUARD 0x10 /* never accept a better root on this port */
|
|
#define STP_PF_FILTER 0x20 /* neither send nor accept BPDUs */
|
|
#define STP_PF_OPEREDGE 0x40 /* runtime: port went forwarding as an edge */
|
|
#define STP_PF_TRIPPED 0x80 /* runtime: disabled by BPDU guard */
|
|
|
|
extern __xdata uint8_t stp_pflags[10];
|
|
extern __xdata uint32_t stp_pcost[10]; /* path cost; 0 = auto (20000) */
|
|
extern __xdata uint8_t stp_pprio[10]; /* port priority (default 0x80) */
|
|
|
|
/* ---- Status, exposed read-only for the web UI (send_stp) ---- */
|
|
extern __xdata struct bridge root_bridge;
|
|
extern __xdata uint32_t root_bridge_cost; /* our path cost to the root (0 if we are root) */
|
|
extern __xdata uint8_t stp_root_port; /* logical port towards the root; 0xff = we are root */
|
|
extern __xdata uint16_t stp_tc_count; /* topology change counter (diagnostics) */
|
|
|
|
#endif
|