From 78ecafb0d75aa7d72060a1163e553b9dde44cb3f Mon Sep 17 00:00:00 2001 From: Li Cao Date: Thu, 11 Jul 2024 13:56:52 +0800 Subject: [PATCH] [radio] move required radio caps from radio spinel into posix platform (#10502) This commit moves the definition of the 'RequiredRadioCaps' from `RadioSpinel` to posix `Radio` class. Because this definition depends on `OPENTHREAD_CONFIG_THREAD_VERSION`. And we want to remove lib's dependency on OT core. And lib as a tool should be able to decide what caps to check at runtime. --- src/lib/spinel/radio_spinel.cpp | 21 +++++++++------------ src/lib/spinel/radio_spinel.hpp | 9 +++++++-- src/posix/platform/radio.cpp | 2 +- src/posix/platform/radio.hpp | 6 ++++++ 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/lib/spinel/radio_spinel.cpp b/src/lib/spinel/radio_spinel.cpp index ae2622e696c..8b3e2b5ea6f 100644 --- a/src/lib/spinel/radio_spinel.cpp +++ b/src/lib/spinel/radio_spinel.cpp @@ -115,7 +115,10 @@ RadioSpinel::RadioSpinel(void) memset(&mCallbacks, 0, sizeof(mCallbacks)); } -void RadioSpinel::Init(bool aSkipRcpCompatibilityCheck, bool aSoftwareReset, SpinelDriver *aSpinelDriver) +void RadioSpinel::Init(bool aSkipRcpCompatibilityCheck, + bool aSoftwareReset, + SpinelDriver *aSpinelDriver, + otRadioCaps aRequiredRadioCaps) { otError error = OT_ERROR_NONE; bool supportsRcpApiVersion; @@ -147,7 +150,7 @@ void RadioSpinel::Init(bool aSkipRcpCompatibilityCheck, bool aSoftwareReset, Spi if (!aSkipRcpCompatibilityCheck) { SuccessOrDie(CheckRcpApiVersion(supportsRcpApiVersion, supportsRcpMinHostApiVersion)); - SuccessOrDie(CheckRadioCapabilities()); + SuccessOrDie(CheckRadioCapabilities(aRequiredRadioCaps)); } mRxRadioFrame.mPsdu = mRxPsdu; @@ -215,23 +218,17 @@ void RadioSpinel::InitializeCaps(bool &aSupportsRcpApiVersion, bool &aSupportsRc sSupportsLogCrashDump = GetSpinelDriver().CoprocessorHasCap(SPINEL_CAP_RCP_LOG_CRASH_DUMP); } -otError RadioSpinel::CheckRadioCapabilities(void) +otError RadioSpinel::CheckRadioCapabilities(otRadioCaps aRequiredRadioCaps) { - const otRadioCaps kRequiredRadioCaps = -#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 - OT_RADIO_CAPS_TRANSMIT_SEC | OT_RADIO_CAPS_TRANSMIT_TIMING | -#endif - OT_RADIO_CAPS_ACK_TIMEOUT | OT_RADIO_CAPS_TRANSMIT_RETRIES | OT_RADIO_CAPS_CSMA_BACKOFF; - otError error = OT_ERROR_NONE; unsigned int radioCaps; EXPECT_NO_ERROR(error = Get(SPINEL_PROP_RADIO_CAPS, SPINEL_DATATYPE_UINT_PACKED_S, &radioCaps)); sRadioCaps = static_cast(radioCaps); - if ((sRadioCaps & kRequiredRadioCaps) != kRequiredRadioCaps) + if ((sRadioCaps & aRequiredRadioCaps) != aRequiredRadioCaps) { - otRadioCaps missingCaps = (sRadioCaps & kRequiredRadioCaps) ^ kRequiredRadioCaps; + otRadioCaps missingCaps = (sRadioCaps & aRequiredRadioCaps) ^ aRequiredRadioCaps; // missingCaps may be an unused variable when LogCrit is blank // avoid compiler warning in that case @@ -1796,7 +1793,7 @@ void RadioSpinel::PlatDiagOutput(const char *aFormat, ...) va_end(args); } -#endif +#endif // OPENTHREAD_CONFIG_DIAG_ENABLE uint32_t RadioSpinel::GetRadioChannelMask(bool aPreferred) { diff --git a/src/lib/spinel/radio_spinel.hpp b/src/lib/spinel/radio_spinel.hpp index 62027c2d886..bfee961760a 100644 --- a/src/lib/spinel/radio_spinel.hpp +++ b/src/lib/spinel/radio_spinel.hpp @@ -163,9 +163,14 @@ class RadioSpinel : private Logger * @param[in] aSoftwareReset When doing RCP recovery, TRUE to try software reset first, FALSE to * directly do a hardware reset. * @param[in] aSpinelDriver A pointer to the spinel driver instance that this object depends on. + * @param[in] aRequiredRadioCaps The required radio capabilities. RadioSpinel will check if RCP has + * the required capabilities during initiailization. * */ - void Init(bool aSkipRcpCompatibilityCheck, bool aSoftwareReset, SpinelDriver *aSpinelDriver); + void Init(bool aSkipRcpCompatibilityCheck, + bool aSoftwareReset, + SpinelDriver *aSpinelDriver, + otRadioCaps aRequiredRadioCaps); /** * This method sets the notification callbacks. @@ -1115,7 +1120,7 @@ class RadioSpinel : private Logger SpinelDriver &GetSpinelDriver(void) const; otError CheckSpinelVersion(void); - otError CheckRadioCapabilities(void); + otError CheckRadioCapabilities(otRadioCaps aRequiredRadioCaps); otError CheckRcpApiVersion(bool aSupportsRcpApiVersion, bool aSupportsRcpMinHostApiVersion); void InitializeCaps(bool &aSupportsRcpApiVersion, bool &aSupportsRcpMinHostApiVersion); diff --git a/src/posix/platform/radio.cpp b/src/posix/platform/radio.cpp index ba63d1b8d6c..c82b07ebfd1 100644 --- a/src/posix/platform/radio.cpp +++ b/src/posix/platform/radio.cpp @@ -93,7 +93,7 @@ void Radio::Init(const char *aUrl) skipCompatibilityCheck = mRadioUrl.HasParam("skip-rcp-compatibility-check"); mRadioSpinel.SetCallbacks(callbacks); - mRadioSpinel.Init(skipCompatibilityCheck, resetRadio, &GetSpinelDriver()); + mRadioSpinel.Init(skipCompatibilityCheck, resetRadio, &GetSpinelDriver(), kRequiredRadioCaps); ProcessRadioUrl(mRadioUrl); } diff --git a/src/posix/platform/radio.hpp b/src/posix/platform/radio.hpp index 4a5bea4084b..06f302b7ae8 100644 --- a/src/posix/platform/radio.hpp +++ b/src/posix/platform/radio.hpp @@ -115,6 +115,12 @@ class Radio : public Logger #error "No Spinel interface is specified!" #endif + static constexpr otRadioCaps kRequiredRadioCaps = +#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 + OT_RADIO_CAPS_TRANSMIT_SEC | OT_RADIO_CAPS_TRANSMIT_TIMING | +#endif + OT_RADIO_CAPS_ACK_TIMEOUT | OT_RADIO_CAPS_TRANSMIT_RETRIES | OT_RADIO_CAPS_CSMA_BACKOFF; + RadioUrl mRadioUrl; #if OPENTHREAD_SPINEL_CONFIG_VENDOR_HOOK_ENABLE Spinel::VendorRadioSpinel mRadioSpinel;