From d62167ee34b091e7025c9ec2820aae71e17a3944 Mon Sep 17 00:00:00 2001 From: Eduardo Montoya Date: Tue, 12 Sep 2023 02:59:58 +0200 Subject: [PATCH] [csl] ignore zero valued CSL IE period (#9414) Ignore a CSL IE with period set to 0. Accepting it would eventually lead to a division by 0 fault in `CslTxScheduler::GetNextCslTransmissionDelay`. --- src/core/mac/mac.cpp | 2 ++ src/core/mac/mac.hpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 71634147da7..a48ddc93a16 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -2329,6 +2329,8 @@ void Mac::ProcessCsl(const RxFrame &aFrame, const Address &aSrcAddr) VerifyOrExit(child != nullptr); csl = reinterpret_cast(cur + sizeof(HeaderIe)); + VerifyOrExit(csl->GetPeriod() >= kMinCslIePeriod); + child->SetCslPeriod(csl->GetPeriod()); child->SetCslPhase(csl->GetPhase()); child->SetCslSynchronized(true); diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 8e218553fce..e14d436c845 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -73,7 +73,7 @@ namespace Mac { constexpr uint32_t kDataPollTimeout = OPENTHREAD_CONFIG_MAC_DATA_POLL_TIMEOUT; ///< Timeout for receiving Data Frame (in msec). -constexpr uint32_t kSleepDelay = 300; ///< Max sleep delay when frame is pending (in msec) +constexpr uint32_t kSleepDelay = 300; ///< Max sleep delay when frame is pending (in msec). constexpr uint16_t kScanDurationDefault = OPENTHREAD_CONFIG_MAC_SCAN_DURATION; ///< Duration per channel (in msec). @@ -87,6 +87,8 @@ constexpr uint8_t kMaxFrameRetriesCsl = 0; constexpr uint8_t kTxNumBcast = OPENTHREAD_CONFIG_MAC_TX_NUM_BCAST; ///< Num of times broadcast frame is tx. +constexpr uint16_t kMinCslIePeriod = OPENTHREAD_CONFIG_MAC_CSL_MIN_PERIOD; + /** * Defines the function pointer called on receiving an IEEE 802.15.4 Beacon during an Active Scan. *