mirror of
https://github.com/espressif/openthread.git
synced 2026-09-02 15:20:07 +00:00
ncp: Add support for additional Spinel properties (#360)
This commit adds support for the following properties: * `PROP_MAC_WHITELIST` * `PROP_MAC_WHITELIST_ENABLED` * `PROP_THREAD_MODE` * `PROP_THREAD_CHILD_TIMEOUT` * `PROP_THREAD_ROUTER_UPGRADE_THRESHOLD` * `PROP_THREAD_CONTEXT_REUSE_DELAY` It also adds documentation for the property `PROP_MAC_WHITELIST_ENABLED`, which was previously undocumented. This commit also fixes a few style errors and some typos.
This commit is contained in:
committed by
Jonathan Hui
parent
3298d8ba37
commit
cfdc53088e
+14
-2
@@ -1,7 +1,7 @@
|
||||
Spinel Host Controller Interface
|
||||
================================
|
||||
|
||||
Updated: 2016-08-05
|
||||
Updated: 2016-08-10
|
||||
|
||||
Written by: Robert Quattlebaum <rquattle@nestlabs.com>
|
||||
|
||||
@@ -1418,8 +1418,20 @@ Possible Values:
|
||||
|
||||
#### D.2.10. PROP 4864: `PROP_MAC_WHITELIST`
|
||||
* Type: Read-Write
|
||||
* Packed-Encoding: `A(T(E))`
|
||||
* Packed-Encoding: `A(T(Ec))`
|
||||
|
||||
Structure Parameters:
|
||||
|
||||
* `E`: EUI64 address of node
|
||||
* `c`: Optional RSSI-override value. The value 127 indicates
|
||||
that the RSSI-override feature is not enabled for this
|
||||
address. If this value is ommitted when setting or
|
||||
inserting, it is assumed to be 127. This parameter is
|
||||
ignored when removing.
|
||||
|
||||
#### D.2.11. PROP 4865: `PROP_MAC_WHITELIST_ENABLED`
|
||||
* Type: Read-Write
|
||||
* Packed-Encoding: `b`
|
||||
|
||||
### D.3. NET Properties
|
||||
|
||||
|
||||
+482
-3
@@ -41,7 +41,8 @@
|
||||
#include <platform/radio.h>
|
||||
#include <platform/misc.h>
|
||||
|
||||
namespace Thread {
|
||||
namespace Thread
|
||||
{
|
||||
|
||||
extern ThreadNetif *sThreadNetif;
|
||||
|
||||
@@ -49,6 +50,16 @@ static NcpBase *sNcpContext = NULL;
|
||||
|
||||
#define NCP_PLAT_RESET_REASON (1U<<31)
|
||||
|
||||
enum
|
||||
{
|
||||
kThreadModeTLV_Receiver = (1 << 3),
|
||||
kThreadModeTLV_Secure = (1 << 2),
|
||||
kThreadModeTLV_DeviceType = (1 << 1),
|
||||
kThreadModeTLV_NetworkData = (1 << 0),
|
||||
};
|
||||
|
||||
#define RSSI_OVERRIDE_DISABLED 127 // Used for PROP_MAC_WHITELIST
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// MARK: Command/Property Jump Tables
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -111,6 +122,14 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] =
|
||||
{ SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::NcpBase::GetPropertyHandler_THREAD_ASSISTING_PORTS },
|
||||
{ SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, &NcpBase::GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE},
|
||||
|
||||
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::GetPropertyHandler_MAC_WHITELIST },
|
||||
{ SPINEL_PROP_MAC_WHITELIST_ENABLED, &NcpBase::GetPropertyHandler_MAC_WHITELIST_ENABLED },
|
||||
{ SPINEL_PROP_THREAD_MODE, &NcpBase::GetPropertyHandler_THREAD_MODE },
|
||||
{ SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::GetPropertyHandler_THREAD_CHILD_TIMEOUT },
|
||||
{ SPINEL_PROP_THREAD_RLOC16, &NcpBase::GetPropertyHandler_THREAD_RLOC16 },
|
||||
{ SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD },
|
||||
{ SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY },
|
||||
|
||||
{ SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::GetPropertyHandler_IPV6_ML_PREFIX },
|
||||
{ SPINEL_PROP_IPV6_ML_ADDR, &NcpBase::GetPropertyHandler_IPV6_ML_ADDR },
|
||||
{ SPINEL_PROP_IPV6_LL_ADDR, &NcpBase::GetPropertyHandler_IPV6_LL_ADDR },
|
||||
@@ -176,6 +195,14 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] =
|
||||
{ SPINEL_PROP_STREAM_NET, &NcpBase::SetPropertyHandler_STREAM_NET },
|
||||
|
||||
{ SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::SetPropertyHandler_IPV6_ML_PREFIX },
|
||||
|
||||
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::SetPropertyHandler_MAC_WHITELIST },
|
||||
{ SPINEL_PROP_MAC_WHITELIST_ENABLED, &NcpBase::SetPropertyHandler_MAC_WHITELIST_ENABLED },
|
||||
{ SPINEL_PROP_THREAD_MODE, &NcpBase::SetPropertyHandler_THREAD_MODE },
|
||||
{ SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::SetPropertyHandler_THREAD_CHILD_TIMEOUT },
|
||||
{ SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD },
|
||||
{ SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY },
|
||||
|
||||
};
|
||||
|
||||
const NcpBase::InsertPropertyHandlerEntry NcpBase::mInsertPropertyHandlerTable[] =
|
||||
@@ -186,6 +213,8 @@ const NcpBase::InsertPropertyHandlerEntry NcpBase::mInsertPropertyHandlerTable[]
|
||||
{ SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::NcpBase::InsertPropertyHandler_THREAD_ASSISTING_PORTS },
|
||||
|
||||
{ SPINEL_PROP_CNTR_RESET, &NcpBase::SetPropertyHandler_CNTR_RESET },
|
||||
|
||||
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::InsertPropertyHandler_MAC_WHITELIST },
|
||||
};
|
||||
|
||||
const NcpBase::RemovePropertyHandlerEntry NcpBase::mRemovePropertyHandlerTable[] =
|
||||
@@ -194,6 +223,7 @@ const NcpBase::RemovePropertyHandlerEntry NcpBase::mRemovePropertyHandlerTable[]
|
||||
{ SPINEL_PROP_THREAD_LOCAL_ROUTES, &NcpBase::NcpBase::RemovePropertyHandler_THREAD_LOCAL_ROUTES },
|
||||
{ SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::NcpBase::RemovePropertyHandler_THREAD_ON_MESH_NETS },
|
||||
{ SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::NcpBase::RemovePropertyHandler_THREAD_ASSISTING_PORTS },
|
||||
{ SPINEL_PROP_MAC_WHITELIST, &NcpBase::RemovePropertyHandler_MAC_WHITELIST },
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -250,8 +280,18 @@ static spinel_status_t ThreadErrorToSpinelStatus(ThreadError error)
|
||||
ret = SPINEL_STATUS_CCA_FAILURE;
|
||||
break;
|
||||
|
||||
case kThreadError_Already:
|
||||
ret = SPINEL_STATUS_ALREADY;
|
||||
break;
|
||||
|
||||
case kThreadError_NotFound:
|
||||
ret = SPINEL_STATUS_ITEM_NOT_FOUND;
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
ret = SPINEL_STATUS_FAILURE;
|
||||
// Unknown error code. Wrap it as a Spinel status and return that.
|
||||
ret = static_cast<spinel_status_t>(SPINEL_STATUS_STACK_NATIVE__BEGIN + error);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1068,6 +1108,8 @@ ThreadError NcpBase::GetPropertyHandler_CAPS(uint8_t header, spinel_prop_key_t k
|
||||
|
||||
SuccessOrExit(errorCode = OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_COUNTERS));
|
||||
|
||||
SuccessOrExit(errorCode = OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_MAC_WHITELIST));
|
||||
|
||||
// TODO: Somehow get the following capability from the radio.
|
||||
SuccessOrExit(errorCode = OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S,
|
||||
SPINEL_CAP_802_15_4_2450MHZ_OQPSK));
|
||||
@@ -1861,6 +1903,123 @@ bail:
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::GetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key)
|
||||
{
|
||||
otMacWhitelistEntry entry;
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
|
||||
SuccessOrExit(errorCode = OutboundFrameBegin());
|
||||
|
||||
SuccessOrExit(errorCode = OutboundFrameFeedPacked("Cii", header, SPINEL_CMD_PROP_VALUE_IS, key));
|
||||
|
||||
for (uint8_t i = 0; (i != 255) && (errorCode == kThreadError_None); i++)
|
||||
{
|
||||
errorCode = otGetMacWhitelistEntry(i, &entry);
|
||||
|
||||
if (errorCode != kThreadError_None)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
SuccessOrExit(errorCode = OutboundFrameFeedPacked("T(Ecb).", &entry.mExtAddress, entry.mRssi, entry.mValid));
|
||||
}
|
||||
|
||||
SuccessOrExit(errorCode = OutboundFrameSend());
|
||||
|
||||
exit:
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::GetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t header, spinel_prop_key_t key)
|
||||
{
|
||||
return SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_IS,
|
||||
key,
|
||||
SPINEL_DATATYPE_BOOL_S,
|
||||
otIsMacWhitelistEnabled()
|
||||
);
|
||||
}
|
||||
|
||||
ThreadError NcpBase::GetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_key_t key)
|
||||
{
|
||||
uint8_t numeric_mode(0);
|
||||
otLinkModeConfig mode_config(otGetLinkMode());
|
||||
|
||||
if (mode_config.mRxOnWhenIdle)
|
||||
{
|
||||
numeric_mode |= kThreadModeTLV_Receiver;
|
||||
}
|
||||
|
||||
if (mode_config.mSecureDataRequests)
|
||||
{
|
||||
numeric_mode |= kThreadModeTLV_Secure;
|
||||
}
|
||||
|
||||
if (mode_config.mDeviceType)
|
||||
{
|
||||
numeric_mode |= kThreadModeTLV_DeviceType;
|
||||
}
|
||||
|
||||
if (mode_config.mNetworkData)
|
||||
{
|
||||
numeric_mode |= kThreadModeTLV_NetworkData;
|
||||
}
|
||||
|
||||
return SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_IS,
|
||||
key,
|
||||
SPINEL_DATATYPE_UINT8_S,
|
||||
numeric_mode
|
||||
);
|
||||
}
|
||||
|
||||
ThreadError NcpBase::GetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key)
|
||||
{
|
||||
return SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_IS,
|
||||
key,
|
||||
SPINEL_DATATYPE_UINT32_S,
|
||||
otGetChildTimeout()
|
||||
);
|
||||
}
|
||||
|
||||
ThreadError NcpBase::GetPropertyHandler_THREAD_RLOC16(uint8_t header, spinel_prop_key_t key)
|
||||
{
|
||||
return SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_IS,
|
||||
key,
|
||||
SPINEL_DATATYPE_UINT16_S,
|
||||
otGetRloc16()
|
||||
);
|
||||
}
|
||||
|
||||
ThreadError NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key)
|
||||
{
|
||||
return SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_IS,
|
||||
key,
|
||||
SPINEL_DATATYPE_UINT8_S,
|
||||
otGetRouterUpgradeThreshold()
|
||||
);
|
||||
}
|
||||
|
||||
ThreadError NcpBase::GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key)
|
||||
{
|
||||
return SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_IS,
|
||||
key,
|
||||
SPINEL_DATATYPE_UINT32_S,
|
||||
otGetContextIdReuseDelay()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// MARK: Individual Property Setters
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -2845,6 +3004,234 @@ ThreadError NcpBase::SetPropertyHandler_CNTR_RESET(uint8_t header, spinel_prop_k
|
||||
return SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
|
||||
}
|
||||
|
||||
ThreadError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
spinel_ssize_t parsedLength = 1;
|
||||
|
||||
// First, clear the whitelist.
|
||||
otClearMacWhitelist();
|
||||
|
||||
while ((errorCode == kThreadError_None)
|
||||
&& (parsedLength > 0)
|
||||
&& (value_len > 0)
|
||||
)
|
||||
{
|
||||
otExtAddress ext_addr;
|
||||
int8_t rssi = RSSI_OVERRIDE_DISABLED;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
"T(E).",
|
||||
&ext_addr
|
||||
);
|
||||
|
||||
if (parsedLength <= 0)
|
||||
{
|
||||
errorCode = kThreadError_Parse;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check for an RSSI
|
||||
if (parsedLength > static_cast<spinel_ssize_t>(sizeof(ext_addr)))
|
||||
{
|
||||
spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
"T(Ec).",
|
||||
NULL,
|
||||
&rssi
|
||||
);
|
||||
}
|
||||
|
||||
if (rssi == RSSI_OVERRIDE_DISABLED)
|
||||
{
|
||||
errorCode = otAddMacWhitelist(ext_addr.m8);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = otAddMacWhitelistRssi(ext_addr.m8, rssi);
|
||||
}
|
||||
|
||||
value_ptr += parsedLength;
|
||||
value_len -= parsedLength;
|
||||
}
|
||||
|
||||
if (errorCode == kThreadError_None)
|
||||
{
|
||||
errorCode = HandleCommandPropertyGet(header, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
|
||||
|
||||
// We had an error, but we may have actually changed
|
||||
// the state of the whitelist---so we need to report
|
||||
// those incomplete changes via an asynchronous
|
||||
// change event.
|
||||
HandleCommandPropertyGet(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, key);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::SetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
bool isEnabled;
|
||||
spinel_ssize_t parsedLength;
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
SPINEL_DATATYPE_BOOL_S,
|
||||
&isEnabled
|
||||
);
|
||||
|
||||
if (parsedLength > 0)
|
||||
{
|
||||
if (isEnabled)
|
||||
{
|
||||
otEnableMacWhitelist();
|
||||
}
|
||||
else
|
||||
{
|
||||
otDisableMacWhitelist();
|
||||
}
|
||||
|
||||
errorCode = HandleCommandPropertyGet(header, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::SetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
uint8_t numeric_mode = 0;
|
||||
otLinkModeConfig mode_config;
|
||||
spinel_ssize_t parsedLength;
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
SPINEL_DATATYPE_UINT8_S,
|
||||
&numeric_mode
|
||||
);
|
||||
|
||||
if (parsedLength > 0)
|
||||
{
|
||||
mode_config.mRxOnWhenIdle = ((numeric_mode & kThreadModeTLV_Receiver) == kThreadModeTLV_Receiver);
|
||||
mode_config.mSecureDataRequests = ((numeric_mode & kThreadModeTLV_Secure) == kThreadModeTLV_Secure);
|
||||
mode_config.mDeviceType = ((numeric_mode & kThreadModeTLV_DeviceType) == kThreadModeTLV_DeviceType);
|
||||
mode_config.mNetworkData = ((numeric_mode & kThreadModeTLV_NetworkData) == kThreadModeTLV_NetworkData);
|
||||
|
||||
errorCode = otSetLinkMode(mode_config);
|
||||
|
||||
if (errorCode == kThreadError_None)
|
||||
{
|
||||
errorCode = HandleCommandPropertyGet(header, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::SetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
spinel_ssize_t parsedLength;
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
SPINEL_DATATYPE_UINT32_S,
|
||||
&i
|
||||
);
|
||||
|
||||
if (parsedLength > 0)
|
||||
{
|
||||
otSetChildTimeout(i);
|
||||
|
||||
errorCode = HandleCommandPropertyGet(header, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
spinel_ssize_t parsedLength;
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
SPINEL_DATATYPE_UINT8_S,
|
||||
&i
|
||||
);
|
||||
|
||||
if (parsedLength > 0)
|
||||
{
|
||||
otSetRouterUpgradeThreshold(i);
|
||||
|
||||
errorCode = HandleCommandPropertyGet(header, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
spinel_ssize_t parsedLength;
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
SPINEL_DATATYPE_UINT32_S,
|
||||
&i
|
||||
);
|
||||
|
||||
if (parsedLength > 0)
|
||||
{
|
||||
otSetContextIdReuseDelay(i);
|
||||
|
||||
errorCode = HandleCommandPropertyGet(header, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// MARK: Individual Property Inserters
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -3090,7 +3477,7 @@ ThreadError NcpBase::InsertPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header
|
||||
{
|
||||
errorCode = SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_REMOVED,
|
||||
SPINEL_CMD_PROP_VALUE_INSERTED,
|
||||
key,
|
||||
value_ptr,
|
||||
value_len
|
||||
@@ -3109,6 +3496,65 @@ ThreadError NcpBase::InsertPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
spinel_ssize_t parsedLength;
|
||||
otExtAddress ext_addr;
|
||||
int8_t rssi = RSSI_OVERRIDE_DISABLED;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
"E",
|
||||
&ext_addr
|
||||
);
|
||||
|
||||
// Check for an RSSI
|
||||
if (parsedLength > static_cast<spinel_ssize_t>(sizeof(ext_addr)))
|
||||
{
|
||||
spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
"Ec",
|
||||
NULL,
|
||||
&rssi
|
||||
);
|
||||
}
|
||||
|
||||
if (parsedLength > 0)
|
||||
{
|
||||
if (rssi == RSSI_OVERRIDE_DISABLED)
|
||||
{
|
||||
errorCode = otAddMacWhitelist(ext_addr.m8);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = otAddMacWhitelistRssi(ext_addr.m8, rssi);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// MARK: Individual Property Removers
|
||||
@@ -3326,6 +3772,39 @@ ThreadError NcpBase::RemovePropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
ThreadError NcpBase::RemovePropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
|
||||
{
|
||||
ThreadError errorCode = kThreadError_None;
|
||||
spinel_ssize_t parsedLength;
|
||||
otExtAddress ext_addr;
|
||||
|
||||
parsedLength = spinel_datatype_unpack(
|
||||
value_ptr,
|
||||
value_len,
|
||||
"E",
|
||||
&ext_addr
|
||||
);
|
||||
|
||||
if (parsedLength > 0)
|
||||
{
|
||||
otRemoveMacWhitelist(ext_addr.m8);
|
||||
|
||||
errorCode = SendPropertyUpdate(
|
||||
header,
|
||||
SPINEL_CMD_PROP_VALUE_REMOVED,
|
||||
key,
|
||||
value_ptr,
|
||||
value_len
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
} // namespace Thread
|
||||
|
||||
|
||||
|
||||
@@ -286,6 +286,13 @@ private:
|
||||
ThreadError GetPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_CNTR(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_THREAD_RLOC16(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key);
|
||||
ThreadError GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key);
|
||||
|
||||
ThreadError SetPropertyHandler_POWER_STATE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||
uint16_t value_len);
|
||||
@@ -328,6 +335,13 @@ private:
|
||||
ThreadError SetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key,
|
||||
const uint8_t *value_ptr,
|
||||
uint16_t value_len);
|
||||
ThreadError SetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
|
||||
ThreadError SetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
|
||||
ThreadError SetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
|
||||
ThreadError SetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
|
||||
ThreadError SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
|
||||
ThreadError SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
|
||||
|
||||
|
||||
ThreadError SetPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, spinel_prop_key_t key,
|
||||
const uint8_t *value_ptr, uint16_t value_len);
|
||||
@@ -345,6 +359,7 @@ private:
|
||||
ThreadError InsertPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, spinel_prop_key_t key,
|
||||
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, uint16_t value_len);
|
||||
|
||||
ThreadError RemovePropertyHandler_IPV6_ADDRESS_TABLE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
|
||||
uint16_t value_len);
|
||||
@@ -355,6 +370,7 @@ private:
|
||||
ThreadError RemovePropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, spinel_prop_key_t key,
|
||||
const uint8_t *value_ptr,
|
||||
uint16_t value_len);
|
||||
ThreadError RemovePropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
|
||||
|
||||
private:
|
||||
enum
|
||||
|
||||
@@ -1106,6 +1106,30 @@ spinel_prop_key_to_cstr(spinel_prop_key_t prop_key)
|
||||
ret = "SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE";
|
||||
break;
|
||||
|
||||
case SPINEL_PROP_MAC_WHITELIST:
|
||||
ret = "PROP_MAC_WHITELIST";
|
||||
break;
|
||||
|
||||
case SPINEL_PROP_MAC_WHITELIST_ENABLED:
|
||||
ret = "PROP_MAC_WHITELIST_ENABLED";
|
||||
break;
|
||||
|
||||
case SPINEL_PROP_THREAD_MODE:
|
||||
ret = "PROP_THREAD_MODE";
|
||||
break;
|
||||
|
||||
case SPINEL_PROP_THREAD_CHILD_TIMEOUT:
|
||||
ret = "PROP_THREAD_CHILD_TIMEOUT";
|
||||
break;
|
||||
|
||||
case SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD:
|
||||
ret = "PROP_THREAD_ROUTER_UPGRADE_THRESHOLD";
|
||||
break;
|
||||
|
||||
case SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY:
|
||||
ret = "PROP_THREAD_CONTEXT_REUSE_DELAY";
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1195,6 +1219,14 @@ const char *spinel_status_to_cstr(spinel_status_t status)
|
||||
ret = "STATUS_CCA_FAILURE";
|
||||
break;
|
||||
|
||||
case SPINEL_STATUS_ALREADY:
|
||||
ret = "STATUS_ALREADY";
|
||||
break;
|
||||
|
||||
case SPINEL_STATUS_ITEM_NOT_FOUND:
|
||||
ret = "STATUS_ITEM_NOT_FOUND";
|
||||
break;
|
||||
|
||||
case SPINEL_STATUS_RESET_POWER_ON:
|
||||
ret = "STATUS_RESET_POWER_ON";
|
||||
break;
|
||||
|
||||
+21
-3
@@ -99,6 +99,8 @@ typedef enum
|
||||
SPINEL_STATUS_CMD_TOO_BIG = 16, ///< The command was too large to fit in the internal buffer.
|
||||
SPINEL_STATUS_NO_ACK = 17, ///< The packet was not acknowledged.
|
||||
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_ITEM_NOT_FOUND = 20, ///< The given item could not be found.
|
||||
|
||||
SPINEL_STATUS_RESET__BEGIN = 112,
|
||||
SPINEL_STATUS_RESET_POWER_ON = SPINEL_STATUS_RESET__BEGIN + 0,
|
||||
@@ -112,10 +114,12 @@ typedef enum
|
||||
SPINEL_STATUS_RESET_WATCHDOG = SPINEL_STATUS_RESET__BEGIN + 8,
|
||||
SPINEL_STATUS_RESET__END = 128,
|
||||
|
||||
|
||||
SPINEL_STATUS_VENDOR__BEGIN = 15360,
|
||||
SPINEL_STATUS_VENDOR__END = 16384,
|
||||
|
||||
SPINEL_STATUS_STACK_NATIVE__BEGIN = 16384,
|
||||
SPINEL_STATUS_STACK_NATIVE__END = 81920,
|
||||
|
||||
SPINEL_STATUS_EXPERIMENTAL__BEGIN = 2000000,
|
||||
SPINEL_STATUS_EXPERIMENTAL__END = 2097152,
|
||||
} spinel_status_t;
|
||||
@@ -266,6 +270,10 @@ enum
|
||||
SPINEL_CAP_NET_THREAD_1_0 = (SPINEL_CAP_NET__BEGIN + 0),
|
||||
SPINEL_CAP_NET__END = 64,
|
||||
|
||||
SPINEL_CAP_OPENTHREAD__BEGIN = 512,
|
||||
SPINEL_CAP_MAC_WHITELIST = (SPINEL_CAP_OPENTHREAD__BEGIN + 0),
|
||||
SPINEL_CAP_OPENTHREAD__END = 640,
|
||||
|
||||
SPINEL_CAP_NEST__BEGIN = 15296,
|
||||
SPINEL_CAP_NEST_LEGACY_INTERFACE = (SPINEL_CAP_NEST__BEGIN + 0),
|
||||
SPINEL_CAP_NEST_LEGACY_NET_WAKE = (SPINEL_CAP_NEST__BEGIN + 1),
|
||||
@@ -318,9 +326,19 @@ typedef enum
|
||||
|
||||
SPINEL_PROP_MAC_EXT__BEGIN = 0x1300,
|
||||
/// MAC Whitelist
|
||||
/** Format: `A(T(E))`
|
||||
/** Format: `A(T(Ec))`
|
||||
*
|
||||
* Structure Parameters:
|
||||
*
|
||||
* * `E`: EUI64 address of node
|
||||
* * `c`: Optional fixed RSSI. -127 means not set.
|
||||
*/
|
||||
SPINEL_PROP_MAC_WHITELIST = SPINEL_PROP_MAC_EXT__BEGIN + 0, ///< [A(T(E))]
|
||||
SPINEL_PROP_MAC_WHITELIST = SPINEL_PROP_MAC_EXT__BEGIN + 0,
|
||||
|
||||
/// MAC Whitelist Enabled Flag
|
||||
/** Format: `b`
|
||||
*/
|
||||
SPINEL_PROP_MAC_WHITELIST_ENABLED = SPINEL_PROP_MAC_EXT__BEGIN + 1,
|
||||
SPINEL_PROP_MAC_EXT__END = 0x1400,
|
||||
|
||||
SPINEL_PROP_NET__BEGIN = 0x40,
|
||||
|
||||
Reference in New Issue
Block a user