mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-09-02 15:02:51 +08:00
The timers assumed stp_timers() runs at 64 Hz. It does not: the main loop idles on the 200 Hz system tick and calls us every fourth pass, i.e. 50 Hz. Measured on hardware - with hello configured to 2 s the BPDUs left the port 2.560 s apart, exactly the 28 % overshoot the wrong constant implies, and every other timer (forward delay, max age, tx-hold refill) was stretched the same way. Move the constant to the header with the arithmetic spelled out, and use it in the status page too, which had the 64 hardcoded and therefore aged the same counters differently than the engine.
66 lines
3.3 KiB
C
66 lines
3.3 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 */
|
|
|
|
/* Tick rate of stp_timers(): the main loop idles on the 200 Hz system tick
|
|
* and rtlplayground.c calls us every (STP_TICK_DIVIDER + 1) = 4th pass.
|
|
* Measured on hardware: hello 2 s produced BPDUs exactly 2.560 s apart with
|
|
* the previous value of 64, i.e. 20 ms per tick - every configured timer ran
|
|
* 28 % long. Shared with the web UI, which ages the same counters. */
|
|
#define STP_HZ 50
|
|
|
|
/* 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;
|
|
extern __xdata uint8_t stp_failsafe_s; /* mgmt watchdog, seconds (0 = off) */
|
|
extern __xdata uint8_t stp_failsafe_tripped; /* 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];
|
|
extern __xdata uint8_t stp_pp2p[10]; /* admin point-to-point: 0 auto, 1 on, 2 off */
|
|
|
|
/* Last-heard designated info per port (from received BPDUs); consult
|
|
* stp_bpdu_age to decide whether it is still current. */
|
|
extern __xdata struct bridge stp_dbridge[10];
|
|
extern __xdata uint16_t stp_dpid[10];
|
|
extern __xdata uint32_t stp_dcost[10];
|
|
extern __xdata uint16_t stp_bpdu_age[10]; /* ticks since a BPDU was heard */ /* 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
|