mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
"stp on" put every port into blocking (stp_setup, port_timers = "10 s") but nothing ever counted those timers down: stp_timers() only sent hello BPDUs. On a network with no other (R)STP bridge - i.e. nobody sends us BPDUs - every port therefore stayed blocking FOREVER and enabling STP took the whole network down until "stp off". - stp_timers(): count port_timers down; when a port's listen period expires with no better root heard, promote it to forwarding in MSTP_STATES (we are the designated bridge on that port). - Calibrate the tick constants to the real stp_timers() rate (~64 Hz: main loop ~256 Hz / (STP_TICK_DIVIDER+1)): TIME_HELLO 0x200->0x80 is an actual 2 s hello, port_timers 0xa00->0x280 an actual 10 s listen period. Measured before the fix, ports converged only after ~40 s. - Move struct bridge into rtl837x_stp.h and export root_bridge/-_cost for the web UI status endpoint. Verified on hardware: "stp on" -> ports report Blocking, after the 10 s listen period all ports promote to Forwarding and LAN connectivity returns; "stp off" restores forwarding immediately. We elect ourselves root (weRoot) with no other bridge present. (cherry picked from commit 8537a15ca254b2122272b20bec7a66426e86df4b)
27 lines
759 B
C
27 lines
759 B
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;
|
|
|
|
#define TIME_HELLO 0x80 // 2 sec (stp_timers runs at ~64 Hz: main loop ~256 Hz / STP_TICK_DIVIDER+1)
|
|
|
|
/* Bridge identifier as carried in a BPDU (priority, extension, MAC). */
|
|
struct bridge {
|
|
uint8_t prio;
|
|
uint8_t ext;
|
|
uint8_t mac[6];
|
|
};
|
|
|
|
/* Protocol state, exposed read-only for the web UI (page_impl.c send_stp())
|
|
* - the elected root bridge and our path cost to it. Owned by rtl837x_stp.c;
|
|
* stpEnabled is owned by rtlplayground.c. */
|
|
extern __xdata uint8_t stpEnabled;
|
|
extern __xdata struct bridge root_bridge;
|
|
extern __xdata uint32_t root_bridge_cost;
|
|
|
|
#endif
|