diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 2dd93182b..6b21b9744 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -1647,6 +1647,10 @@ template <> otError NcpBase::HandlePropertyGet(void) SuccessOrExit(error = mEncoder.WriteUintPacked(SPINEL_CAP_NEST_LEGACY_INTERFACE)); #endif +#if OPENTHREAD_FTD && OPENTHREAD_ENABLE_COMMISSIONER + SuccessOrExit(error = mEncoder.WriteUintPacked(SPINEL_CAP_THREAD_COMMISSIONER)); +#endif + #if OPENTHREAD_ENABLE_UDP_PROXY SuccessOrExit(error = mEncoder.WriteUintPacked(SPINEL_CAP_THREAD_UDP_PROXY)); #endif diff --git a/src/ncp/ncp_base.hpp b/src/ncp/ncp_base.hpp index 4558732b0..997d48c22 100644 --- a/src/ncp/ncp_base.hpp +++ b/src/ncp/ncp_base.hpp @@ -281,6 +281,17 @@ protected: static void HandleJamStateChange_Jump(bool aJamState, void *aContext); void HandleJamStateChange(bool aJamState); +#if OPENTHREAD_FTD && OPENTHREAD_ENABLE_COMMISSIONER + static void HandleCommissionerEnergyReport_Jump(uint32_t aChannelMask, + const uint8_t *aEnergyData, + uint8_t aLength, + void * aContext); + void HandleCommissionerEnergyReport(uint32_t aChannelMask, const uint8_t *aEnergyData, uint8_t aLength); + + static void HandleCommissionerPanIdConflict_Jump(uint16_t aPanId, uint32_t aChannelMask, void *aContext); + void HandleCommissionerPanIdConflict(uint16_t aPanId, uint32_t aChannelMask); +#endif + static void SendDoneTask(void *aContext); void SendDoneTask(void); diff --git a/src/ncp/ncp_base_dispatcher.cpp b/src/ncp/ncp_base_dispatcher.cpp index 90ee3dc35..b33f55aa9 100644 --- a/src/ncp/ncp_base_dispatcher.cpp +++ b/src/ncp/ncp_base_dispatcher.cpp @@ -552,6 +552,15 @@ NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey) handler = &NcpBase::HandlePropertyGet; break; #if OPENTHREAD_ENABLE_COMMISSIONER + case SPINEL_PROP_MESHCOP_COMMISSIONER_STATE: + handler = &NcpBase::HandlePropertyGet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL: + handler = &NcpBase::HandlePropertyGet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID: + handler = &NcpBase::HandlePropertyGet; + break; case SPINEL_PROP_THREAD_COMMISSIONER_ENABLED: handler = &NcpBase::HandlePropertyGet; break; @@ -855,6 +864,29 @@ NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey) handler = &NcpBase::HandlePropertySet; break; #endif +#if OPENTHREAD_ENABLE_COMMISSIONER + case SPINEL_PROP_MESHCOP_COMMISSIONER_STATE: + handler = &NcpBase::HandlePropertySet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL: + handler = &NcpBase::HandlePropertySet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN: + handler = &NcpBase::HandlePropertySet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN: + handler = &NcpBase::HandlePropertySet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY: + handler = &NcpBase::HandlePropertySet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET: + handler = &NcpBase::HandlePropertySet; + break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET: + handler = &NcpBase::HandlePropertySet; + break; +#endif #if OPENTHREAD_ENABLE_CHANNEL_MANAGER case SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL: handler = &NcpBase::HandlePropertySet; @@ -968,6 +1000,9 @@ NcpBase::PropertyHandler NcpBase::FindInsertPropertyHandler(spinel_prop_key_t aK #if OPENTHREAD_FTD #if OPENTHREAD_ENABLE_COMMISSIONER + case SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS: + handler = &NcpBase::HandlePropertyInsert; + break; case SPINEL_PROP_THREAD_JOINERS: handler = &NcpBase::HandlePropertyInsert; break; @@ -1047,7 +1082,12 @@ NcpBase::PropertyHandler NcpBase::FindRemovePropertyHandler(spinel_prop_key_t aK case SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS: handler = &NcpBase::HandlePropertyRemove; break; +#if OPENTHREAD_ENABLE_COMMISSIONER + case SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS: + handler = &NcpBase::HandlePropertyRemove; + break; #endif +#endif // OPENTHREAD_FTD // -------------------------------------------------------------------------- // Raw Link API Properties (Remove Handler) diff --git a/src/ncp/ncp_base_ftd.cpp b/src/ncp/ncp_base_ftd.cpp index 5d19693d4..d78d487f9 100644 --- a/src/ncp/ncp_base_ftd.cpp +++ b/src/ncp/ncp_base_ftd.cpp @@ -391,6 +391,291 @@ exit: } #if OPENTHREAD_ENABLE_COMMISSIONER + +template <> otError NcpBase::HandlePropertyGet(void) +{ + uint8_t state = SPINEL_MESHCOP_COMMISSIONER_STATE_DISABLED; + + switch (otCommissionerGetState(mInstance)) + { + case OT_COMMISSIONER_STATE_DISABLED: + state = SPINEL_MESHCOP_COMMISSIONER_STATE_DISABLED; + break; + + case OT_COMMISSIONER_STATE_PETITION: + state = SPINEL_MESHCOP_COMMISSIONER_STATE_PETITION; + break; + + case OT_COMMISSIONER_STATE_ACTIVE: + state = SPINEL_MESHCOP_COMMISSIONER_STATE_ACTIVE; + break; + } + + return mEncoder.WriteUint8(state); +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + uint8_t state; + otError error = OT_ERROR_NONE; + + SuccessOrExit(error = mDecoder.ReadUint8(state)); + + switch (state) + { + case SPINEL_MESHCOP_COMMISSIONER_STATE_DISABLED: + error = otCommissionerStop(mInstance); + break; + + case SPINEL_MESHCOP_COMMISSIONER_STATE_ACTIVE: + error = otCommissionerStart(mInstance); + break; + + default: + error = OT_ERROR_INVALID_ARGS; + break; + } + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertyInsert(void) +{ + otError error = OT_ERROR_NONE; + const otExtAddress *eui64; + uint32_t timeout; + const char * psk; + + SuccessOrExit(error = mDecoder.OpenStruct()); + + if (!mDecoder.IsAllReadInStruct()) + { + SuccessOrExit(error = mDecoder.ReadEui64(eui64)); + } + else + { + // Empty struct indicates any Joiner (no EUI64 is given so NULL is used.). + eui64 = NULL; + } + + SuccessOrExit(error = mDecoder.CloseStruct()); + + SuccessOrExit(error = mDecoder.ReadUint32(timeout)); + SuccessOrExit(error = mDecoder.ReadUtf8(psk)); + + error = otCommissionerAddJoiner(mInstance, eui64, psk, timeout); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertyRemove(void) +{ + otError error = OT_ERROR_NONE; + const otExtAddress *eui64; + + SuccessOrExit(error = mDecoder.OpenStruct()); + + if (!mDecoder.IsAllReadInStruct()) + { + SuccessOrExit(error = mDecoder.ReadEui64(eui64)); + } + else + { + // Empty struct indicates any Joiner (no EUI64 is given so NULL is used.). + eui64 = NULL; + } + + SuccessOrExit(error = mDecoder.CloseStruct()); + + error = otCommissionerRemoveJoiner(mInstance, eui64); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertyGet(void) +{ + otError error = OT_ERROR_NONE; + uint16_t length = 0; + const char *url = otCommissionerGetProvisioningUrl(mInstance, &length); + + if (url != NULL && length > 0) + { + SuccessOrExit(error = mEncoder.WriteData(reinterpret_cast(url), length)); + } + + SuccessOrExit(error = mEncoder.WriteUint8(0)); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + const char *url; + + SuccessOrExit(error = mDecoder.ReadUtf8(url)); + + error = otCommissionerSetProvisioningUrl(mInstance, url); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertyGet(void) +{ + return mEncoder.WriteUint16(otCommissionerGetSessionId(mInstance)); +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + uint32_t channelMask; + uint8_t count; + uint16_t period; + const otIp6Address *address; + + SuccessOrExit(error = mDecoder.ReadUint32(channelMask)); + SuccessOrExit(error = mDecoder.ReadUint8(count)); + SuccessOrExit(error = mDecoder.ReadUint16(period)); + SuccessOrExit(error = mDecoder.ReadIp6Address(address)); + + error = otCommissionerAnnounceBegin(mInstance, channelMask, count, period, address); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + uint32_t channelMask; + uint8_t count; + uint16_t period; + uint16_t scanDuration; + const otIp6Address *address; + + SuccessOrExit(error = mDecoder.ReadUint32(channelMask)); + SuccessOrExit(error = mDecoder.ReadUint8(count)); + SuccessOrExit(error = mDecoder.ReadUint16(period)); + SuccessOrExit(error = mDecoder.ReadUint16(scanDuration)); + SuccessOrExit(error = mDecoder.ReadIp6Address(address)); + + error = otCommissionerEnergyScan(mInstance, channelMask, count, period, scanDuration, address, + &NcpBase::HandleCommissionerEnergyReport_Jump, this); + +exit: + return error; +} + +void NcpBase::HandleCommissionerEnergyReport_Jump(uint32_t aChannelMask, + const uint8_t *aEnergyData, + uint8_t aLength, + void * aContext) +{ + static_cast(aContext)->HandleCommissionerEnergyReport(aChannelMask, aEnergyData, aLength); +} + +void NcpBase::HandleCommissionerEnergyReport(uint32_t aChannelMask, const uint8_t *aEnergyData, uint8_t aLength) +{ + otError error = OT_ERROR_NONE; + + SuccessOrExit(error = mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_CMD_PROP_VALUE_INSERTED, + SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN_RESULT)); + SuccessOrExit(error = mEncoder.WriteUint32(aChannelMask)); + SuccessOrExit(error = mEncoder.WriteDataWithLen(aEnergyData, aLength)); + SuccessOrExit(error = mEncoder.EndFrame()); + +exit: + + if (error != OT_ERROR_NONE) + { + mChangedPropsSet.AddLastStatus(SPINEL_STATUS_NOMEM); + mUpdateChangedPropsTask.Post(); + } +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + uint16_t panId; + uint32_t channelMask; + const otIp6Address *address; + + SuccessOrExit(error = mDecoder.ReadUint16(panId)); + SuccessOrExit(error = mDecoder.ReadUint32(channelMask)); + SuccessOrExit(error = mDecoder.ReadIp6Address(address)); + + error = otCommissionerPanIdQuery(mInstance, panId, channelMask, address, + &NcpBase::HandleCommissionerPanIdConflict_Jump, this); + +exit: + return error; +} + +void NcpBase::HandleCommissionerPanIdConflict_Jump(uint16_t aPanId, uint32_t aChannelMask, void *aContext) +{ + static_cast(aContext)->HandleCommissionerPanIdConflict(aPanId, aChannelMask); +} + +void NcpBase::HandleCommissionerPanIdConflict(uint16_t aPanId, uint32_t aChannelMask) +{ + otError error = OT_ERROR_NONE; + + SuccessOrExit(error = mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_CMD_PROP_VALUE_INSERTED, + SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_CONFLICT_RESULT)); + + SuccessOrExit(error = mEncoder.WriteUint16(aPanId)); + SuccessOrExit(error = mEncoder.WriteUint32(aChannelMask)); + SuccessOrExit(error = mEncoder.EndFrame()); + +exit: + + if (error != OT_ERROR_NONE) + { + mChangedPropsSet.AddLastStatus(SPINEL_STATUS_NOMEM); + mUpdateChangedPropsTask.Post(); + } +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + const uint8_t *tlvs; + uint16_t length; + + SuccessOrExit(error = mDecoder.ReadDataWithLen(tlvs, length)); + VerifyOrExit(length <= 255, error = OT_ERROR_INVALID_ARGS); + + error = otCommissionerSendMgmtGet(mInstance, tlvs, static_cast(length)); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + const uint8_t * tlvs; + uint16_t length; + otCommissioningDataset dataset; + + SuccessOrExit(error = mDecoder.ReadDataWithLen(tlvs, length)); + VerifyOrExit(length <= 255, error = OT_ERROR_INVALID_ARGS); + + memset(&dataset, 0, sizeof(otCommissioningDataset)); + error = otCommissionerSendMgmtSet(mInstance, &dataset, tlvs, static_cast(length)); + +exit: + return error; +} + +// SPINEL_PROP_THREAD_COMMISSIONER_ENABLED is replaced by SPINEL_PROP_MESHCOP_COMMISSIONER_STATE. Please use the new +// property. The old property/implementation remains for backward compatibility. + template <> otError NcpBase::HandlePropertyGet(void) { return mEncoder.WriteBool(otCommissionerGetState(mInstance) == OT_COMMISSIONER_STATE_ACTIVE); @@ -416,6 +701,9 @@ exit: return PrepareLastStatusResponse(aHeader, ThreadErrorToSpinelStatus(error)); } +// SPINEL_PROP_THREAD_JOINERS is replaced by SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS. Please us the new property. +// The old property/implementation remains for backward compatibility. + template <> otError NcpBase::HandlePropertyInsert(void) { otError error = OT_ERROR_NONE; diff --git a/src/ncp/spinel.c b/src/ncp/spinel.c index 13a92399a..09cd94b83 100644 --- a/src/ncp/spinel.c +++ b/src/ncp/spinel.c @@ -1629,6 +1629,50 @@ const char *spinel_prop_key_to_cstr(spinel_prop_key_t prop_key) ret = "PROP_STREAM_LOG"; break; + case SPINEL_PROP_MESHCOP_COMMISSIONER_STATE: + ret = "PROP_MESHCOP_COMMISSIONER_STATE"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS: + ret = "PROP_MESHCOP_COMMISSIONER_JOINERS"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL: + ret = "PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID: + ret = "PROP_MESHCOP_COMMISSIONER_SESSION_ID"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN: + ret = "PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN: + ret = "PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN_RESULT: + ret = "PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN_RESULT"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY: + ret = "PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_CONFLICT_RESULT: + ret = "PROP_MESHCOP_COMMISSIONER_PAN_ID_CONFLICT_RESULT"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET: + ret = "PROP_MESHCOP_COMMISSIONER_MGMT_GET"; + break; + + case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET: + ret = "PROP_MESHCOP_COMMISSIONER_MGMT_SET"; + break; + case SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL: ret = "PROP_CHANNEL_MANAGER_NEW_CHANNEL"; break; diff --git a/src/ncp/spinel.h b/src/ncp/spinel.h index 6123e52fa..5fedc47a8 100644 --- a/src/ncp/spinel.h +++ b/src/ncp/spinel.h @@ -323,6 +323,13 @@ enum SPINEL_NCP_LOG_REGION_OT_UTIL = 16, }; +enum +{ + SPINEL_MESHCOP_COMMISSIONER_STATE_DISABLED = 0, + SPINEL_MESHCOP_COMMISSIONER_STATE_PETITION = 1, + SPINEL_MESHCOP_COMMISSIONER_STATE_ACTIVE = 2, +}; + typedef struct { uint8_t bytes[8]; @@ -1149,6 +1156,9 @@ typedef enum { /// Thread joiner data /** Format `A(T(ULE))` * PSKd, joiner timeout, eui64 (optional) + * + * This property is being deprecated by SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS. + * */ SPINEL_PROP_THREAD_JOINERS = SPINEL_PROP_THREAD_EXT__BEGIN + 15, @@ -1156,6 +1166,9 @@ typedef enum { /** Format `b` * * Default value is `false`. + * + * This property is being deprecated by SPINEL_PROP_MESHCOP_COMMISSIONER_STATE. + * */ SPINEL_PROP_THREAD_COMMISSIONER_ENABLED = SPINEL_PROP_THREAD_EXT__BEGIN + 16, @@ -1590,10 +1603,170 @@ typedef enum { SPINEL_PROP_STREAM_EXT__END = 0x1800, SPINEL_PROP_MESHCOP__BEGIN = 0x80, - SPINEL_PROP_MESHCOP__END = 0x90, + + // Thread Commissioner State + /** Format `C` + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * The valid values are specified by SPINEL_MESHCOP_COMMISIONER_STATE_ enumeration. + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_STATE = SPINEL_PROP_MESHCOP__BEGIN + 2, + + // Thread Commissioner Joiners + /** Format `A(t(E)UL)` - insert or remove only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * Data per item is: + * + * `t(E)` | `t()`: Joiner EUI64. Empty struct indicates any Joiner + * `L` : Timeout (in seconds) after which the Joiner is automatically removed + * `U` : PSKd + * + * For CMD_PROP_VALUE_REMOVE the timeout and PSKd are optional. + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS = SPINEL_PROP_MESHCOP__BEGIN + 3, + + // Thread Commissioner Provisioning URL + /** Format `U` + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL = SPINEL_PROP_MESHCOP__BEGIN + 4, + + // Thread Commissioner Session ID + /** Format `S` - Read only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID = SPINEL_PROP_MESHCOP__BEGIN + 5, + + SPINEL_PROP_MESHCOP__END = 0x90, SPINEL_PROP_MESHCOP_EXT__BEGIN = 0x1800, - SPINEL_PROP_MESHCOP_EXT__END = 0x1900, + + // Thread Commissioner Announce Begin + /** Format `LCS6` - Write only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * Writing to this property sends an Announce Begin message with the specified parameters. Response is a + * `LAST_STATUS` update with status of operation. + * + * `L` : Channel mask + * `C` : Number of messages per channel + * `S` : The time between two successive MLE Announce transmissions (milliseconds) + * `6` : IPv6 destination + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN = SPINEL_PROP_MESHCOP_EXT__BEGIN + 0, + + // Thread Commissioner Energy Scan Query + /** Format `LCSS6` - Write only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * Writing to this property sends an Energy Scan Query message with the specified parameters. Response is a + * `LAST_STATUS` with status of operation. The energy scan results are emitted asynchronously through + * `SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN_RESULT` updates. + * + * Format is: + * + * `L` : Channel mask + * `C` : The number of energy measurements per channel + * `S` : The time between energy measurements (milliseconds) + * `S` : The scan duration for each energy measurement (milliseconds) + * `6` : IPv6 destination. + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN = SPINEL_PROP_MESHCOP_EXT__BEGIN + 1, + + // Thread Commissioner Energy Scan Result + /** Format `Ld` - Asynchronous event only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * This property provides asynchronous `CMD_PROP_VALUE_INSERTED` updates to report energy scan results for a + * previously sent Energy Scan Query message (please see `SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN`). + * + * Format is: + * + * `L` : Channel mask + * `d` : Energy measurement data (note that `d` encoding includes the length) + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN_RESULT = SPINEL_PROP_MESHCOP_EXT__BEGIN + 2, + + // Thread Commissioner PAN ID Query + /** Format `SL6` - Write only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * Writing to this property sends a PAN ID Query message with the specified parameters. Response is a + * `LAST_STATUS` with status of operation. The PAN ID Conflict results are emitted asynchronously through + * `SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_CONFLICT_RESULT` updates. + * + * Format is: + * + * `S` : PAN ID to query + * `L` : Channel mask + * `6` : IPv6 destination + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY = SPINEL_PROP_MESHCOP_EXT__BEGIN + 3, + + // Thread Commissioner PAN ID Conflict Result + /** Format `SL` - Asynchronous event only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * This property provides asynchronous `CMD_PROP_VALUE_INSERTED` updates to report PAN ID conflict results for a + * previously sent PAN ID Query message (please see `SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY`). + * + * Format is: + * + * `S` : The PAN ID + * `L` : Channel mask + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_CONFLICT_RESULT = SPINEL_PROP_MESHCOP_EXT__BEGIN + 4, + + // Thread Commissioner Send MGMT_COMMISSIONER_GET + /** Format `d` - Write only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * Writing to this property sends a MGMT_COMMISSIONER_GET message with the specified parameters. Response is a + * `LAST_STATUS` with status of operation. + * + * Format is: + * + * `d` : List of TLV types to get + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET = SPINEL_PROP_MESHCOP_EXT__BEGIN + 5, + + // Thread Commissioner Send MGMT_COMMISSIONER_SET + /** Format `d` - Write only + * + * Required capability: SPINEL_CAP_THREAD_COMMISSIONER + * + * Writing to this property sends a MGMT_COMMISSIONER_SET message with the specified parameters. Response is a + * `LAST_STATUS` with status of operation. + * + * Format is: + * + * `d` : TLV encoded data + * + */ + SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET = SPINEL_PROP_MESHCOP_EXT__BEGIN + 6, + + SPINEL_PROP_MESHCOP_EXT__END = 0x1900, SPINEL_PROP_OPENTHREAD__BEGIN = 0x1900, diff --git a/tests/toranj/start.sh b/tests/toranj/start.sh index cb4b41757..cd393303f 100755 --- a/tests/toranj/start.sh +++ b/tests/toranj/start.sh @@ -102,6 +102,7 @@ fi --enable-service \ --enable-channel-monitor \ --enable-channel-manager \ + --enable-commissioner \ --disable-docs \ --disable-test || die