[ncp] add support for Commissioner APIs in spinel and NCP (#2911)

This commit adds support for Commissioner related APIs in spinel and
NCP including starting/stopping Commissioner, setting Provisioning
URL, adding/removing Joiners, and sending Announce Begin, Energy Scan
Query, PAN ID Query, MGMT_GET/MGMT_SET messages.
This commit is contained in:
Abtin Keshavarzian
2018-08-06 14:46:01 -05:00
committed by Jonathan Hui
parent f089fc8e25
commit a9d32b7bef
7 changed files with 563 additions and 2 deletions
+4
View File
@@ -1647,6 +1647,10 @@ template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CAPS>(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
+11
View File
@@ -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);
+40
View File
@@ -552,6 +552,15 @@ NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey)
handler = &NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE>;
break;
#if OPENTHREAD_ENABLE_COMMISSIONER
case SPINEL_PROP_MESHCOP_COMMISSIONER_STATE:
handler = &NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_STATE>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL:
handler = &NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID:
handler = &NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID>;
break;
case SPINEL_PROP_THREAD_COMMISSIONER_ENABLED:
handler = &NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_COMMISSIONER_ENABLED>;
break;
@@ -855,6 +864,29 @@ NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey)
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_CHILD_SUPERVISION_INTERVAL>;
break;
#endif
#if OPENTHREAD_ENABLE_COMMISSIONER
case SPINEL_PROP_MESHCOP_COMMISSIONER_STATE:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_STATE>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET>;
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET>;
break;
#endif
#if OPENTHREAD_ENABLE_CHANNEL_MANAGER
case SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL:
handler = &NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL>;
@@ -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<SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS>;
break;
case SPINEL_PROP_THREAD_JOINERS:
handler = &NcpBase::HandlePropertyInsert<SPINEL_PROP_THREAD_JOINERS>;
break;
@@ -1047,7 +1082,12 @@ NcpBase::PropertyHandler NcpBase::FindRemovePropertyHandler(spinel_prop_key_t aK
case SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS:
handler = &NcpBase::HandlePropertyRemove<SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS>;
break;
#if OPENTHREAD_ENABLE_COMMISSIONER
case SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS:
handler = &NcpBase::HandlePropertyRemove<SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS>;
break;
#endif
#endif // OPENTHREAD_FTD
// --------------------------------------------------------------------------
// Raw Link API Properties (Remove Handler)
+288
View File
@@ -391,6 +391,291 @@ exit:
}
#if OPENTHREAD_ENABLE_COMMISSIONER
template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_STATE>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_STATE>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL>(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<const uint8_t *>(url), length));
}
SuccessOrExit(error = mEncoder.WriteUint8(0));
exit:
return error;
}
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID>(void)
{
return mEncoder.WriteUint16(otCommissionerGetSessionId(mInstance));
}
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN>(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<NcpBase *>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY>(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<NcpBase *>(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<SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET>(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<uint8_t>(length));
exit:
return error;
}
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET>(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<uint8_t>(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<SPINEL_PROP_THREAD_COMMISSIONER_ENABLED>(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<SPINEL_PROP_THREAD_JOINERS>(void)
{
otError error = OT_ERROR_NONE;
+44
View File
@@ -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;
+175 -2
View File
@@ -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_<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,
+1
View File
@@ -102,6 +102,7 @@ fi
--enable-service \
--enable-channel-monitor \
--enable-channel-manager \
--enable-commissioner \
--disable-docs \
--disable-test || die