@@ -21,6 +21,8 @@ class ZeroWiFiMaintainer {
2121 unsigned long retryBaseMs;
2222 unsigned long retryMaxMs;
2323 unsigned long retryJitterMs;
24+ uint8_t stablePollMultiplier;
25+ uint8_t stableThreshold;
2426 bool emitStateChangesOnly;
2527 bool manageCapabilities;
2628 Kernel::CapabilityMask capabilityMask;
@@ -31,6 +33,8 @@ class ZeroWiFiMaintainer {
3133 retryBaseMs (1000 ),
3234 retryMaxMs(10000 ),
3335 retryJitterMs(0 ),
36+ stablePollMultiplier(1 ),
37+ stableThreshold(4 ),
3438 emitStateChangesOnly(true ),
3539 manageCapabilities(false ),
3640 capabilityMask(Kernel::kCapNetwork ),
@@ -53,7 +57,8 @@ class ZeroWiFiMaintainer {
5357 currentRetryMs_(0 ),
5458 connectAttempts_(0 ),
5559 reconnectTransitions_(0 ),
56- stateNotifications_(0 ) {}
60+ stateNotifications_(0 ),
61+ consecutiveStablePolls_(0 ) {}
5762
5863 void begin (Kernel& kernel,
5964 LinkProbe probe,
@@ -90,6 +95,7 @@ class ZeroWiFiMaintainer {
9095 connectAttempts_ = 0 ;
9196 reconnectTransitions_ = 0 ;
9297 stateNotifications_ = 0 ;
98+ consecutiveStablePolls_ = 0 ;
9399 }
94100
95101 void tick () {
@@ -98,7 +104,12 @@ class ZeroWiFiMaintainer {
98104 }
99105
100106 const unsigned long nowMs = kernel_->getStats ().uptimeMs ;
101- if (hasPolled_ && (nowMs - lastPollAtMs_) < config_.pollIntervalMs ) {
107+ unsigned long effectivePollMs = config_.pollIntervalMs ;
108+ if (config_.stablePollMultiplier > 1 &&
109+ consecutiveStablePolls_ >= config_.stableThreshold ) {
110+ effectivePollMs *= config_.stablePollMultiplier ;
111+ }
112+ if (hasPolled_ && (nowMs - lastPollAtMs_) < effectivePollMs) {
102113 return ;
103114 }
104115
@@ -109,6 +120,9 @@ class ZeroWiFiMaintainer {
109120 if (linkUp) {
110121 if (!connected_) {
111122 ++reconnectTransitions_;
123+ consecutiveStablePolls_ = 0 ;
124+ } else if (consecutiveStablePolls_ < 255 ) {
125+ ++consecutiveStablePolls_;
112126 }
113127 connected_ = true ;
114128 currentRetryMs_ = config_.retryBaseMs ;
@@ -120,6 +134,7 @@ class ZeroWiFiMaintainer {
120134
121135 if (connected_) {
122136 connected_ = false ;
137+ consecutiveStablePolls_ = 0 ;
123138 if (disconnectStep_ != NULL ) {
124139 disconnectStep_ ();
125140 }
@@ -221,6 +236,7 @@ class ZeroWiFiMaintainer {
221236 unsigned long connectAttempts_;
222237 unsigned long reconnectTransitions_;
223238 unsigned long stateNotifications_;
239+ uint8_t consecutiveStablePolls_;
224240};
225241
226242} // namespace net
0 commit comments