mirror of
https://github.com/espressif/openthread.git
synced 2026-08-21 09:59:52 +00:00
Add initial commissioning commands support to the NCP (#1393)
* Add initial commissioning commands support to the NCP * Make GetPropertyHandler_THREAD_COMMISSIONER_ENABLED send true only if commissioner active, move commissioner state enum to oepnthread/types.h * Use enum to return commissioner state, make spinel property return true only if Commissioner State Active * Fix spinel documentation
This commit is contained in:
@@ -233,3 +233,24 @@ The leader network data.
|
|||||||
* Packed-Encoding: `D`
|
* Packed-Encoding: `D`
|
||||||
|
|
||||||
The stable leader network data.
|
The stable leader network data.
|
||||||
|
|
||||||
|
### PROP 5391: PROP_THREAD_JOINERS {#prop-thread-joiners}
|
||||||
|
|
||||||
|
* Type: Read-Write
|
||||||
|
* Packed-Encoding: `A(t(ULE))`
|
||||||
|
|
||||||
|
Data per item is:
|
||||||
|
|
||||||
|
* `U`: PSKd
|
||||||
|
* `L`: Timeout in seconds
|
||||||
|
* `E`: Extended/long address (optional)
|
||||||
|
|
||||||
|
Passess Pre-Shared Key for the Device to the NCP in the commissioning process.
|
||||||
|
When the Extended address is ommited all Devices which provided a valid PSKd are allowed to join the Thread Network.
|
||||||
|
|
||||||
|
### PROP 5392: PROP_THREAD_COMMISSIONER_ENABLED {#prop-thread-commissioner-enabled}
|
||||||
|
|
||||||
|
* Type: Read-Write
|
||||||
|
* Packed-Encoding: `b`
|
||||||
|
|
||||||
|
Set to true to enable the native commissioner. It is mandatory before adding the joiner to the network.
|
||||||
|
|||||||
@@ -224,6 +224,18 @@ OTAPI ThreadError OTCALL otCommissionerSendMgmtSet(otInstance *, const otCommiss
|
|||||||
*/
|
*/
|
||||||
OTAPI uint16_t OTCALL otCommissionerGetSessionId(otInstance *);
|
OTAPI uint16_t OTCALL otCommissionerGetSessionId(otInstance *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function returns the Commissioner State.
|
||||||
|
*
|
||||||
|
* @param[in] aInstance A pointer to an OpenThread instance.
|
||||||
|
*
|
||||||
|
* @retval kCommissionerStateDisabled Commissioner disabled.
|
||||||
|
* @retval kCommissionerStatePetition Becoming the commissioner.
|
||||||
|
* @retval kCommissionerStateActive Commissioner enabled.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
OTAPI otCommissionerState OTCALL otCommissionerGetState(otInstance *);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method generates PSKc.
|
* This method generates PSKc.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -282,6 +282,18 @@ enum
|
|||||||
OT_SECURITY_POLICY_BEACONS = 1 << 3, ///< Beacons enabled
|
OT_SECURITY_POLICY_BEACONS = 1 << 3, ///< Beacons enabled
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This enumeration defines the Commissioner State.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef enum otCommissionerState
|
||||||
|
{
|
||||||
|
|
||||||
|
kCommissionerStateDisabled = 0,
|
||||||
|
kCommissionerStatePetition = 1,
|
||||||
|
kCommissionerStateActive = 2,
|
||||||
|
} otCommissionerState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This type represents Channel Mask Page 0.
|
* This type represents Channel Mask Page 0.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -110,6 +110,11 @@ uint16_t otCommissionerGetSessionId(otInstance *aInstance)
|
|||||||
return aInstance->mThreadNetif.GetCommissioner().GetSessionId();
|
return aInstance->mThreadNetif.GetCommissioner().GetSessionId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
otCommissionerState otCommissionerGetState(otInstance *aInstance)
|
||||||
|
{
|
||||||
|
return aInstance->mThreadNetif.GetCommissioner().GetState();
|
||||||
|
}
|
||||||
|
|
||||||
ThreadError otCommissionerGeneratePSKc(otInstance *aInstance, const char *aPassPhrase, const char *aNetworkName,
|
ThreadError otCommissionerGeneratePSKc(otInstance *aInstance, const char *aPassPhrase, const char *aNetworkName,
|
||||||
const uint8_t *aExtPanId, uint8_t *aPSKc)
|
const uint8_t *aExtPanId, uint8_t *aPSKc)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,6 +55,7 @@
|
|||||||
#include <thread/thread_netif.hpp>
|
#include <thread/thread_netif.hpp>
|
||||||
#include <thread/thread_tlvs.hpp>
|
#include <thread/thread_tlvs.hpp>
|
||||||
#include <thread/thread_uris.hpp>
|
#include <thread/thread_uris.hpp>
|
||||||
|
#include <openthread/types.h>
|
||||||
|
|
||||||
using Thread::Encoding::BigEndian::HostSwap64;
|
using Thread::Encoding::BigEndian::HostSwap64;
|
||||||
|
|
||||||
@@ -65,7 +66,7 @@ Commissioner::Commissioner(ThreadNetif &aThreadNetif):
|
|||||||
mAnnounceBegin(aThreadNetif),
|
mAnnounceBegin(aThreadNetif),
|
||||||
mEnergyScan(aThreadNetif),
|
mEnergyScan(aThreadNetif),
|
||||||
mPanIdQuery(aThreadNetif),
|
mPanIdQuery(aThreadNetif),
|
||||||
mState(kStateDisabled),
|
mState(kCommissionerStateDisabled),
|
||||||
mJoinerPort(0),
|
mJoinerPort(0),
|
||||||
mJoinerRloc(0),
|
mJoinerRloc(0),
|
||||||
mJoinerExpirationTimer(aThreadNetif.GetIp6().mTimerScheduler, HandleJoinerExpirationTimer, this),
|
mJoinerExpirationTimer(aThreadNetif.GetIp6().mTimerScheduler, HandleJoinerExpirationTimer, this),
|
||||||
@@ -93,11 +94,11 @@ ThreadError Commissioner::Start(void)
|
|||||||
ThreadError error = kThreadError_None;
|
ThreadError error = kThreadError_None;
|
||||||
|
|
||||||
otLogFuncEntry();
|
otLogFuncEntry();
|
||||||
VerifyOrExit(mState == kStateDisabled, error = kThreadError_InvalidState);
|
VerifyOrExit(mState == kCommissionerStateDisabled, error = kThreadError_InvalidState);
|
||||||
|
|
||||||
SuccessOrExit(error = mNetif.GetSecureCoapServer().Start(SendRelayTransmit, this));
|
SuccessOrExit(error = mNetif.GetSecureCoapServer().Start(SendRelayTransmit, this));
|
||||||
|
|
||||||
mState = kStatePetition;
|
mState = kCommissionerStatePetition;
|
||||||
mTransmitAttempts = 0;
|
mTransmitAttempts = 0;
|
||||||
|
|
||||||
SendPetition();
|
SendPetition();
|
||||||
@@ -112,11 +113,11 @@ ThreadError Commissioner::Stop(void)
|
|||||||
ThreadError error = kThreadError_None;
|
ThreadError error = kThreadError_None;
|
||||||
|
|
||||||
otLogFuncEntry();
|
otLogFuncEntry();
|
||||||
VerifyOrExit(mState != kStateDisabled, error = kThreadError_InvalidState);
|
VerifyOrExit(mState != kCommissionerStateDisabled, error = kThreadError_InvalidState);
|
||||||
|
|
||||||
mNetif.GetSecureCoapServer().Stop();
|
mNetif.GetSecureCoapServer().Stop();
|
||||||
|
|
||||||
mState = kStateDisabled;
|
mState = kCommissionerStateDisabled;
|
||||||
mTransmitAttempts = 0;
|
mTransmitAttempts = 0;
|
||||||
|
|
||||||
mTimer.Stop();
|
mTimer.Stop();
|
||||||
@@ -137,7 +138,7 @@ ThreadError Commissioner::SendCommissionerSet(void)
|
|||||||
SteeringDataTlv steeringData;
|
SteeringDataTlv steeringData;
|
||||||
|
|
||||||
otLogFuncEntry();
|
otLogFuncEntry();
|
||||||
VerifyOrExit(mState == kStateActive, error = kThreadError_InvalidState);
|
VerifyOrExit(mState == kCommissionerStateActive, error = kThreadError_InvalidState);
|
||||||
|
|
||||||
memset(&dataset, 0, sizeof(dataset));
|
memset(&dataset, 0, sizeof(dataset));
|
||||||
|
|
||||||
@@ -292,7 +293,7 @@ uint16_t Commissioner::GetSessionId(void) const
|
|||||||
return mSessionId;
|
return mSessionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Commissioner::GetState(void) const
|
otCommissionerState Commissioner::GetState(void) const
|
||||||
{
|
{
|
||||||
return mState;
|
return mState;
|
||||||
}
|
}
|
||||||
@@ -306,14 +307,14 @@ void Commissioner::HandleTimer(void)
|
|||||||
{
|
{
|
||||||
switch (mState)
|
switch (mState)
|
||||||
{
|
{
|
||||||
case kStateDisabled:
|
case kCommissionerStateDisabled:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kStatePetition:
|
case kCommissionerStatePetition:
|
||||||
SendPetition();
|
SendPetition();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kStateActive:
|
case kCommissionerStateActive:
|
||||||
SendKeepAlive();
|
SendKeepAlive();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -614,7 +615,7 @@ void Commissioner::HandleLeaderPetitionResponse(Coap::Header *aHeader, Message *
|
|||||||
|
|
||||||
otLogFuncEntry();
|
otLogFuncEntry();
|
||||||
|
|
||||||
VerifyOrExit(mState == kStatePetition, mState = kStateDisabled);
|
VerifyOrExit(mState == kCommissionerStatePetition, mState = kCommissionerStateDisabled);
|
||||||
VerifyOrExit(aResult == kThreadError_None &&
|
VerifyOrExit(aResult == kThreadError_None &&
|
||||||
aHeader->GetCode() == kCoapResponseChanged, retransmit = true);
|
aHeader->GetCode() == kCoapResponseChanged, retransmit = true);
|
||||||
|
|
||||||
@@ -623,13 +624,13 @@ void Commissioner::HandleLeaderPetitionResponse(Coap::Header *aHeader, Message *
|
|||||||
SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kState, sizeof(state), state));
|
SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kState, sizeof(state), state));
|
||||||
VerifyOrExit(state.IsValid(), ;);
|
VerifyOrExit(state.IsValid(), ;);
|
||||||
|
|
||||||
VerifyOrExit(state.GetState() == StateTlv::kAccept, mState = kStateDisabled);
|
VerifyOrExit(state.GetState() == StateTlv::kAccept, mState = kCommissionerStateDisabled);
|
||||||
|
|
||||||
SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kCommissionerSessionId, sizeof(sessionId), sessionId));
|
SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kCommissionerSessionId, sizeof(sessionId), sessionId));
|
||||||
VerifyOrExit(sessionId.IsValid(), ;);
|
VerifyOrExit(sessionId.IsValid(), ;);
|
||||||
mSessionId = sessionId.GetCommissionerSessionId();
|
mSessionId = sessionId.GetCommissionerSessionId();
|
||||||
|
|
||||||
mState = kStateActive;
|
mState = kCommissionerStateActive;
|
||||||
mTransmitAttempts = 0;
|
mTransmitAttempts = 0;
|
||||||
mTimer.Start(Timer::SecToMsec(kKeepAliveTimeout) / 2);
|
mTimer.Start(Timer::SecToMsec(kKeepAliveTimeout) / 2);
|
||||||
|
|
||||||
@@ -641,7 +642,7 @@ exit:
|
|||||||
{
|
{
|
||||||
if (mTransmitAttempts >= kPetitionRetryCount)
|
if (mTransmitAttempts >= kPetitionRetryCount)
|
||||||
{
|
{
|
||||||
mState = kStateDisabled;
|
mState = kCommissionerStateDisabled;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -671,7 +672,7 @@ ThreadError Commissioner::SendKeepAlive(void)
|
|||||||
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
|
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
|
||||||
|
|
||||||
state.Init();
|
state.Init();
|
||||||
state.SetState(mState == kStateActive ? StateTlv::kAccept : StateTlv::kReject);
|
state.SetState(mState == kCommissionerStateActive ? StateTlv::kAccept : StateTlv::kReject);
|
||||||
SuccessOrExit(error = message->Append(&state, sizeof(state)));
|
SuccessOrExit(error = message->Append(&state, sizeof(state)));
|
||||||
|
|
||||||
sessionId.Init();
|
sessionId.Init();
|
||||||
@@ -713,16 +714,16 @@ void Commissioner::HandleLeaderKeepAliveResponse(Coap::Header *aHeader, Message
|
|||||||
|
|
||||||
otLogFuncEntry();
|
otLogFuncEntry();
|
||||||
|
|
||||||
VerifyOrExit(mState == kStateActive, mState = kStateDisabled);
|
VerifyOrExit(mState == kCommissionerStateActive, mState = kCommissionerStateDisabled);
|
||||||
VerifyOrExit(aResult == kThreadError_None &&
|
VerifyOrExit(aResult == kThreadError_None &&
|
||||||
aHeader->GetCode() == kCoapResponseChanged, mState = kStateDisabled);
|
aHeader->GetCode() == kCoapResponseChanged, mState = kCommissionerStateDisabled);
|
||||||
|
|
||||||
otLogInfoMeshCoP(GetInstance(), "received Leader Petition response");
|
otLogInfoMeshCoP(GetInstance(), "received Leader Petition response");
|
||||||
|
|
||||||
SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kState, sizeof(state), state));
|
SuccessOrExit(Tlv::GetTlv(*aMessage, Tlv::kState, sizeof(state), state));
|
||||||
VerifyOrExit(state.IsValid(), ;);
|
VerifyOrExit(state.IsValid(), ;);
|
||||||
|
|
||||||
VerifyOrExit(state.GetState() == StateTlv::kAccept, mState = kStateDisabled);
|
VerifyOrExit(state.GetState() == StateTlv::kAccept, mState = kCommissionerStateDisabled);
|
||||||
|
|
||||||
mTimer.Start(Timer::SecToMsec(kKeepAliveTimeout) / 2);
|
mTimer.Start(Timer::SecToMsec(kKeepAliveTimeout) / 2);
|
||||||
|
|
||||||
|
|||||||
@@ -140,23 +140,16 @@ public:
|
|||||||
uint16_t GetSessionId(void) const;
|
uint16_t GetSessionId(void) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commissioner State.
|
* This function returns the Commissioner State.
|
||||||
|
*
|
||||||
|
* @param[in] aInstance A pointer to an OpenThread instance.
|
||||||
|
*
|
||||||
|
* @retval kCommissionerStateDisabled Commissioner disabled.
|
||||||
|
* @retval kCommissionerStatePetition Becoming the commissioner.
|
||||||
|
* @retval kCommissionerStateActive Commissioner enabled.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
enum
|
otCommissionerState GetState(void) const;
|
||||||
{
|
|
||||||
kStateDisabled = 0,
|
|
||||||
kStatePetition = 1,
|
|
||||||
kStateActive = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method returns the Commissioner State.
|
|
||||||
*
|
|
||||||
* @returns The Commissioner State.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
uint8_t GetState(void) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method sends MGMT_COMMISSIONER_GET.
|
* This method sends MGMT_COMMISSIONER_GET.
|
||||||
@@ -260,7 +253,7 @@ private:
|
|||||||
ThreadError SendPetition(void);
|
ThreadError SendPetition(void);
|
||||||
ThreadError SendKeepAlive(void);
|
ThreadError SendKeepAlive(void);
|
||||||
|
|
||||||
uint8_t mState;
|
otCommissionerState mState;
|
||||||
|
|
||||||
struct Joiner
|
struct Joiner
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -53,6 +53,7 @@
|
|||||||
#include <thread/thread_tlvs.hpp>
|
#include <thread/thread_tlvs.hpp>
|
||||||
#include <thread/thread_uris.hpp>
|
#include <thread/thread_uris.hpp>
|
||||||
#include <meshcop/leader.hpp>
|
#include <meshcop/leader.hpp>
|
||||||
|
#include <openthread/types.h>
|
||||||
|
|
||||||
namespace Thread {
|
namespace Thread {
|
||||||
namespace MeshCoP {
|
namespace MeshCoP {
|
||||||
@@ -584,7 +585,7 @@ ThreadError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset,
|
|||||||
#if OPENTHREAD_ENABLE_COMMISSIONER
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
bool isCommissioner;
|
bool isCommissioner;
|
||||||
|
|
||||||
isCommissioner = mNetif.GetCommissioner().GetState() != Commissioner::kStateDisabled ? true : false;
|
isCommissioner = mNetif.GetCommissioner().GetState() != kCommissionerStateDisabled ? true : false;
|
||||||
|
|
||||||
if (isCommissioner)
|
if (isCommissioner)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -47,6 +47,10 @@
|
|||||||
#include "openthread/jam_detection.h"
|
#include "openthread/jam_detection.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
#include "meshcop/commissioner.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "openthread/platform/radio.h"
|
#include "openthread/platform/radio.h"
|
||||||
#include "openthread/platform/misc.h"
|
#include "openthread/platform/misc.h"
|
||||||
|
|
||||||
@@ -154,6 +158,10 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] =
|
|||||||
{ SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, &NcpBase::GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE },
|
{ SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, &NcpBase::GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE },
|
||||||
{ SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED },
|
{ SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED },
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
{ SPINEL_PROP_THREAD_COMMISSIONER_ENABLED, &NcpBase::GetPropertyHandler_THREAD_COMMISSIONER_ENABLED },
|
||||||
|
#endif
|
||||||
|
|
||||||
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::GetPropertyHandler_MAC_WHITELIST },
|
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::GetPropertyHandler_MAC_WHITELIST },
|
||||||
{ SPINEL_PROP_MAC_WHITELIST_ENABLED, &NcpBase::GetPropertyHandler_MAC_WHITELIST_ENABLED },
|
{ SPINEL_PROP_MAC_WHITELIST_ENABLED, &NcpBase::GetPropertyHandler_MAC_WHITELIST_ENABLED },
|
||||||
{ SPINEL_PROP_THREAD_MODE, &NcpBase::GetPropertyHandler_THREAD_MODE },
|
{ SPINEL_PROP_THREAD_MODE, &NcpBase::GetPropertyHandler_THREAD_MODE },
|
||||||
@@ -312,6 +320,10 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] =
|
|||||||
#if OPENTHREAD_ENABLE_LEGACY
|
#if OPENTHREAD_ENABLE_LEGACY
|
||||||
{ SPINEL_PROP_NEST_LEGACY_ULA_PREFIX, &NcpBase::SetPropertyHandler_NEST_LEGACY_ULA_PREFIX },
|
{ SPINEL_PROP_NEST_LEGACY_ULA_PREFIX, &NcpBase::SetPropertyHandler_NEST_LEGACY_ULA_PREFIX },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
{ SPINEL_PROP_THREAD_COMMISSIONER_ENABLED, &NcpBase::SetPropertyHandler_THREAD_COMMISSIONER_ENABLED },
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
const NcpBase::InsertPropertyHandlerEntry NcpBase::mInsertPropertyHandlerTable[] =
|
const NcpBase::InsertPropertyHandlerEntry NcpBase::mInsertPropertyHandlerTable[] =
|
||||||
@@ -325,6 +337,10 @@ const NcpBase::InsertPropertyHandlerEntry NcpBase::mInsertPropertyHandlerTable[]
|
|||||||
{ SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::InsertPropertyHandler_THREAD_ON_MESH_NETS },
|
{ SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::InsertPropertyHandler_THREAD_ON_MESH_NETS },
|
||||||
{ SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::InsertPropertyHandler_THREAD_ASSISTING_PORTS },
|
{ SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::InsertPropertyHandler_THREAD_ASSISTING_PORTS },
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
{ SPINEL_PROP_THREAD_JOINERS, &NcpBase::NcpBase::InsertPropertyHandler_THREAD_JOINERS },
|
||||||
|
#endif
|
||||||
|
|
||||||
{ SPINEL_PROP_CNTR_RESET, &NcpBase::SetPropertyHandler_CNTR_RESET },
|
{ SPINEL_PROP_CNTR_RESET, &NcpBase::SetPropertyHandler_CNTR_RESET },
|
||||||
|
|
||||||
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::InsertPropertyHandler_MAC_WHITELIST },
|
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::InsertPropertyHandler_MAC_WHITELIST },
|
||||||
@@ -3364,6 +3380,23 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
ThreadError NcpBase::GetPropertyHandler_THREAD_COMMISSIONER_ENABLED(uint8_t header, spinel_prop_key_t key)
|
||||||
|
{
|
||||||
|
bool isEnabled = false;
|
||||||
|
if (otCommissionerGetState(mInstance) == kCommissionerStateActive)
|
||||||
|
isEnabled = true;
|
||||||
|
|
||||||
|
return SendPropertyUpdate(
|
||||||
|
header,
|
||||||
|
SPINEL_CMD_PROP_VALUE_IS,
|
||||||
|
key,
|
||||||
|
SPINEL_DATATYPE_BOOL_S,
|
||||||
|
isEnabled
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ThreadError NcpBase::GetPropertyHandler_NET_REQUIRE_JOIN_EXISTING(uint8_t header, spinel_prop_key_t key)
|
ThreadError NcpBase::GetPropertyHandler_NET_REQUIRE_JOIN_EXISTING(uint8_t header, spinel_prop_key_t key)
|
||||||
{
|
{
|
||||||
return SendPropertyUpdate(
|
return SendPropertyUpdate(
|
||||||
@@ -4802,6 +4835,42 @@ ThreadError NcpBase::SetPropertyHandler_CNTR_RESET(uint8_t header, spinel_prop_k
|
|||||||
return SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
|
return SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
ThreadError NcpBase::SetPropertyHandler_THREAD_COMMISSIONER_ENABLED(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||||
|
uint16_t value_len)
|
||||||
|
{
|
||||||
|
bool value = false;
|
||||||
|
spinel_ssize_t parsedLength;
|
||||||
|
ThreadError errorCode = kThreadError_None;
|
||||||
|
(void)key;
|
||||||
|
|
||||||
|
parsedLength = spinel_datatype_unpack(
|
||||||
|
value_ptr,
|
||||||
|
value_len,
|
||||||
|
SPINEL_DATATYPE_BOOL_S,
|
||||||
|
&value
|
||||||
|
);
|
||||||
|
|
||||||
|
if (parsedLength > 0)
|
||||||
|
{
|
||||||
|
if (value == false)
|
||||||
|
{
|
||||||
|
errorCode = otCommissionerStop(mInstance);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errorCode = otCommissionerStart(mInstance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errorCode = kThreadError_Parse;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
|
||||||
|
}
|
||||||
|
#endif // OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
|
||||||
ThreadError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
ThreadError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||||
uint16_t value_len)
|
uint16_t value_len)
|
||||||
{
|
{
|
||||||
@@ -6048,6 +6117,72 @@ ThreadError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_
|
|||||||
return errorCode;
|
return errorCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
ThreadError NcpBase::InsertPropertyHandler_THREAD_JOINERS(uint8_t header, spinel_prop_key_t key,
|
||||||
|
const uint8_t *value_ptr, uint16_t value_len)
|
||||||
|
{
|
||||||
|
spinel_ssize_t parsedLength;
|
||||||
|
ThreadError errorCode = kThreadError_None;
|
||||||
|
|
||||||
|
otExtAddress *ot_ext_address = NULL;
|
||||||
|
const char *aPSKd = NULL;
|
||||||
|
uint32_t joiner_timeout = 0;
|
||||||
|
|
||||||
|
VerifyOrExit(
|
||||||
|
mAllowLocalNetworkDataChange == true,
|
||||||
|
errorCode = SendLastStatus(header, SPINEL_STATUS_INVALID_STATE)
|
||||||
|
);
|
||||||
|
|
||||||
|
parsedLength = spinel_datatype_unpack(
|
||||||
|
value_ptr,
|
||||||
|
value_len,
|
||||||
|
"ULE",
|
||||||
|
&aPSKd,
|
||||||
|
&joiner_timeout,
|
||||||
|
&ot_ext_address
|
||||||
|
);
|
||||||
|
|
||||||
|
if (parsedLength <= 0)
|
||||||
|
{
|
||||||
|
parsedLength = spinel_datatype_unpack(
|
||||||
|
value_ptr,
|
||||||
|
value_len,
|
||||||
|
"UL",
|
||||||
|
&aPSKd,
|
||||||
|
&joiner_timeout
|
||||||
|
);
|
||||||
|
ot_ext_address = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsedLength > 0)
|
||||||
|
{
|
||||||
|
errorCode = otCommissionerAddJoiner(mInstance, ot_ext_address, aPSKd, joiner_timeout);
|
||||||
|
|
||||||
|
if (errorCode == kThreadError_None)
|
||||||
|
{
|
||||||
|
errorCode = SendPropertyUpdate(
|
||||||
|
header,
|
||||||
|
SPINEL_CMD_PROP_VALUE_INSERTED,
|
||||||
|
key,
|
||||||
|
value_ptr,
|
||||||
|
value_len
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errorCode = SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return errorCode;
|
||||||
|
}
|
||||||
|
#endif // OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// MARK: Individual Property Removers
|
// MARK: Individual Property Removers
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -394,6 +394,10 @@ private:
|
|||||||
ThreadError GetPropertyHandler_DEBUG_TEST_ASSERT(uint8_t header, spinel_prop_key_t key);
|
ThreadError GetPropertyHandler_DEBUG_TEST_ASSERT(uint8_t header, spinel_prop_key_t key);
|
||||||
ThreadError GetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spinel_prop_key_t key);
|
ThreadError GetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spinel_prop_key_t key);
|
||||||
|
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
ThreadError GetPropertyHandler_THREAD_COMMISSIONER_ENABLED(uint8_t header, spinel_prop_key_t key);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if OPENTHREAD_ENABLE_JAM_DETECTION
|
#if OPENTHREAD_ENABLE_JAM_DETECTION
|
||||||
ThreadError GetPropertyHandler_JAM_DETECT_ENABLE(uint8_t header, spinel_prop_key_t key);
|
ThreadError GetPropertyHandler_JAM_DETECT_ENABLE(uint8_t header, spinel_prop_key_t key);
|
||||||
ThreadError GetPropertyHandler_JAM_DETECTED(uint8_t header, spinel_prop_key_t key);
|
ThreadError GetPropertyHandler_JAM_DETECTED(uint8_t header, spinel_prop_key_t key);
|
||||||
@@ -513,6 +517,10 @@ private:
|
|||||||
uint16_t value_len);
|
uint16_t value_len);
|
||||||
ThreadError SetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
ThreadError SetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||||
uint16_t value_len);
|
uint16_t value_len);
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
ThreadError SetPropertyHandler_THREAD_COMMISSIONER_ENABLED(uint8_t header, spinel_prop_key_t key,
|
||||||
|
const uint8_t *value_ptr, uint16_t value_len);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if OPENTHREAD_ENABLE_JAM_DETECTION
|
#if OPENTHREAD_ENABLE_JAM_DETECTION
|
||||||
ThreadError SetPropertyHandler_JAM_DETECT_ENABLE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
ThreadError SetPropertyHandler_JAM_DETECT_ENABLE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||||
@@ -551,6 +559,10 @@ private:
|
|||||||
const uint8_t *value_ptr, uint16_t value_len);
|
const uint8_t *value_ptr, uint16_t value_len);
|
||||||
ThreadError InsertPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
ThreadError InsertPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||||
uint16_t value_len);
|
uint16_t value_len);
|
||||||
|
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||||
|
ThreadError InsertPropertyHandler_THREAD_JOINERS(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||||
|
uint16_t value_len);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if OPENTHREAD_ENABLE_RAW_LINK_API
|
#if OPENTHREAD_ENABLE_RAW_LINK_API
|
||||||
ThreadError RemovePropertyHandler_MAC_SRC_MATCH_SHORT_ADDRESSES(uint8_t header, spinel_prop_key_t key,
|
ThreadError RemovePropertyHandler_MAC_SRC_MATCH_SHORT_ADDRESSES(uint8_t header, spinel_prop_key_t key,
|
||||||
|
|||||||
@@ -1163,6 +1163,14 @@ spinel_prop_key_to_cstr(spinel_prop_key_t prop_key)
|
|||||||
ret = "PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE";
|
ret = "PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SPINEL_PROP_THREAD_JOINERS:
|
||||||
|
ret = "SPINEL_PROP_THREAD_JOINERS";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SPINEL_PROP_THREAD_COMMISSIONER_ENABLED:
|
||||||
|
ret = "SPINEL_PROP_THREAD_COMMISSIONER_ENABLED";
|
||||||
|
break;
|
||||||
|
|
||||||
case SPINEL_PROP_THREAD_RLOC16_DEBUG_PASSTHRU:
|
case SPINEL_PROP_THREAD_RLOC16_DEBUG_PASSTHRU:
|
||||||
ret = "PROP_THREAD_RLOC16_DEBUG_PASSTHRU";
|
ret = "PROP_THREAD_RLOC16_DEBUG_PASSTHRU";
|
||||||
break;
|
break;
|
||||||
|
|||||||
+33
-26
@@ -105,8 +105,7 @@ typedef enum
|
|||||||
SPINEL_STATUS_CCA_FAILURE = 18, ///< The packet was not sent due to a CCA failure.
|
SPINEL_STATUS_CCA_FAILURE = 18, ///< The packet was not sent due to a CCA failure.
|
||||||
SPINEL_STATUS_ALREADY = 19, ///< The operation is already in progress.
|
SPINEL_STATUS_ALREADY = 19, ///< The operation is already in progress.
|
||||||
SPINEL_STATUS_ITEM_NOT_FOUND = 20, ///< The given item could not be found.
|
SPINEL_STATUS_ITEM_NOT_FOUND = 20, ///< The given item could not be found.
|
||||||
SPINEL_STATUS_INVALID_COMMAND_FOR_PROP
|
SPINEL_STATUS_INVALID_COMMAND_FOR_PROP = 21, ///< The given command cannot be performed on this property.
|
||||||
= 21, ///< The given command cannot be performed on this property.
|
|
||||||
|
|
||||||
SPINEL_STATUS_JOIN__BEGIN = 104,
|
SPINEL_STATUS_JOIN__BEGIN = 104,
|
||||||
|
|
||||||
@@ -189,8 +188,7 @@ typedef enum
|
|||||||
SPINEL_POWER_STATE_ONLINE = 4,
|
SPINEL_POWER_STATE_ONLINE = 4,
|
||||||
} spinel_power_state_t;
|
} spinel_power_state_t;
|
||||||
|
|
||||||
enum
|
enum {
|
||||||
{
|
|
||||||
SPINEL_NET_FLAG_ON_MESH = (1 << 0),
|
SPINEL_NET_FLAG_ON_MESH = (1 << 0),
|
||||||
SPINEL_NET_FLAG_DEFAULT_ROUTE = (1 << 1),
|
SPINEL_NET_FLAG_DEFAULT_ROUTE = (1 << 1),
|
||||||
SPINEL_NET_FLAG_CONFIGURE = (1 << 2),
|
SPINEL_NET_FLAG_CONFIGURE = (1 << 2),
|
||||||
@@ -812,6 +810,18 @@ typedef enum
|
|||||||
SPINEL_PROP_THREAD_STABLE_LEADER_NETWORK_DATA
|
SPINEL_PROP_THREAD_STABLE_LEADER_NETWORK_DATA
|
||||||
= SPINEL_PROP_THREAD_EXT__BEGIN + 14,
|
= SPINEL_PROP_THREAD_EXT__BEGIN + 14,
|
||||||
|
|
||||||
|
/// Thread joiner data
|
||||||
|
/** Format `A(T(ULE))`
|
||||||
|
* PSKd, joiner timeout, eui64 (optional)
|
||||||
|
*/
|
||||||
|
SPINEL_PROP_THREAD_JOINERS = SPINEL_PROP_THREAD_EXT__BEGIN + 15,
|
||||||
|
|
||||||
|
/// Thread commissioner enable
|
||||||
|
/** Format `b`
|
||||||
|
*
|
||||||
|
* Default value is `false`.
|
||||||
|
*/
|
||||||
|
SPINEL_PROP_THREAD_COMMISSIONER_ENABLED = SPINEL_PROP_THREAD_EXT__BEGIN + 16,
|
||||||
SPINEL_PROP_THREAD_EXT__END = 0x1600,
|
SPINEL_PROP_THREAD_EXT__END = 0x1600,
|
||||||
|
|
||||||
SPINEL_PROP_IPV6__BEGIN = 0x60,
|
SPINEL_PROP_IPV6__BEGIN = 0x60,
|
||||||
@@ -821,6 +831,7 @@ typedef enum
|
|||||||
SPINEL_PROP_IPV6_ADDRESS_TABLE = SPINEL_PROP_IPV6__BEGIN + 3, ///< array(ipv6addr,prefixlen,valid,preferred,flags) [A(t(6CLLC))]
|
SPINEL_PROP_IPV6_ADDRESS_TABLE = SPINEL_PROP_IPV6__BEGIN + 3, ///< array(ipv6addr,prefixlen,valid,preferred,flags) [A(t(6CLLC))]
|
||||||
SPINEL_PROP_IPV6_ROUTE_TABLE = SPINEL_PROP_IPV6__BEGIN + 4, ///< array(ipv6prefix,prefixlen,iface,flags) [A(t(6CCC))]
|
SPINEL_PROP_IPV6_ROUTE_TABLE = SPINEL_PROP_IPV6__BEGIN + 4, ///< array(ipv6prefix,prefixlen,iface,flags) [A(t(6CCC))]
|
||||||
|
|
||||||
|
|
||||||
/// IPv6 ICMP Ping Offload
|
/// IPv6 ICMP Ping Offload
|
||||||
/** Format: `b`
|
/** Format: `b`
|
||||||
*
|
*
|
||||||
@@ -840,6 +851,7 @@ typedef enum
|
|||||||
SPINEL_PROP_STREAM_NET_INSECURE = SPINEL_PROP_STREAM__BEGIN + 3, ///< [dD]
|
SPINEL_PROP_STREAM_NET_INSECURE = SPINEL_PROP_STREAM__BEGIN + 3, ///< [dD]
|
||||||
SPINEL_PROP_STREAM__END = 0x80,
|
SPINEL_PROP_STREAM__END = 0x80,
|
||||||
|
|
||||||
|
|
||||||
/// UART Bitrate
|
/// UART Bitrate
|
||||||
/** Format: `L`
|
/** Format: `L`
|
||||||
*
|
*
|
||||||
@@ -886,12 +898,9 @@ typedef enum
|
|||||||
// For brevity, the entire 802.15.4 PIB space is
|
// For brevity, the entire 802.15.4 PIB space is
|
||||||
// not defined here, but a few choice attributes
|
// not defined here, but a few choice attributes
|
||||||
// are defined for illustration and convenience.
|
// are defined for illustration and convenience.
|
||||||
SPINEL_PROP_15_4_PIB_PHY_CHANNELS_SUPPORTED
|
SPINEL_PROP_15_4_PIB_PHY_CHANNELS_SUPPORTED = SPINEL_PROP_15_4_PIB__BEGIN + 0x01, ///< [A(L)]
|
||||||
= SPINEL_PROP_15_4_PIB__BEGIN + 0x01, ///< [A(L)]
|
SPINEL_PROP_15_4_PIB_MAC_PROMISCUOUS_MODE = SPINEL_PROP_15_4_PIB__BEGIN + 0x51, ///< [b]
|
||||||
SPINEL_PROP_15_4_PIB_MAC_PROMISCUOUS_MODE
|
SPINEL_PROP_15_4_PIB_MAC_SECURITY_ENABLED = SPINEL_PROP_15_4_PIB__BEGIN + 0x5d, ///< [b]
|
||||||
= SPINEL_PROP_15_4_PIB__BEGIN + 0x51, ///< [b]
|
|
||||||
SPINEL_PROP_15_4_PIB_MAC_SECURITY_ENABLED
|
|
||||||
= SPINEL_PROP_15_4_PIB__BEGIN + 0x5d, ///< [b]
|
|
||||||
SPINEL_PROP_15_4_PIB__END = 1280,
|
SPINEL_PROP_15_4_PIB__END = 1280,
|
||||||
|
|
||||||
SPINEL_PROP_CNTR__BEGIN = 1280,
|
SPINEL_PROP_CNTR__BEGIN = 1280,
|
||||||
@@ -1095,11 +1104,13 @@ typedef enum
|
|||||||
|
|
||||||
/// The legacy network ULA prefix (8 bytes)
|
/// The legacy network ULA prefix (8 bytes)
|
||||||
/** Format: 'D' */
|
/** Format: 'D' */
|
||||||
SPINEL_PROP_NEST_LEGACY_ULA_PREFIX = SPINEL_PROP_NEST__BEGIN + 1,
|
SPINEL_PROP_NEST_LEGACY_ULA_PREFIX
|
||||||
|
= SPINEL_PROP_NEST__BEGIN + 1,
|
||||||
|
|
||||||
/// A (newly) joined legacy node (this is signaled from NCP)
|
/// A (newly) joined legacy node (this is signaled from NCP)
|
||||||
/** Format: 'E' */
|
/** Format: 'E' */
|
||||||
SPINEL_PROP_NEST_LEGACY_JOINED_NODE = SPINEL_PROP_NEST__BEGIN + 2,
|
SPINEL_PROP_NEST_LEGACY_JOINED_NODE
|
||||||
|
= SPINEL_PROP_NEST__BEGIN + 2,
|
||||||
|
|
||||||
SPINEL_PROP_NEST__END = 15360,
|
SPINEL_PROP_NEST__END = 15360,
|
||||||
|
|
||||||
@@ -1114,7 +1125,8 @@ typedef enum
|
|||||||
/// NCP to reset, but if this is not supported a `false` boolean
|
/// NCP to reset, but if this is not supported a `false` boolean
|
||||||
/// is returned in response.
|
/// is returned in response.
|
||||||
/** Format: 'b' (read-only) */
|
/** Format: 'b' (read-only) */
|
||||||
SPINEL_PROP_DEBUG_TEST_ASSERT = SPINEL_PROP_DEBUG__BEGIN + 0,
|
SPINEL_PROP_DEBUG_TEST_ASSERT
|
||||||
|
= SPINEL_PROP_DEBUG__BEGIN + 0,
|
||||||
|
|
||||||
/// The NCP log level.
|
/// The NCP log level.
|
||||||
/** Format: `C` */
|
/** Format: `C` */
|
||||||
@@ -1146,17 +1158,10 @@ typedef enum
|
|||||||
|
|
||||||
#define SPINEL_GET_NEXT_TID(x) (spinel_tid_t)((x)>=0xF?1:(x)+1)
|
#define SPINEL_GET_NEXT_TID(x) (spinel_tid_t)((x)>=0xF?1:(x)+1)
|
||||||
|
|
||||||
#define SPINEL_BEACON_THREAD_FLAG_VERSION_SHIFT \
|
#define SPINEL_BEACON_THREAD_FLAG_VERSION_SHIFT 4
|
||||||
4
|
#define SPINEL_BEACON_THREAD_FLAG_VERSION_MASK (0xf << SPINEL_BEACON_THREAD_FLAG_VERSION_SHIFT)
|
||||||
|
#define SPINEL_BEACON_THREAD_FLAG_JOINABLE (1 << 0)
|
||||||
#define SPINEL_BEACON_THREAD_FLAG_VERSION_MASK \
|
#define SPINEL_BEACON_THREAD_FLAG_NATIVE (1 << 3)
|
||||||
(0xf << SPINEL_BEACON_THREAD_FLAG_VERSION_SHIFT)
|
|
||||||
|
|
||||||
#define SPINEL_BEACON_THREAD_FLAG_JOINABLE \
|
|
||||||
(1 << 0)
|
|
||||||
|
|
||||||
#define SPINEL_BEACON_THREAD_FLAG_NATIVE \
|
|
||||||
(1 << 3)
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -1207,10 +1212,12 @@ typedef char spinel_datatype_t;
|
|||||||
#define SPINEL_DATATYPE_ARRAY_STRUCT_S(x) \
|
#define SPINEL_DATATYPE_ARRAY_STRUCT_S(x) \
|
||||||
SPINEL_DATATYPE_ARRAY_S(SPINEL_DATATYPE_STRUCT_WLEN_S(x))
|
SPINEL_DATATYPE_ARRAY_S(SPINEL_DATATYPE_STRUCT_WLEN_S(x))
|
||||||
|
|
||||||
#define SPINEL_DATATYPE_COMMAND_S SPINEL_DATATYPE_UINT8_S /* header */ \
|
#define SPINEL_DATATYPE_COMMAND_S \
|
||||||
|
SPINEL_DATATYPE_UINT8_S /* header */ \
|
||||||
SPINEL_DATATYPE_UINT_PACKED_S /* command */
|
SPINEL_DATATYPE_UINT_PACKED_S /* command */
|
||||||
|
|
||||||
#define SPINEL_DATATYPE_COMMAND_PROP_S SPINEL_DATATYPE_COMMAND_S /* prop command */ \
|
#define SPINEL_DATATYPE_COMMAND_PROP_S \
|
||||||
|
SPINEL_DATATYPE_COMMAND_S /* prop command */ \
|
||||||
SPINEL_DATATYPE_UINT_PACKED_S /* property id */
|
SPINEL_DATATYPE_UINT_PACKED_S /* property id */
|
||||||
|
|
||||||
#define SPINEL_DATATYPE_MAC_SCAN_RESULT_S(mac_format_str, net_format_str) \
|
#define SPINEL_DATATYPE_MAC_SCAN_RESULT_S(mac_format_str, net_format_str) \
|
||||||
|
|||||||
Reference in New Issue
Block a user