diff --git a/src/core/net/srp_client.cpp b/src/core/net/srp_client.cpp index aa5738919..a72b6d88a 100644 --- a/src/core/net/srp_client.cpp +++ b/src/core/net/srp_client.cpp @@ -1088,8 +1088,15 @@ exit: } else { + uint16_t retryJitter; + LogRetryWaitInterval(); - mTimer.Start(Random::NonCrypto::AddJitter(GetRetryWaitInterval(), kRetryIntervalJitter)); + + // Use a divisor of current retry interval for jitter + retryJitter = ClampToUint16(GetRetryWaitInterval() / kRetryJitterDivisor); + retryJitter = Max(retryJitter, kRetryIntervalJitter); + mTimer.Start(Random::NonCrypto::AddJitter(GetRetryWaitInterval(), retryJitter)); + GrowRetryWaitInterval(); InvokeCallback(error); } diff --git a/src/core/net/srp_client.hpp b/src/core/net/srp_client.hpp index 1f3034f45..5bfa7b616 100644 --- a/src/core/net/srp_client.hpp +++ b/src/core/net/srp_client.hpp @@ -845,6 +845,7 @@ private: static constexpr uint16_t kTxFailureRetryJitter = 10; // in ms static constexpr uint16_t kRetryIntervalJitter = OPENTHREAD_CONFIG_SRP_CLIENT_RETRY_WAIT_INTERVAL_JITTER; // in ms + static constexpr uint32_t kRetryJitterDivisor = 5; // divisor for proportional jitter (1/N of retry interval) static_assert(kDefaultLease <= static_cast(kMaxLease), "kDefaultLease is larger than max"); static_assert(kDefaultKeyLease <= static_cast(kMaxLease), "kDefaultKeyLease is larger than max");