From b45cc3cd6358e89ebc8c01359e135d33b7175f10 Mon Sep 17 00:00:00 2001 From: Yakun Xu Date: Thu, 6 Sep 2018 17:17:00 +0800 Subject: [PATCH] [posix-app] get radio caps from NCP (#3021) --- src/ncp/ncp_base_dispatcher.cpp | 3 +++ src/ncp/ncp_base_radio.cpp | 5 +++++ src/ncp/spinel.h | 10 ++++++++++ src/posix/platform/radio_spinel.cpp | 9 +++++++-- src/posix/platform/radio_spinel.hpp | 9 +++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/ncp/ncp_base_dispatcher.cpp b/src/ncp/ncp_base_dispatcher.cpp index 4546ffcc8..cd80207d8 100644 --- a/src/ncp/ncp_base_dispatcher.cpp +++ b/src/ncp/ncp_base_dispatcher.cpp @@ -617,6 +617,9 @@ NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey) // Raw Link API Properties (Get Handler) #if OPENTHREAD_RADIO || OPENTHREAD_ENABLE_RAW_LINK_API + case SPINEL_PROP_RADIO_CAPS: + handler = &NcpBase::HandlePropertyGet; + break; case SPINEL_PROP_MAC_SRC_MATCH_ENABLED: handler = &NcpBase::HandlePropertyGet; break; diff --git a/src/ncp/ncp_base_radio.cpp b/src/ncp/ncp_base_radio.cpp index 369882134..72c531476 100644 --- a/src/ncp/ncp_base_radio.cpp +++ b/src/ncp/ncp_base_radio.cpp @@ -177,6 +177,11 @@ exit: return; } +template <> otError NcpBase::HandlePropertyGet(void) +{ + return mEncoder.WriteUintPacked(otLinkRawGetCaps(mInstance)); +} + template <> otError NcpBase::HandlePropertyGet(void) { // TODO: Would be good to add an `otLinkRaw` API to give the the status of source match. diff --git a/src/ncp/spinel.h b/src/ncp/spinel.h index 02bd2a2ad..7ff28aa38 100644 --- a/src/ncp/spinel.h +++ b/src/ncp/spinel.h @@ -845,6 +845,16 @@ typedef enum { */ SPINEL_PROP_CHANNEL_MONITOR_CHANNEL_OCCUPANCY = SPINEL_PROP_PHY_EXT__BEGIN + 10, + /// Radio caps + /** Format: `i` (read-only) + * + * Data per item is: + * + * `i`: Radio Capabilities. + * + */ + SPINEL_PROP_RADIO_CAPS = SPINEL_PROP_PHY_EXT__BEGIN + 11, + SPINEL_PROP_PHY_EXT__END = 0x1300, SPINEL_PROP_MAC__BEGIN = 0x30, diff --git a/src/posix/platform/radio_spinel.cpp b/src/posix/platform/radio_spinel.cpp index 04ac31b12..0625afd3d 100644 --- a/src/posix/platform/radio_spinel.cpp +++ b/src/posix/platform/radio_spinel.cpp @@ -395,6 +395,12 @@ void RadioSpinel::Init(const char *aRadioFile, const char *aRadioConfig) VerifyOrExit(mIsReady, error = OT_ERROR_FAILED); SuccessOrExit(error = Get(SPINEL_PROP_HWADDR, SPINEL_DATATYPE_UINT64_S, &NODE_ID)); + { + unsigned int caps; + SuccessOrExit(error = Get(SPINEL_PROP_RADIO_CAPS, SPINEL_DATATYPE_UINT_PACKED_S, &caps)); + mRadioCaps = static_cast(caps); + } + mRxRadioFrame.mPsdu = mRxPsdu; mTxRadioFrame.mPsdu = mTxPsdu; @@ -1518,8 +1524,7 @@ int8_t otPlatRadioGetRssi(otInstance *aInstance) otRadioCaps otPlatRadioGetCaps(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); - return static_cast(OT_RADIO_CAPS_ACK_TIMEOUT | OT_RADIO_CAPS_TRANSMIT_RETRIES | - OT_RADIO_CAPS_CSMA_BACKOFF); + return sRadioSpinel.GetRadioCaps(); } bool otPlatRadioGetPromiscuous(otInstance *aInstance) diff --git a/src/posix/platform/radio_spinel.hpp b/src/posix/platform/radio_spinel.hpp index 7338ec041..f20f30dd9 100644 --- a/src/posix/platform/radio_spinel.hpp +++ b/src/posix/platform/radio_spinel.hpp @@ -160,6 +160,14 @@ public: */ otError SetTransmitPower(int8_t aPower); + /** + * This method returns the radio capabilities. + * + * @returns The radio capability bit vector. + * + */ + otRadioCaps GetRadioCaps(void) const { return mRadioCaps; } + /** * This method returns the radio receive sensitivity value. * @@ -513,6 +521,7 @@ private: otExtAddress mExtendedAddress; uint16_t mShortAddress; uint16_t mPanid; + otRadioCaps mRadioCaps; uint8_t mChannel; int8_t mRxSensitivity; uint8_t mTxState;